2009-08-21 9 views
10

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.

+0

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

risposta

8

Dalla sorgente llvm-gcc: gcc/llvm-convert.cpp, è appena usato come valore di supporto * e verrà rimosso da una passata di eliminazione delle istruzioni.

// 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 
+0

Sì, è giusto. Ho anche fatto questa domanda sulla mailing list di LLVM e ho avuto risposta simile, per essere precisi: "È lì come segnaposto dove inserire i temporaries: gli alloca vanno prima del bitcast e la generazione del codice inizia dopo di essa. È semplicemente una comodità per il front-end: instcombine lo eliminerà, e praticamente tutto il resto semplicemente lo ignorerà. " –

-1

Trovato su questo interno: Le allocazioni la cui dimensione può essere determinata in fase di compilazione verrà allocata nello stack quando viene calcolata la dimensione del frame dello stack. Per le allocazioni di dimensioni variabili, il codice specifico del target dovrà ridimensionare lo stack, regolando il puntatore del frame e il puntatore dello stack secondo necessità, e regolando le posizioni dei parametri in uscita in cima allo stack.

sembra proprio lì per fare in modo che lo spazio di stack funzioni correttamente.

+0

La domanda non riguarda l'alloca stessa. L'OP sta chiedendo l'istruzione "alloca point", che sembra essere un no-op. –

Problemi correlati