You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写LLVM X86 Machine Function Pass无输出,求排查及最新指南

LLVM MachineFunctionPass无输出问题排查及后端Pass编写求助

我尝试编写一个LLVM的MachineFunctionPass,目标是输出每条LLVM IR指令对应的汇编代码。

我参考过旧的邮件列表线程和第三方教程,但都没能成功运行——没有任何输出,而且部分教程里的头文件需要修改才能编译。

我先写了一个打印"hello"的测试Pass,代码如下(文件路径llvm/lib/Target/X86/X86EmitMap.cpp):

#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;
}

我的操作流程如下:

  • 创建上述文件并写入代码
  • 在void X86PassConfig::addPreEmitPass()中添加addPass(createX86EmitMap());
  • 将X86EmitMap.cpp添加到lib/Target/X86目录下的CMakeLists.txt
  • 在X86.h中添加FunctionPass *createX86EmitMap();声明
  • 编译并运行llc,预期会打印"hello"

但运行后没有任何输出,请问我哪里出错了?另外能否提供一份编写LLVM后端Pass的最新指南?我查阅了LLVM官方的后端编写文档和代码生成文档,也没找到解决方案。


内容的提问来源于stack exchange,提问作者Daniel Bohen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:15:31