Как зарегистрировать новый 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