2016-08-05 11 views
1

私は今、LLVMを学んでいます。私はInstruction :: user_back()と混同しています。 「 - 私たちは、命令が他の命令によってのみを使用することができることを知っているように、値で定義されたメソッドを特殊user_backを」しかし、私はまだそれが返すかわからない使い方* LLVM ::命令:: user_back()

ドキュメントは述べています。

私はそれについての詳細な情報を見つけることができませんでした。私は命令uのために、もしあなたがi-> users()であれば、u-> user_back()はiを返します。私は私の推測をチェックしようとしたとき、私は、次のランタイムエラーに遭遇:

opt: /usr/local/include/llvm/IR/Value.h:144: UseT& llvm::Value::use_iterator_impl<UseT>::operator*() const [with UseT = llvm::Use]: Assertion `U && "Cannot dereference end iterator!"' failed. 

私のパスはこのようなものです:

for (auto &B : F) { 
    for (auto &I : B) { 
     if (auto *target = dyn_cast<AllocaInst>(&I)) {   
      for(auto it : target->users()){ 
       if (Instruction *I = dyn_cast<Instruction>(it)){ 
        Instruction *temp = I->user_back(); 
        errs() << "user_back"<< *temp <<"\n"; 
        //Aborted (core dumped)    
       }  
      } 
     }  
    } 
} 

私の最初の質問は、私は命令*のLLVMの使用を誤解するかどうかです。 :命令:: user_back()、それの正しい意味は何ですか? Uが命令にI->ユーザー()である場合

私の2番目の質問は、命令Uのために、そのユーザUが取得する方法がありますか?この場合、私からUを取得する方法がありますか? U-> user_back()で返されますか?

多くのありがとうございます。:)

答えて

1

あなたのuser_backの理解は、まさに後ろです。 V.そうにuser_backがリストの最後、このようなユーザーで使用している他の値 -

は、それぞれの値Vは、ユーザーのセットを持っています。あなたの指示uは明らかにユーザーを持っていないので、あなたはアサートを得ています。まずuser_emptyを確認してください。

あなたは、命令Uを与え、Uによって使用される命令を見つけます。それを得るには、Uのオペランドを反復する必要があります。各オペランドOを使用してO.get()定数、命令または値のいずれかの種類の可能性が使用される値を、取得しますです。 LLVM IRはSSAにあるため、各オペランドにこのような値が1回だけ存在します。

要するに、2番目の質問に対する答えは、「Uのオペランドを反復し、それらの1つがIになります。