2017-05-30 2 views
0

Ich habe einen IR mit meinem Pass generiert, innerhalb einer Funktion in diesem IR würde ich gerne zu einem Basisblock der Caller Funktion springen, innerhalb der Caller Funktion ext_callee function aufgerufen wird dies: LLVM IR Sprung zu einem Basisblock innerhalb einer anderen Funktion

%4 = call i1 @ext_callee(i32 32, i32 %3, i32 -4, i8* blockaddress(@tobecalled, %5), i8* blockaddress(@tobecalled, %7)). 

die letzten beiden Parameter sind die basicblock Adressen I Funktion innerhalb dieser ext_callee springen möchte. Ich habe versucht, indirectbr Befehl mit einem der blockaddress Parameter zu verwenden, aber wenn ich das IR starte, fordert es Segmentfehler an. Ich habe LLVM-Dokumente durchsucht, aber nicht gefunden, wie man auf Basisblöcke einer anderen Funktion springt. Hat jemand eine Ahnung? Vielen Dank!

Antwort

0

Sie können dies nicht tun.

Per http://llvm.org/docs/LangRef.html#i-indirectbr:

Die Steuerung geht auf den Block in der Adress Argument angegeben. Alle möglichen Zielblöcke müssen in der Etikettenliste aufgeführt sein, sonst hat diese Anweisung ein nicht definiertes Verhalten. Dies bedeutet, dass Sprünge zu Labels, die in anderen Funktionen definiert sind, ebenfalls ein nicht definiertes Verhalten haben.

+0

Danke, ich dachte, dass die Funktionsumfangsregel im IR zuerst gebrochen werden könnte. Es ist dann ein wenig schwierig. :( – shikai

+0

Betrachten Sie beispielsweise Funktionsextraktion. Wie es dann funktionieren würde? –

Verwandte Themen