【问题标题】:How to make a pass that can read LLVM IR and parse it如何制作一个可以读取 LLVM IR 并解析它的通行证
【发布时间】:2013-05-27 14:24:59
【问题描述】:

我已经阅读了这个页面,http://llvm.org/docs/WritingAnLLVMPass.html

我可以完全做Hello.so的例子。

现在我只想制作一个可以由 opt 调用的 .so 文件,并将我的 IR 文件名作为输入参数读取。在我提交之后,它会输出文件名。

我之前尝试过几种方法,但我仍然不知道该怎么做......

我希望我能做到这样。

opt -load ../Debug+Asserts/lib/xxxx.so -flag /dev/null

当我按下 ENTER 时,它会输出文件名 -> "llvm.ll"

谁能帮我写这个简单的程序,我打算优化llvm IR作为我的学期项目,现在我卡在这里...帮助我,谢谢~


你能详细告诉我代码吗,这对我不起作用

using namespace llvm;

namespace {
  struct Hello : public ModulePass {
    static char ID;
    Hello() : ModulePass(ID) {}

   virtual  bool runOnModule(Module &M) {
       dbgs() << M.getModuleIdentifier() << "\n";
      return false;
     }
  };
}

char Hello::ID = 0;
static RegisterPass<Hello> X("hello", "Hello World Pass", false, false);
~

【问题讨论】:

  • 比 LLVM 优化得更远?这很难......
  • 我要优化分支分歧问题(还有一些我们可以做的,也许哈哈

标签: optimization llvm clang


【解决方案1】:

您的问题实际上可以简化为“如何从 LLVM 通行证中访问当前 .ll 文件的名称”。您不需要“解析 LLVM IR”或类似的东西 - 当运行 LLVM 通道时,它已经过了解析阶段。

无论如何,我不知道有什么可靠的方法可以从 LLVM 模块中获取文件名,但是您可以在准备 .ll 文件时对该信息进行编码。例如,通过; ModuleID = 'llvm.ll'将模块id设置为文件名,然后通过writing a module pass检索并调用getModuleIdentifier获取字符串。然后你可以把它打印出来,例如

bool runOnModule(Module& M) {
  dbgs() << M.getModuleIdentifier() << "\n";
  return false;
}

或者,使用metadata

【讨论】:

  • 我还有一个问题,有functionPass和ModulePass,这两个是支持llvm IR的“ll”类型,还是只支持“bc”类型。
  • @IanTsai 您是否将模块 id 设置为某个字符串,然后仍然得到“”?
  • @IanTsai 和关于 .bc 和 .ll 是一回事:参见我的 thisthis 相关答案
猜你喜欢
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-17
  • 2018-02-09
相关资源
最近更新 更多