2012-11-22 5 views
2

다음 코드에서 LLVM 명령어의 피연산자를 대체하려고합니다. 그러나 그것은 작동하지 않으며 아무 것도 변경되지 않습니다. 어떤 생각이 어떻게 해결할 수 있습니까?LLVM 명령어의 피연산자 바꾸기

for (OI = insn->op_begin(), OE = insn->op_end(); OI != OE; ++OI) 
{ 
    Value *val = *OI; 
    iter = mapClonedAndOrg.find(val); 

    if(iter != mapClonedAndOrg.end()) 
    { 
     // Here I try to replace the operand, to no effect! 
     val = (Value*)iter->second.PN; 
    } 
} 
+0

C ** exclusive 또는 ** C++? –

답변

4

:이를 위해 당신은 역 참조 연산자 *를 사용해야합니다. 그래서 이렇게되어야합니다.

for (OI = insn->op_begin(), OE = insn->op_end(); OI != OE; ++OI) 
{ 
    Value *val = *OI; 
    iter = mapClonedAndOrg.find(val); 

    if(iter != mapClonedAndOrg.end()) 
    { 
     *OI = (Value*)iter->second.PN; 
    } 
} 
+0

을 변경하는 것입니다. 이것은 매력처럼 작동합니다. 감사. – pythonic

3

당신이 단순히 뭔가 다른 로컬 포인터 지점을 만드는 일을, 당신은 실제로 가 가리키는 것을 변경되지 않습니다. 대신 로컬 포인터 val의, 당신은 그것을 대체하는 반복자 OI를 사용해야합니다

*val = *((Value*) iter->second.PN); 
+0

이것은 LLVM의 컨텍스트에서 작동하지 않습니다. 사실 operator는 Value 클래스의 private 멤버이기 때문에 컴파일되지 않습니다. LLVM에서 모든 피연산자는 포인터를 통해 명령에 연결되므로 포인터를 변경하면 피연산자를 대체해야하지만 어쨌든이 또한 작동하지 않으므로 올바른 방법이 무엇인지 잘 모르겠습니다. 이것을 해결하십시오. 적어도 지시와 같은 다른 것들에 대해서는 나를 위해 일했지만, 피연산자에 대해서는 같은 방법이 작동하지 않습니다. – pythonic

+1

@ user1018562 포인터'val'을 변경할 수 없습니다. _local_ 변수'val' 포인트를 다른 것으로 만듭니다. 가능한 해결 방법은 _iterator_ : * OI = (Value *) iter-> second.PN; ' –