2016-07-12 54 views
5

Sto lavorando con LLVM 3.4 e voglio ottenere le informazioni sul numero di riga del file sorgente da IR. L'IR è generato da un semplice codice c con Clang. Voglio ottenere il numero di riga nel file sorgente c dalla linea nel corpo IR.Come ottenere il numero di linea sorgente dal file .ll LLVM

ho provato questo -

  1. per l'istruzione BI, non firmato Linea = Linea = BI> getDebugLoc() getline();.
  2. Per Loop L, std :: cout < < L-> getStartLoc(). GetLine();

Tuttavia, il risultato memorizzato/stampato è sempre 0. Non so come ottenere il numero di riga nella sorgente da IR LLVM.

Il mio file sorgente C è -

#include <stdio.h> 

int main() 
{ 

int i; 

int inbuf[100]; 
int outbuf[100]; 

for(i = 0; i < 100; ++i)   
     inbuf[i] ^= outbuf[i]; 

inbuf[1] += 402; 
inbuf[6] += 107; 
inbuf[97] += 231; 

for(i = 0; i < 100; ++i)  
{ 
     inbuf[i] += outbuf[i]; 
} 

inbuf[47] += 312; 

    //print-statements 
for (i=0;i<100;i++) { 
     printf("inbuf[%d] = %d\n",i,inbuf[i]);    
} 

return 0; 

Comando Used- ~/LLVM/build/uscita + asserisce/bin/clang -O3 -fno-unroll-loop -fno-Vectorize -fno -slp-vectorize -S -emit-llvm sample.c -o sample.ll

Grazie!

+0

si sta ottimizzando quindi non c'è ragione di aspettarsi l'uscita per rappresentare le sorgenti di ingresso, in linea fonte numero d'ordine né aspettarsi che ci siano pezzi di codice per linea di provenienza. Se llvm ha una libreria che riempie quelle e questo è quello che stai chiedendo, forse non c'è una linea per la cosa che stai guardando. magari provare non ottimizzato e vedere se questo cambia le cose. –

+0

Grazie! Ho provato con -O0 ma mostra ancora il comando 0. : ~/llvm/build/Release + Asserisce/bin/clang -O0 -S -emit-llvm sample.c -o sample.ll Ho un pass funzionante che in grado di rilevare e analizzare i loop e le istruzioni. Lo sto usando all'interno della funzione - runOnLoop (Loop * L, LPPassManager & LPM) –

+0

Sembra che tu non stia chiedendo informazioni di debug nella riga di comando compilata. – Mat

risposta

3

Per ottenere le informazioni sul numero di riga nel file .ll è necessario specificare entrambi i flag -O0 e -g per clang.

http://llvm.org/docs/SourceLevelDebugging.html#debugging-optimized-code

I numeri di riga sono memorizzati nei nodi di metadati specializzati.

http://llvm.org/docs/LangRef.html#specialized-metadata-nodes

Così la linea di comando completo deve apparire come questo:

~/llvm/build/Release+Asserts/bin/clang -O0 -g -S -emit-llvm sample.c -o sample.ll

+0

Grazie! L'aggiunta di -g funziona. Ho aggiunto prima il flag -fstandalone-debug. Ma, aggiungendo -g ha funzionato con -O0 e -O3. Molte grazie! :) –

+2

Non hai assolutamente bisogno di -0. Avrai sicuramente bisogno di -g, forse anche -gcolumn-info se vuoi informazioni sulle colonne. -fstandalone-debug controlla solo se un tipo viene emesso o meno nelle informazioni di debug - normalmente ottimizzeremo il tipo se non emettiamo la funzione chiave sull'idea che ovunque emettiamo una funzione chiave per la classe che abbiamo Mi assicurerò che le informazioni di debug siano lì. – echristo

+0

Esattamente! Grazie a @echristo per tutte le informazioni. –