我正在基于现有的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
动态加载它?
答案 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