2016-08-05 2 views
1

지금 llvm을 배우고 있습니다. 나는 Instruction :: user_back()과 혼동을 느낀다.명령어 사용 * llvm :: Instruction :: user_back()

docs는 "user_back - 다른 명령에 의해서만 명령을 사용할 수 있다는 것을 알고 있으므로 Value에 정의 된 메서드를 특수화합니다."라고 말했지만 여전히 반환 할 내용을 알지 못합니다.

더 자세한 정보를 찾을 수 없습니다. 나는 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가 Instruction I-> users()에 있으면 사용자 U를 얻는 방법이 있습니까? 이 경우, 제가 제발 내가 얻을 수있는 방법이 있습니까? U-> user_back() 반환할까요?

미리 감사드립니다.

답변

1

귀하의 user_back에 대한 이해는 정확합니다.

각 V 값에는 사용자 집합이 있습니다. V를 사용하는 다른 값입니다. 따라서 user_back은 목록에서 마지막으로 사용 된 사용자입니다. 당신은 당신의 지시에 분명히 어떤 사용자도 없기 때문에 주장을하고 있습니다. 먼저 user_empty를 확인하십시오.

당신은 반대의 관계가 필요합니다 : 주어진 명령어 U, U가 사용하는 명령어를 찾으십시오. 당신은 U의 피연산자를 반복해야한다는 것을 알기 위해서는. 각 피연산자 O는 Use이고 O.get()은 사용 된 Value를 검색 할 것입니다. Constant, Instruction 또는 어떤 종류의 Value가 될 수 있습니다. LLVM IR은 SSA에 있으므로 각 피연산자에 대해 이러한 값이 한 번만 있습니다.

요약하면 두 번째 질문에 대한 대답은 "U의 피연산자를 반복하면 그 중 하나가 I가됩니다."