-1

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

トランスフォーメーションパスの開始時。メタデータを永続的に追加する方法を教えてください。

ご回答ありがとうございます!

4

1 に答える 1

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

于 2013-02-10T00:13:45.177 に答える