2012-02-08 7 views
8

C'è un modo per ottenere un elenco di funzioni che NON sono state allineate ovunque? O passando un'opzione a gcc o ispezionando il binario?Come scoprire quali funzioni NON erano in linea

MODIFICA: so come chiedere esplicitamente che una funzione non venga evidenziata utilizzando l'attributo incorporato di gcc noinline.

risposta

3

Utilizzare gcc -fdump-tree-all e cercare i file di dettagli "in linea".

0

È possibile utilizzare nm command in Unix/Linux per ottenere l'elenco dei simboli in un file binario.
Se la funzione non è in linea, il nome del simbolo sarà presente nel file binario.

+5

Non è corretto. Le funzioni non statiche verranno emesse indipendentemente dal fatto che siano state allineate o meno. – Mat

+0

@ Mat, no. Il modello inlining per C++ è probabilmente un po 'più complicato, ma per C (C99 e C11) un simbolo viene emesso solo in un'unità di traduzione che richiede una "istanziazione" del simbolo, cioè per C che ha una definizione * in linea * e una dichiarazione esterna. –

+0

@Als, +1, ma forse potresti essere un po 'più preciso. Un nome di simbolo può essere presente come un simbolo non definito o per la definizione del simbolo. Se definisce o meno il simbolo dipende molto dai modelli di istanziazione, penso che potrebbero essere abbastanza diversi in diverse implementazioni in C++ (la mia conoscenza del C++ qui è un po 'arrugginita) e in C. –

0

'inline' NON è un attributo di una funzione, una funzione può essere sia in linea che non inline. quando si chiama una funzione, il compilatore decide se in linea o meno, se ci sono più chiamate, il compilatore può scegliere un'opzione diversa per una chiamata diversa. se c'è almeno una chiamata non in linea, la funzione verrà visualizzata nella tabella dei simboli. e se viene esportato apparirà anche nella tabella dei simboli.

quindi non c'è modo di verificare se una funzione è in linea o meno, è possibile solo verificare che una chiamata specifica sia in linea o meno da un tecnico inverso.

+0

Capisco che la linea sia "per chiamata", la mia domanda è come scoprire se TUTTE le chiamate non sono in linea. –

+1

Semplicemente non rispondi alla domanda. –

5

Aggiungi -fdump-ipa-inline alle opzioni del compilatore.

Grep il file yoursourcefile.inline che viene creato accanto al file oggetto per "Considerando linea candidato" per scoprire tutte le funzioni che il compilatore considerato inline.

Grep il file per "Inline into" per scoprire tutte le funzioni che il compilatore finalmente ha effettuato in linea.
Grep per "inline_failed:" se sei interessato al motivo per cui il compilatore ha rifiutato un candidato (ad esempio "la chiamata è improbabile e la dimensione del codice aumenterebbe").

Problemi correlati