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