Estoy desarrollando un nuevo backend LLVM muy básico para una máquina RISC (llamada Risco), basada en el backend existente Sparc y this tutorial. Para registrar el back-end, he usado lo siguiente.¿Cómo registrar un nuevo backend LLVM?
En RiscoTargetMachine.cpp:
extern "C" void LLVMInitializeRiscoTarget() { // Register the target. RegisterTargetMachine<RiscoSimulatorTargetMachine> X(TheRiscoTarget); RegisterAsmInfo<RiscoMCAsmInfo> Y(TheRiscoTarget); }
En Risco.td:
def : Processor<"simulator", NoItineraries, [FeatureA]>; def Risco : Target { // Pull in Instruction Info: let InstructionSet = RiscoInstrInfo; }
En TargetInfo/RiscoTargetInfo.cpp:
Target llvm::TheRiscoTarget; extern "C" void LLVMInitializeRiscoTargetInfo() { RegisterTarget<> X(TheRiscoTarget, "risco", "Risco"); }
En el nivel superior LLVM script de configuración:
# Added Risco to the TARGETS_TO_BUILD variable at line 4965 (from svn trunk): all) TARGETS_TO_BUILD="X86 Sparc PowerPC Alpha ARM Mips CellSPU PIC16 XCore MSP430 SystemZ Blackfin CBackend CppBackend MBlaze PTX Risco" ;;
Después de acumulación, llc -version
no muestra el nuevo objetivo. Incluso llc -march=risco test.ll
dice que es un objetivo no válido. ¿Qué me estoy perdiendo?
PD: Actualmente, incluyo el nuevo destino como una carpeta dentro de llvm/lib/Target. ¿Cómo puedo cambiar eso para poder construir el objetivo por separado y cargarlo dinámico con llc -load
?
Desafortunadamente, mi experiencia con LLVM ha sido que, aunque la documentación doxygen del proyecto está actualizada, sus tutoriales no lo son. Incluso tratar de leer el tutorial de compilación es frustrante. – Zeke