我成功地将一些元数据添加到LLVM中的基本块。然后我使用Mod->dump()
在屏幕上显示它。
数据已成功添加到我的字节代码中,即元数据显示在屏幕上。
我的问题是我的原始文件中没有更新这些更改。
我该如何解决这个问题?
class BasicBlock1 : public BasicBlockPass {
public:
BasicBlock1()
: BasicBlockPass(ID)
{}
virtual bool runOnBasicBlock(BasicBlock &BB) {
Value *A[] = {MDString::get(getGlobalContext(), "mymetadata")};
MDNode *Node = MDNode::get(getGlobalContext(), A);
for (BasicBlock::iterator ii = BB.begin(), ii_e = BB.end();
ii != ii_e; ++ii) {
ii->setMetadata("XXX", Node);
}
return true;
}
static char ID;
};
char FunctionPrint::ID = 0;
char BasicBlock1::ID =0;
int main(int argc, char **argv) {
Module *Mod = ParseIRFile(argv[1], Err, getGlobalContext());
PM.add(new BasicBlock1());
PM.run(*Mod);
Mod->dump();
return 0;
}
答案 0 :(得分:2)
你写道:
数据已成功添加到我的字节代码中,即元数据显示在屏幕上。
我的问题是我的原始文件中没有更新这些更改。
在您的代码段中,您不会在任何地方编写已修改的模块,只需将其打印到输出中即可。您可以使用以下方式编写它:
std::string ErrorInfo;
raw_fd_ostream OS(argv[1], ErrorInfo, sys::fs::F_Binary);
if (ErrorInfo.empty()) WriteBitcodeToFile(*Mod, OS);