-1

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

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

    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 (transformation applied) 是一样的。我只有

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);

在我的转型初期。请告诉我如何持久添加元数据。

谢谢您的回答 !

4

1 回答 1

2

尽管存在通道之间的交互问题(正如 Oak 的评论所提出的),但编写一个通过添加元数据来实际修改模块的通道并不难。这是一个(基本块,为了更容易编写)将相同的元数据添加到它遇到的每条指令的过程。如果在运行此 pass 之前和之后转储模块,您将看到模块确实被修改:

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以向通道管理器发出基本块确实已修改的信号。

于 2013-02-10T00:13:45.177 回答