如何注册新的LLVM后端?

时间:2010-10-13 17:43:34

标签: build-process llvm backend

我正在基于现有的Sparc后端和this tutorial为RISC机器(名为 Risco )开发一个非常基本的新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动态加载它?

2 个答案:

答案 0 :(得分:4)

RegisterTarget的{​​{3}}为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目标,假设您使用的是Linux,我会运行类似./bin/llc -load ./lib/libLLVMRisco.so -version的内容。

答案 1 :(得分:0)

您必须在LLVM的根目录中编辑至少16个文件:

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中找到。请注意,我无法在此处复制/粘贴10页教程。

编辑完所有16个文件后,使用cmake构建LLVM:$ cmake~ / llvm / src / -DLLVM_TARGETS_TO_BUILD = YourTargetName然后$ make

如果您足够幸运,那么您的构建将会成功,并且您可以通过发出以下命令将目标添加到llc工具:$ llc -version