2013-02-11 4 views
7

Wenn ein Funktionsaufruf direkt erfolgt, können Sie den Funktionstyp über den folgenden Code abrufen.So rufen Sie FunctionType von CallInst ab, wenn der Aufruf in LLVM indirekt ist

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

Wenn jedoch der Aufruf indirekt ist, das heißt, durch einen Funktionszeiger, die getCalledFunction NULL zurück. Also meine Frage ist, wie man den Funktionstyp erhält, wenn eine Funktion über einen Funktionszeiger aufgerufen wird.

Antwort

9

Um den Typ von einem indirekten Aufruf zu erhalten, verwenden getCalledValue statt getCalledFunction, etwa so:

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

Das würde Sie die Art der auf den Anruf-Anweisung übergeben Zeiger erhalten; Um den eigentlichen Funktionstyp zu erhalten, fahren Sie fort mit:

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

Vielen Dank für eine gute Antwort. Ich denke, Type * wäre genug, um den Zeiger void * auf den Funktionszeiger zu werfen, weil wir zu diesem Zweck BitCastInst verwenden müssen, und diese Klasse nimmt Type * als Parameter. – MetallicPriest

+1

@MetallicPriest Ja, Casting auf 't' ist das, was Sie mit einem beliebigen Zeiger machen müssen, damit er Ihrem' callInst' entspricht. Ich denke du meinst "i8 *" und nicht "void *", was kein legaler LLVM Typ ist. – Oak

+1

Ich versuche, den Namen der Funktion eines indirekten Aufrufs zu erhalten: 'Wert * v = CI-> getCalledValue(); Wert * sv = v-> stripPointerCasts(); StringRef fname = sv-> getName(); ' Aber funktioniert nicht wirklich. Irgendwelche Ideen? – eternalStudent

Verwandte Themen