2012-11-22 320 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++? – 2012-11-22 05:54:01

回答

4

你應該使用迭代器OI來取代它,而不是本地指針val。所以它應該是這樣的。

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 = *((Value*) iter->second.PN); 
+0

嗯,這在LLVM的上下文中不起作用,事實上它甚至不編譯,因爲=運算符是Value類的私有成員。在LLVM中,我認爲每個操作數都通過一個指針鏈接到指令,所以只需更改指針即可替換操作數,但無論如何,這也不起作用,所以我不確定什麼是正確的方法解決此問題。至少它對我來說可以用於其他指令的操作,但對於操作數,同樣的方法不起作用。 – pythonic

+1

@ user1018562你不能改變指針'val',因爲這隻會使_local_變量'val'指向別的東西。一個可能的解決方案可能是改變_iterator_:'* OI =(Value *)iter-> second.PN;' –