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
?
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