2010-10-13 13 views
13

Sto sviluppando un backend LLVM molto semplice per una macchina RISC (denominato Risco), basato sul backend Sparc esistente e this tutorial. Per registrare il back-end, ho usato quanto segue.Come registrare un nuovo back-end LLVM?

  • Al RiscoTargetMachine.cpp:

    extern "C" void LLVMInitializeRiscoTarget() 
    { 
        // Register the target. 
        RegisterTargetMachine<RiscoSimulatorTargetMachine> X(TheRiscoTarget); 
        RegisterAsmInfo<RiscoMCAsmInfo> Y(TheRiscoTarget); 
    } 
    
  • Al Risco.td:

    def : Processor<"simulator", NoItineraries, [FeatureA]>; 
    
    def Risco : Target { 
         // Pull in Instruction Info: 
         let InstructionSet = RiscoInstrInfo; 
    } 
    
  • A TargetInfo/RiscoTargetInfo.cpp:

    Target llvm::TheRiscoTarget; 
    
    extern "C" void LLVMInitializeRiscoTargetInfo() { 
         RegisterTarget<> X(TheRiscoTarget, "risco", "Risco"); 
    } 
    
  • A alto livello di LLVM script di configurazione:

    # 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" ;; 
    

dopo la generazione, llc -version non mostra il nuovo obiettivo. Anche llc -march=risco test.ll dice che è un bersaglio non valido. Cosa mi manca?

PS: Attualmente sto includendo il nuovo obiettivo come cartella all'interno di llvm/lib/Target. Come posso cambiarlo in modo da poter creare il target separatamente e caricarlo dinamico con llc -load?

+3

Sfortunatamente, la mia esperienza con LLVM è stata che mentre la documentazione di doxygen del progetto è aggiornata, i suoi tutorial non lo sono. Anche provare a seguire il tutorial di compilazione è frustrante. – Zeke

risposta

4

Il default first template parameter per RegisterTarget è Triple::InvalidArch. Prova questo:

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

Potrebbe anche essere necessario per registrare una stampante assembly per il back-end in RiscoAsmPrinter.cpp:

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

Io non sono molto sicuro di cosa si intende per l'ultimo bit. My Makefile ha LOADABLE_MODULE=1 e crea il target come oggetto condiviso nella cartella lib. Per vedere il target Risco nell'elenco di target registrati, eseguirò qualcosa come ./bin/llc -load ./lib/libLLVMRisco.so -version partendo dal presupposto che tu sia su Linux.

0

È necessario modificare almeno 16 file nella directory principale di LLVM:

1) In CMakeLists.txt aggiungere il nostro obiettivo di: set (LLVM_ALL_TARGETS AArch64 ARM ...)

2) Aggiungere il vostro obiettivo di Triple.h

3) Aggiungere HI/LO per llvm_root_dir/include/LLVM/MC/MCExpr.h

...

16) ...

I passaggi completi sono disponibili in LLVMCookbook. Pagina 228 a 238. Mi dispiace non ho potuto copiare/incollare 10 pagine di tutorial qui.

Dopo aver modificato tutti i 16 file, quindi costruire la LLVM con cmake: $ cmake ~/LLVM/src/-DLLVM_TARGETS_TO_BUILD = YourTargetName e poi $ make

Se si è fortunati abbastanza allora la build avrà successo, e puoi vedere il tuo obiettivo aggiunto agli strumenti di gioco di studio rilasciando: $ llc -version