c - 为什么 gcc 在优化版本中使用 jmp 调用函数

标签 c linux gcc x86

当我反汇编我的程序时,我看到 gcc 在使用 -O3 编译时使用 jmp 进行第二个 pthread_wait_barrier 调用。为什么会这样?

使用jmp 代替call 有什么好处。编译器在这里玩什么把戏?我猜它在这里执行尾调用优化。

顺便说一句,我在这里使用静态链接。

__attribute__ ((noinline)) void my_pthread_barrier_wait( 
    volatile int tid, pthread_barrier_t *pbar ) 
{
    pthread_barrier_wait( pbar );
    if ( tid == 0 )
    {
        if ( !rollbacked )
        {
            take_checkpoint_or_rollback( ++iter == 4 );
        }
    }
    //getcontext( &context[tid] );
    SETJMP( tid );
    asm("addr2jmp:"); 
    pthread_barrier_wait( pbar );
    // My suspicion was right, gcc was performing tail call optimization, 
    // which was messing up with my SETJMP/LONGJMP implementation, so here I
    // put a dummy function to avoid that.
    dummy_var = dummy_func();
}

最佳答案

由于您没有给出示例,我只能猜测:被调用函数的返回类型与调用函数的返回类型相同,这就像

return func2(...)

或者根本没有返回类型(void)。

在这种情况下,“我们”将“我们的”返回地址留在堆栈中,将其留给“他们”使用它返回给“我们的”调用者。

关于c - 为什么 gcc 在优化版本中使用 jmp 调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7984691/

相关文章:

c - 复制数组并修改其元素的函数

c - mongo 中 $push 的问题

Linux 按行数拆分文本文件,保留换行符

linux - 32 位 Linux 上的 Syscall 或 sysenter?

linux - 在matlab中以编程方式运行shell脚本

c - 为什么这两个表达式的结果不同?

c++ - 我可以在没有 Visual Studio 的情况下使用 Visual C++ 编译器吗?

c - 无法弄清楚 C 中 while/if 循环的逻辑

linux - 调试:我在反汇编的调用者中没有看到回调作为 callq 或内联 asm (Linux x86_64)

c++ - gcc 链接到未使用的库对构建系统性能的影响