我有两个通行证的工具链。第一个是转换过程,它应该将元数据添加到某些结构(指令/变量),第二个过程是需要访问添加的元数据的分析过程。问题在于我添加了元数据转换通道。可能存在两个问题(或两者):
首先,也许我没有正确添加元数据。
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);
在转换过程开始时。请告诉我如何持久添加元数据。
感谢您的回答!
答案 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
以向传递管理器发出基本块确实被修改的信号。