我有一个两遍的工具链。第一个是转换过程,应将元数据添加到某些结构(指令/变量),第二个过程是分析过程,需要访问添加的元数据。问题在于我添加元数据转换传递。可能有两个问题(或两者都有):
首先,也许我没有正确添加元数据。
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);
在我的转型初期。请告诉我如何持久添加元数据。
谢谢您的回答 !