如何制作一个可以读取LLVM IR并解析它的传递

时间:2013-05-27 14:24:59

标签: optimization llvm clang

我已阅读此页http://llvm.org/docs/WritingAnLLVMPass.html

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

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

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

我希望我能这样做。

opt -load ../Debug+Asserts/lib/xxxx.so -flag< llvm.ll>的/ 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);
~

1 个答案:

答案 0 :(得分:2)

您的问题可以简化为“我如何从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