Фундаментальная проблема заключается в том, что характеристики различных процессоров не особенно одинаковы. Посмотрите на связывание на 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