2013-02-11 24 views
7

如果函數調用是直接的,則可以通過以下代碼獲取函數類型。如何在LLVM中調用間接時從CallInst獲取FunctionType

Function * fun = callInst->getCalledFunction(); 
Function * funType = fun->getFunctionType(); 

然而,如果呼叫是間接的,即通過一個函數指針,getCalledFunction 返回null。所以我的問題是如何通過函數指針調用函數時獲取函數類型。

回答

9

從間接調用獲取類型,使用getCalledValue代替getCalledFunction,就像這樣:

Type* t = callInst->getCalledValue()->getType(); 

這將讓你傳遞給調用指令指針的類型;要獲得實際的功能類型,請繼續:

FunctionType* ft = cast<FunctionType>(cast<PointerType>(t)->getElementType()); 
+0

感謝您的回答。我猜,Type *對於將void *指針指向函數指針已經足夠了,因爲我認爲我們需要使用BitCastInst來達到這個目的,並且這個類碰巧把Type *作爲它的參數。 – MetallicPriest 2013-02-11 12:26:34

+1

@MetallicPriest是的,鑄造到't'就是你需要用一個任意指針來使它符合你的'callInst'。我認爲你的意思是'i8 *',但是,而不是'void *',這不是合法的LLVM類型。 – Oak 2013-02-11 14:25:58

+1

我想獲得間接調用函數的名稱:'Value * v = CI-> getCalledValue();值* sv = v-> stripPointerCasts(); StringRef fname = sv-> getName();'但實際上並不奏效。有任何想法嗎? – eternalStudent 2015-07-31 09:27:21

相關問題