2010-10-13 26 views
13

Pracuję nad bardzo prostym backendem LLVM dla maszyny RISC (o nazwie Risco), opartej na istniejącym zapleczu Sparca i this tutorial. Aby zarejestrować backend, użyłem następujących.Jak zarejestrować nowy backend LLVM?

  • Na RiscoTargetMachine.cpp:

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

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

    Target llvm::TheRiscoTarget; 
    
    extern "C" void LLVMInitializeRiscoTargetInfo() { 
         RegisterTarget<> X(TheRiscoTarget, "risco", "Risco"); 
    } 
    
  • Na górny poziom LLVM skrypt configure:

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

Po kompilacji, llc -version nie pokazuje nowy cel. Nawet llc -march=risco test.ll mówi, że jest to nieprawidłowy cel. czego mi brakuje?

PS: Obecnie uwzględniam nowy cel jako folder w llvm/lib/Target. Jak mogę to zmienić, aby osobno zbudować cel i załadować go dynamicznie za pomocą llc -load?

+3

Niestety, moje doświadczenia z LLVM polegały na tym, że podczas gdy dokumentacja doxygen projektu jest aktualna, jego tutoriale nie są. Nawet próba przejścia przez samouczek kompilacyjny jest frustrująca. – Zeke

Odpowiedz

4

Numer default first template parameter dla RegisterTarget to Triple::InvalidArch. Spróbuj tego:

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

Można również trzeba zarejestrować drukarkę montażową dla backend w RiscoAsmPrinter.cpp:

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

Nie jestem pewien, co masz na myśli przez ostatniego kawałka. Mój plik Makefile ma LOADABLE_MODULE=1 i buduje cel jako obiekt udostępniony w folderze lib. Aby zobaczyć cel Risco na liście zarejestrowanych celów, uruchomiłbym coś w rodzaju ./bin/llc -load ./lib/libLLVMRisco.so -version zakładając, że jesteś na Linuksie.

0

trzeba zmieniać co najmniej 16 plików w katalogu głównym LLVM:

1) CMakeLists.txt dodać nasz cel: Set (LLVM_ALL_TARGETS AArch64 ARM ...)

2) Dodaj Twój cel do Triple.h

3) Dodaj HI/LO do llvm_root_dir/include/LLVM/MC/MCExpr.h

...

16) ...

Kompletne czynności można znaleźć w LLVMCookbook. Strona 228 do 238. Niestety nie mogłem skopiować/wkleić 10 stron tutoriala tutaj.

Po edycji wszystkie te 16 plików, a następnie zbudować LLVM użyciu cmake: $ cmake ~/LLVM/src/-DLLVM_TARGETS_TO_BUILD = YourTargetName a następnie $ uczynić

Jeśli masz szczęście wystarczy wówczas budowa zakończy się sukcesem, i możesz zobaczyć swój cel dodany do narzędzi llc, wydając: $ llc -version