Как зарегистрировать новый бэкэнд LLVM? - PullRequest
14 голосов
/ 13 октября 2010

Я разрабатываю очень простой новый бэкэнд 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:

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

Ответы [ 2 ]

4 голосов
/ 21 ноября 2010

Первый шаблонный параметр по умолчанию для 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.

0 голосов
/ 27 октября 2016

Вам необходимо отредактировать не менее 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

...