我一直在尝试在LLVM中编写一个machineFunctionPass来发出与每个LLVMIR指令对应的程序集。
我试过遵循this mailing list thread,但我一直无法让它工作,什么也没有输出。我也试过遵循this tutorial,但什么也没有输出,一些头文件不得不改变,甚至编译。
我已经编写了一个在X86EmitMap.cpp
中打印hello的测试遍
#include "llvm/Pass.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/Target/TargetIntrinsicInfo.h"
#include "llvm/Target/TargetMachine.h"
#include "llvm/Target/TargetOptions.h"
using namespace llvm;
namespace llvm {
FunctionPass *createX86EmitMap();
void initializeX86EmitMapPass(PassRegistry &);
} // namespace llvm
namespace {
struct X86EmitMap : public MachineFunctionPass {
static char ID; // Pass identification, replacement for typeid
X86EmitMap() : MachineFunctionPass(ID) {
initializeX86EmitMapPass(*PassRegistry::getPassRegistry());
}
StringRef getPassName() const override { return "emit map pass"; }
virtual bool runOnMachineFunction(MachineFunction &MF) override;
};
} // namespace
char X86EmitMap::ID = 0;
INITIALIZE_PASS_BEGIN(X86EmitMap, "emit map", "emit map pass", false, false)
INITIALIZE_PASS_END(X86EmitMap, "emit map", "emit map pass", false, false)
FunctionPass *llvm::createX86EmitMap() { return new X86EmitMap(); }
bool X86EmitMap::runOnMachineFunction(MachineFunction &MF) {
errs() << "\n\nhello\n\n ";
return false;
}
我对这个过程的理解是:
1.创建文件并将代码添加到llvm/lib/Target/X86/X86EmitMap.cpp
1.将addPass(createX86EmitMap());
添加到void X86PassConfig::addPreEmitPass()
1.将X86EmitMap.cpp
添加到lib/Target/X86
中的CMakeLists.txt
1.将FunctionPass *createX86EmitMap()
添加到X86.h
1.构建并运行llc,它应该打印“hello”
有谁能告诉我这里哪里出错了吗?或者你能告诉我如何编写一个最新的后端传递的指南吗?我还没有能够从这些链接中弄清楚:
https://llvm.org/docs/WritingAnLLVMBackend.html
https://llvm.org/docs/CodeGenerator.html
非常感谢你的帮助!
1条答案
按热度按时间jhkqcmku1#
我在X86TargetMachine.cpp中检查了一个类似的传递,例如X86 ReturnThunks传递。使用grep查找所有用法,它包括:
1.声明函数传递:函数传递 * 创建X86返回ThunksPass();
1.使用注册表声明init:无效初始化X86返回ThunksPass(传递注册表&);
1.初始化到注册表:初始化X86返回ThunksPass(PR);
1.在后端编译中使用它:添加通行证(创建X86返回通行证());
看起来你添加了通行证,但你还需要注册它。