2014-02-18 2 views
2

저장소 inst의 피연산자를 반복하여 처리하려고합니다. 나는 이것을하기 위해 프로그래머 매뉴얼을 따르지만 에러가 난다.llvm :: dyn_cast를 사용하여 캐스팅 오류가 발생했습니다.

IR/Use.h : 204 : UserTy의 *의 LLVM :: value_use_iterator : 운영자 *() const를 [UserTy = LLVM :: 사용자] : 어설`U

//x is store instruction pointing to [store i32 5, i32* %a, align 4] 
Value *op2 = x->getOperand(1); 
for (Value::use_iterator useItr=op2->use_begin(),useEnd=op2->use_end(); useItr!=useEnd;useItr++){ 
    if (Instruction *Inst = dyn_cast_or_null<Instruction>(*useItr)) 
     errs()<<"done"; 
} 

는이 오류 메시지가 & & "끝 반복자를 참조 할 수 없습니다!" '실패했습니다.

캐스팅이 불가능한 경우 dyn_cast는 오류가 아닌 null 포인터를 반환해야합니다. 나는 또한 dyn_cast_or_null을 시도했지만 같은 오류가 발생했습니다.

+0

내가 할 수있는 다른 방법이 있습니까? – rahuL

답변

0

dyn_cast이 아닌 useItr의 참조가 잘못되었습니다. 귀하의 코드는 괜찮아 보입니다. 따라서 value_use_iterator의 구현을 살펴 보았습니다. 오류 발생에 대해 생각할 수있는 유일한 방법은 값 사용 중 하나가 NULL 인 경우입니다.

NULL의 사용은 법적 모듈에서 발생할 수있는 것이 아닙니다. 따라서 코드 앞에 문제가 있는지 알아보기 위해 verifier pass을 실행하는 것이 좋습니다. 그렇지 않으면 모듈을 신중하게 검토해야합니다.

0

최신 코드의 경우 svn 체크 아웃을 사용 했으므로 문제는 최신 llvm 코드의 것 같습니다. 나는 3.4 버전을 마침내 가져 왔고 모든 것이 이제는 잘 작동한다.

관련 문제