llvm元数据转换通过

时间:2013-02-08 11:03:55

标签: llvm

我有两个通行证的工具链。第一个是转换过程,它应该将元数据添加到某些结构(指令/变量),第二个过程是需要访问添加的元数据的分析过程。问题在于我添加了元数据转换通道。可能存在两个问题(或两者):

首先,也许我没有正确添加元数据。

    LLVMContext& C = myInstruction->getContext();
    MDNode* N = MDNode::get(C, MDString::get(C, "add info"));
    myInstruction->setMetadata("important", N);
    errs()<<"\n"<<cast<MDString>(myInstruction->getMetadata("important")->getOperand(0))->getString();

但是,在运行通行证后会打印“添加信息”。

其次,似乎转换不会应用于目标程序的.bc。 Test1.bc(clean)和Test2.bc(应用转换)是相同的。我只是

using namespace llvm;

namespace {
  struct metadata : public FunctionPass {
    const Function *F;
    static char ID; // Pass identifcation, replacement for typeid
    metadata() : FunctionPass(ID) {
      //initializeMemDepPrinterPass(*PassRegistry::getPassRegistry());
    }
    virtual bool runOnFunction(Function &F);
    virtual void getAnalysisUsage(AnalysisUsage &AU) const {
      AU.setPreservesAll();
    }

   // virtual void releaseMemory() {
    //  F = 0;
   // }
  };
}

char metadata::ID = 0;

static RegisterPass<metadata> X("my-metadata", "Adding metadata", false, true);

在转换过程开始时。请告诉我如何持久添加元数据。

感谢您的回答!

1 个答案:

答案 0 :(得分:2)

传递之间的交互问题(由Oak的注释引起)尽管如此,编写通过添加元数据实际修改模块的传递并不难。这是一个(基本块,为了更容易编写)传递,它为它遇到的每条指令添加相同的元数据。如果在运行此过程之前和之后转储模块,您将看到模块确实已被修改:

class MyBBPass : public BasicBlockPass {
public:
    static char ID;

    MyBBPass()
        : BasicBlockPass(ID)
    {}

    virtual bool runOnBasicBlock(BasicBlock &BB) {
        Value *A[] = {MDString::get(getGlobalContext(), "thing")};
        MDNode *Node = MDNode::get(getGlobalContext(), A);
        for (BasicBlock::iterator ii = BB.begin(), ii_e = BB.end();
             ii != ii_e; ++ii) {
            ii->setMetadata("md", Node);
        }

        return true;
    }
};

char MyBBPass::ID = 0;

请注意,run***方法返回true以向传递管理器发出基本块确实被修改的信号。