Я разрабатываю базовый новый LLVM-сервер для RISC-машины (названный Risco), основанный на существующем бэкэнде Sparc и this tutorial. Чтобы зарегистрировать бэкэнд, я использовал следующее.Как зарегистрировать новый LLVM-сервер?
В RiscoTargetMachine.cpp:
extern "C" void LLVMInitializeRiscoTarget() { // Register the target. RegisterTargetMachine<RiscoSimulatorTargetMachine> X(TheRiscoTarget); RegisterAsmInfo<RiscoMCAsmInfo> Y(TheRiscoTarget); }
В Risco.td:
def : Processor<"simulator", NoItineraries, [FeatureA]>; def Risco : Target { // Pull in Instruction Info: let InstructionSet = RiscoInstrInfo; }
В TargetInfo/RiscoTargetInfo.cpp:
Target llvm::TheRiscoTarget; extern "C" void LLVMInitializeRiscoTargetInfo() { RegisterTarget<> X(TheRiscoTarget, "risco", "Risco"); }
В верхний уровень LLVM скрипта конфигурации:
# 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" ;;
После сборки, llc -version
не показывает новую цель. Даже llc -march=risco test.ll
говорит, что это недопустимая цель. Что мне не хватает?
PS: В настоящее время я включаю новую цель как папку внутри llvm/lib/Target. Как я могу изменить это, чтобы я мог создать цель отдельно и загружать ее динамически с помощью llc -load
?
К сожалению, мой опыт работы с LLVM состоял в том, что, хотя документация по doxygen проекта обновлена, ее учебники не являются. Даже попытка пройти учебник по сборке вызывает разочарование. – Zeke