2010-09-09 11 views
8

Zastanawiasz się, czy ktokolwiek zna flagę gcc, aby wyłączyć optymalizacje tailcall. Zasadniczo w optymalizacji tailcall, gcc zastąpi ramkę stosu, gdy wartość zwracana z wywoływanej funkcji zostanie przekazana (przez powrót) lub nic innego nie stanie się w funkcji.Jak wyłączyć optymalizacje tailcall w gcc

Oznacza to, że w

void main() { 
    foo(); 
} 

void foo() { 
    bar(); 
} 

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

Kiedy foo bar nazywa, gcc emituje kodu, który zastępuje ramkę stosu dla foo, zamiast dodawać nową ramkę stosu.

Moja firma ma odwijak stosu, który może wydrukować ślad stosu z dowolnego miejsca w kodzie. optymalizacja tailcall powoduje, że ramki stosu znikają, co może nieco zmylić ślad stosu.

Jestem kompilacji dla x86-64 przy użyciu gcc4.3.

Z góry dziękuję! Instrukcja P

Odpowiedz

25

GCC:

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

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

Więc albo skompilować z -O0/-O1 lub użyj -fno-optimize-sibling-calls.

+0

sprawiedliwy. dzięki! – pgod

Powiązane problemy