2010-09-09 12 views
8

Me pregunto si alguien conoce el indicador de gcc para deshabilitar las optimizaciones de tailcall. Básicamente, en una optimización de tailcall, gcc reemplazará un marco de pila cuando se pase el valor de retorno de una función llamada (a través de retorno) o no pase nada más en la función.Cómo deshabilito las optimizaciones de tailcall en gcc

Es decir, en

void main() { 
    foo(); 
} 

void foo() { 
    bar(); 
} 

void bar() { 
    /* at this point in code, the foo() stack frame no longer exists! */  
} 

Cuando llama foo bar, gcc emite código que sustituye al marco de pila para foo, en lugar de añadir un nuevo marco de pila.

Mi empresa tiene una desbobinadora de pila que puede imprimir un rastro de pila desde cualquier punto del código. La optimización de cola de cola hace desaparecer los marcos de pila, lo que puede confundir un poco la traza de la pila.

Estoy compilando para x86-64 usando gcc4.3.

¡Gracias de antemano! manual de P

Respuesta

25

GCC:

-foptimize-sibling-calls 
     Optimize sibling and tail recursive calls. 

     Enabled at levels -O2, -O3, -Os. 

Así que, o compilar con -O0/-O1, o utilizar -fno-optimize-sibling-calls.

+0

justos. ¡Gracias! – pgod

Cuestiones relacionadas