c++ 如何编写和运行LLVM X86机器函数传递2022

inkz8wg9  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(147)

我一直在尝试在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
非常感谢你的帮助!

jhkqcmku

jhkqcmku1#

我在X86TargetMachine.cpp中检查了一个类似的传递,例如X86 ReturnThunks传递。使用grep查找所有用法,它包括:

  • ./lib/Target/X86/CMakeLists.txt,添加到cmake编译中
  • 在X86文件夹中传递源文件
  1. X86.h,2个部件:
    1.声明函数传递:函数传递 * 创建X86返回ThunksPass();
    1.使用注册表声明init:无效初始化X86返回ThunksPass(传递注册表&);
  2. X86目标机器. cpp,2个部分:
    1.初始化到注册表:初始化X86返回ThunksPass(PR);
    1.在后端编译中使用它:添加通行证(创建X86返回通行证());
    看起来你添加了通行证,但你还需要注册它。

相关问题