我已阅读此页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);
~
答案 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。