2010-10-13 13 views
13

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?

+3

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

Respuesta

4

El default first template parameter para RegisterTarget es Triple::InvalidArch. Prueba esto:

extern "C" void LLVMInitializeRiscoTargetInfo() { 
    RegisterTarget<Triple::UnknownArch> X(TheRiscoTarget, "risco", "Risco"); 
} 

También podría ser necesario para registrar una impresora de ensamblaje para su back-end en RiscoAsmPrinter.cpp:

extern "C" void LLVMInitializeRiscoAsmPrinter() { 
    RegisterAsmPrinter<RiscoAsmPrinter> X(TheRiscoTarget); 
} 

No estoy muy seguro de lo que quiere decir con el último bit. My Makefile tiene LOADABLE_MODULE=1 y crea el destino como un objeto compartido en la carpeta lib. Para ver el objetivo de Risco en la lista de objetivos registrados, ejecutaría algo como ./bin/llc -load ./lib/libLLVMRisco.so -version suponiendo que está en Linux.

0

Tiene que editar al menos 16 archivos en el directorio raíz de LLVM:

1) En CMakeLists.txt añadir a nuestro objetivo: Conjunto (LLVM_ALL_TARGETS AArch64 ARM ...)

2) Añadir su objetivo a Triple.h

3) Añadir HI/LO para llvm_root_dir/include/llvm/MC/MCExpr.h

...

16) ...

Los pasos completos se pueden encontrar en LLVMCookbook. Páginas 228 a 238. Lo siento, no pude copiar/pegar 10 páginas del tutorial aquí.

Después de editar todos los 16 archivos, a continuación, construir el LLVM usando CMake: $ cmake ~/llvm/src/-DLLVM_TARGETS_TO_BUILD = YourTargetName y luego hacer $

Si tienes la suerte a continuación, su construcción será un éxito, y puede ver su objetivo agregado a las herramientas de llc emitiendo: $ llc -version