Ho visto alcuni assemblaggi LLVM prodotti da llvm-gcc ultimamente e ho notato una dichiarazione ricorrente di cui non sono sicuro il suo scopo.Qual è lo scopo della riga% "alloca point" che si verifica nel codice llvm?
Ad esempio, il seguente programma C:
int main(void)
{
void (*f)(void) = (0x21332);
f();
}
Quando compilato con "llvm-gcc -emit-llvm -S" produrrà il codice seguente (parti irrilevanti rimossi):
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
mi interessa lo scopo della linea:
%"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]
non sembra di fare nulla come variabile assegna a non è mai più usato e il bitcast stesso è inutile. Tutto quello che riesco a pensare è che è stato inserito proprio come un nop per scopi di generazione/analisi del codice successivi, indicando parti interessanti del codice.
Sono anche curioso in questa linea; L'ho incontrato stasera mentre guardavo alcune cose di generazione di codice. Sembra essere il confine di alloca, ma non so perché. – Albinofrenchy