2012-02-08 12 views
8

¿Hay alguna manera de obtener una lista de funciones que NO estaban en línea en ninguna parte? ¿O pasando una opción a gcc o inspeccionando el binario?Cómo saber qué funciones NO estaban en línea

EDIT: Sé cómo pedir explícitamente que una función no se inline utilizando el atributo incorporado de gcc noinline.

Respuesta

3

Use gcc's -fdump-tree-all y busque los archivos de volcado para "en línea".

0

Puede usar nm command en Unix/Linux para obtener la lista de símbolos en un archivo binario.
Si la función no está en línea, su nombre de símbolo estará presente en el binario.

+5

Eso no es correcto. Las funciones no estáticas se emitirán independientemente de si estaban en línea o no. – Mat

+0

@Mat, no. El modelo de entrada para C++ es probablemente un poco más complicado, pero para C (C99 y C11) un símbolo solo se emite en una unidad de traducción que solicita una "instancia" del símbolo, es decir, para C que tiene una definición * en línea * y una declaración externa. –

+0

@ Alles, +1, pero quizás podría ser un poco más preciso. Un nombre de símbolo puede estar presente como un símbolo indefinido o para definir el símbolo. Si define el símbolo depende mucho de los modelos de instanciación, creo que pueden ser bastante diferentes en diferentes implementaciones de C++ (mi conocimiento sobre C++ aquí está un poco oxidado) y en C. –

0

'inline' NO es un atributo de una función, una función puede ser tanto inline como no. cuando llama a una función, el compilador decide si está en línea o no, si hay varias llamadas, el compilador puede elegir una opción diferente para cada llamada. si hay al menos una llamada no en línea, la función aparecerá en la tabla de símbolos. y si se exporta, también aparecerá en la tabla de símbolos.

por lo que no hay manera de verificar que una función esté en línea o no, solo puede verificar que una llamada específica esté en línea o no por ingeniería inversa.

+0

Entiendo que en línea es "por llamada", mi pregunta es cómo averiguar si TODAS las llamadas no están en línea. –

+1

Simplemente no responde la pregunta. –

5

Agregue -fdump-ipa-inline a sus opciones de compilación.

Grep el archivo yoursourcefile.inline que se crea junto al archivo objeto para "Considerando candidato en línea" para descubrir todas las funciones que el compilador considera procesos en línea.

Grep el archivo para "Inlined into" para descubrir todas las funciones que el compilador finalmente hizo en línea.
Grep para "inline_failed:" si le interesa el motivo por el que el compilador rechazó un candidato (por ejemplo, "la llamada es improbable y el tamaño del código aumentaría").

Cuestiones relacionadas