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.
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
@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
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