保存对LLVM BasicBlock Pass的更改

时间:2014-02-20 02:46:23

标签: llvm

我成功地将一些元数据添加到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;
}

1 个答案:

答案 0 :(得分:2)

你写道:

  

数据已成功添加到我的字节代码中,即元数据显示在屏幕上。

     

我的问题是我的原始文件中没有更新这些更改。

在您的代码段中,您不会在任何地方编写已修改的模块,只需将其打印到输出中即可。您可以使用以下方式编写它:

std::string ErrorInfo;
raw_fd_ostream OS(argv[1], ErrorInfo, sys::fs::F_Binary);
if (ErrorInfo.empty()) WriteBitcodeToFile(*Mod, OS);