Frage

Ich habe mir eine LLVM-Baugruppe angesehen, die in letzter Zeit von LLVM-GCC produziert wurde, und ich habe eine wiederkehrende Aussage festgestellt, von der ich mich nicht sicher bin, dass es sich um den Zweck handelt.

Zum Beispiel das folgende C -Programm:

int main(void)
{
   void (*f)(void) = (0x21332);
   f();
}

Wenn mit "LLVM -GCC -EMIT -LLVM -S" zusammengestellt wird, erzeugt er den folgenden Code (irrelevante Teile entfernt):

define i32 @main() nounwind {
entry:
   %retval = alloca i32     ; <i32*> [#uses=1]
   %f = alloca void ()*     ; <void ()**> [#uses=2]
   %"alloca point" = bitcast i32 0 to i32       ; <i32> [#uses=0]
   store void ()* inttoptr (i64 135986 to void ()*), void ()** %f, align 4
   %0 = load void ()** %f, align 4      ; <void ()*> [#uses=1]
   call void %0() nounwind
   br label %return

Ich interessiere mich für den Zweck der Linie:

%"alloca point" = bitcast i32 0 to i32      ; <i32> [#uses=0]

Scheint nichts zu tun, wie die Variable, die sie zugewiesen hat, nie wieder verwendet wird und der Bitcast selbst sinnlos ist. Alles, was ich mir vorstellen kann, ist, dass es wirklich als NOP für spätere Zwecke der Codegenerierung / -analyse eingefügt wird, was auf interessante Teile des Codes hinweist.

War es hilfreich?

Lösung

Aus der LLVM-GCC-Quelle: gcc/llvm-convert.cpp, Es wird nur als Helferwert* verwendet und wird durch einen toten Anweisungsausscheidungspass entfernt.

// Create a dummy instruction in the entry block as a marker to insert new
// alloc instructions before.  It doesn't matter what this instruction is,
// it is dead.  This allows us to insert allocas in order without having to
// scan for an insertion point. Use BitCast for int -> int

Andere Tipps

Fanden dies im Internet: Allokas, deren Größe zur Kompilierungszeit ermittelt werden kann, wird auf dem Stapel Platz zugeteilt, wenn die Stapelrahmengröße berechnet wird. Für Allocas mit variabler Größe muss der Ziel -spezifische Code den Stapel ändern, den Rahmenzeiger und den Stapelzeiger bei Bedarf einstellen und die Stellen für die ausgehenden Parameter an die Oberseite des Stapels einstellen.

Klingt so, als ob es da ist, dass ein Stapelraum richtig funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top