Как зарегистрировать новый LLVM-сервер?
Я разрабатываю базовый новый LLVM-сервер для RISC-машины (названный Risco) на основе существующего бэкэнда Sparc и этот учебник, Чтобы зарегистрировать бэкэнд, я использовал следующее.
-
В 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 настройте script:
# 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
?
Ответы
Ответ 1
параметр первого шаблона по умолчанию для RegisterTarget
- Triple::InvalidArch
. Попробуйте следующее:
extern "C" void LLVMInitializeRiscoTargetInfo() {
RegisterTarget<Triple::UnknownArch> X(TheRiscoTarget, "risco", "Risco");
}
Вам также может потребоваться зарегистрировать ассемблерный принтер для вашего бэкэнда в RiscoAsmPrinter.cpp:
extern "C" void LLVMInitializeRiscoAsmPrinter() {
RegisterAsmPrinter<RiscoAsmPrinter> X(TheRiscoTarget);
}
Я не совсем понимаю, что вы подразумеваете под последним бит. Мой файл Makefile имеет LOADABLE_MODULE=1
и создает цель как общий объект в папке lib. Чтобы увидеть цель Risco в списке зарегистрированных целей, я бы запускал что-то вроде ./bin/llc -load ./lib/libLLVMRisco.so -version
, предполагая, что вы находитесь в Linux.
Ответ 2
Вам нужно отредактировать не менее 16 файлов в корневом каталоге LLVM:
1) В CMakeLists.txt добавьте нашу цель: set (LLVM_ALL_TARGETS AArch64 ARM...)
2) Добавьте свою цель в Triple.h
3) Добавить HI/LO в llvm_root_dir/include/llvm/MC/MCExpr.h
...
16)...
Полные шаги можно найти в LLVMCookbook. Страница 228 - 238. Извините, я не мог скопировать/вставить 10 страниц учебника здесь.
После редактирования всех этих 16 файлов, затем создайте LLVM с помощью cmake: $cmake ~/llvm/src/-DLLVM_TARGETS_TO_BUILD = YourTargetName, а затем $make
Если вам повезет, ваша сборка будет успешной, и вы увидите, что ваша цель добавлена в инструменты llc, выпуская: $llc -version