Как отключить оптимизацию tailcall в gcc - PullRequest
12 голосов
/ 09 сентября 2010

Хотите знать, если кто-нибудь знает флаг для gcc, чтобы отключить оптимизацию tailcall. В основном при оптимизации хвостового вызова gcc заменит кадр стека, когда возвращаемое значение из вызываемой функции будет пропущено (через return) или в функции больше ничего не произойдет.

То есть в

 void main() {
     foo();
 }

 void foo() {
     bar();
 }

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

Когда foo вызывает bar, gcc выдает код, который заменяет кадр стека для foo, вместо добавления нового кадра стека.

В моей компании есть разматыватель стека, который может распечатывать трассировку стека из любой точки кода. Оптимизация tailcall приводит к исчезновению кадров стека, что может несколько запутать трассировку стека.

Я компилирую для x86-64, используя gcc4.3.

Заранее спасибо! P

Ответы [ 2 ]

31 голосов
/ 09 сентября 2010

Руководство по GCC:

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

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

Так что либо скомпилируйте с -O0 / -O1, либо используйте -fno-optimize-sibling-calls.

13 голосов
/ 09 сентября 2010

Не проверено: -fno-optimize-sibling-calls

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...