2008-11-02 71 views
1

是否有高级语言(如C)的编译器,它们可以通过指定目标的硬件资源来定位到各种体系结构?任意体系结构的可编译目标编译器

我想知道是否有编译器可以通过指定诸如处理器的可用寄存器和指令集(即每个指令如何改变处理器的状态)等功能来针对体系结构,以及体系结构的内存布局。

我知道编译器如gcc可以针对多个构架,但我想知道是否有编译器可以通过换出配置文件来编译新体系结构,以便定位新的建筑。

回答

1

AFAIK,gcc的确如此工作。在gcc文档中检查"Machine Descriptions"。当然,创建这些.md文件是一项重大的编程工作。

0

前段时间我听了一个播客的讲座,讲述了一个用Java编写的(主要是)Java虚拟机,它使用某种平台定义文件将多个不同的平台作为目标。我认为我正在听Java Posse和我认为它可能是Maxine Research Virtual Machine

3

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

话虽如此,许多处理器都有许多共同的特性需要处理。所以你会发现大多数现代编译器在配置文件中定义了诸如指令编码,寄存器文件(和别名)以及各种其他小技巧,然后用它们来生成与手写位集成的编译器源的一部分。

综观LLVM X86 backenda显著部分(〜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