任意架构的可定向编译器

时间:2008-11-02 04:00:27

标签: compiler-construction

是否有高级语言(如C)的编译器可以通过指定目标的硬件资源来针对各种体系结构?

我想知道是否存在可以通过指定诸如处理器的可用寄存器和指令集(即每个指令如何改变处理器的状态)以及架构的存储器布局等特征来​​编程体系结构的编译器。

我知道像gcc这样的编译器可以针对多个archtectures,但我想知道是否有编译器可以通过交换配置文件来编译新架构,以便瞄准新架构。

3 个答案:

答案 0 :(得分:3)

根本问题是各种处理器的功能并不是特别统一。查看IA64上的捆绑,ARM / Thumb上的双指令集,SPARC上的寄存器窗口,PPC上的计数寄存器。甚至可能在多个体系结构上的功能(如ARM和Itanium上的预测)也可能完全不同,您不会共享实现。为了编写一个好的编译器,这些都是你需要理解的非常独特的功能,它们不仅仅是设计者选择的不同配置。鉴于它们往往是给定处理器的唯一事实,你在编译器中启用它们的任何切换实际上都是编译器中的特定代码,以支持该处理器,将其隐藏在一些配置选项后面以允许您启用它只是对此的混淆。

话虽如此,许多处理器必须处理许多常见功能。因此,您会发现大多数现代编译器定义了指令编码,寄存器文件(和别名)以及配置文件中的各种其他花絮,然后它们用于生成与手写位集成的编译器源的一部分。

查看LLVM X86后端的重要部分(~30%)是.td(目标定义)文件

Phoenix:X86 louis$ ls -al | grep cpp 
-rw-r--r--   1 louis  louis    27627 Nov  1 03:32 X86CodeEmitter.cpp
-rw-r--r--   1 louis  louis      661 Oct 29 18:56 X86ELFWriterInfo.cpp
-rw-r--r--   1 louis  louis    46558 Oct 29 18:56 X86FastISel.cpp
-rw-r--r--   1 louis  louis    43660 Oct 29 18:56 X86FloatingPoint.cpp
-rw-r--r--   1 louis  louis    59915 Oct 29 18:56 X86ISelDAGToDAG.cpp
-rw-r--r--   1 louis  louis   312709 Nov  1 03:32 X86ISelLowering.cpp
-rw-r--r--   1 louis  louis   109229 Oct 29 18:56 X86InstrInfo.cpp
-rw-r--r--   1 louis  louis    17396 Oct 29 18:56 X86JITInfo.cpp
-rw-r--r--   1 louis  louis    44111 Nov  1 03:32 X86RegisterInfo.cpp
-rw-r--r--   1 louis  louis    10369 Oct 29 18:56 X86Subtarget.cpp
-rw-r--r--   1 louis  louis    15265 Oct 29 18:56 X86TargetAsmInfo.cpp
-rw-r--r--   1 louis  louis     9365 Oct 29 18:56 X86TargetMachine.cpp
Phoenix:X86 louis$ ls -al | grep td  
-rw-r--r--   1 louis  louis     6870 Oct 29 18:56 X86.td
-rw-r--r--   1 louis  louis    13480 Oct 29 18:56 X86CallingConv.td
-rw-r--r--   1 louis  louis    77361 Nov  1 03:32 X86Instr64bit.td
-rw-r--r--   1 louis  louis    31517 Oct 29 18:56 X86InstrFPStack.td
-rw-r--r--   1 louis  louis    11690 Oct 29 18:56 X86InstrFormats.td
-rw-r--r--   1 louis  louis   156188 Oct 29 18:56 X86InstrInfo.td
-rw-r--r--   1 louis  louis    32971 Oct 29 18:56 X86InstrMMX.td
-rw-r--r--   1 louis  louis   183502 Oct 29 18:56 X86InstrSSE.td
-rw-r--r--   1 louis  louis    23653 Nov  1 03:32 X86RegisterInfo.td

答案 1 :(得分:1)

AFAIK,gcc就是这样工作的。检查gcc文档中的"Machine Descriptions"。当然,创建这些.md文件是一项重要的编程工作。

答案 2 :(得分:0)

前一段时间我正在收听一个播客,其中谈到了一个用Java编写的Java虚拟机,它主要针对多个不同的平台,使用某种平台定义文件。我认为我正在听Java Posse而我认为它可能是Maxine Research Virtual Machine