2つのパスのツールチェーンがあります。最初のパスは、いくつかの構造(命令/変数)にメタデータを追加する必要がある変換パスであり、2番目のパスは、追加されたメタデータにアクセスする必要がある分析パスです。問題は、メタデータ変換パスを追加することです。2つの問題(または両方)が発生する可能性があります。
まず、メタデータを正しく追加していない可能性があります。
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(クリーン)と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);
トランスフォーメーションパスの開始時。メタデータを永続的に追加する方法を教えてください。
ご回答ありがとうございます!