Cuando diassembled mi programa, vi que estaba usando gcc JMP para la segunda pthread_wait_barrier llamar cuando se compila con -O3. ¿Por que es esto entonces?¿Por qué es gcc usando JMP para llamar a una función en la versión optimizada
¿Qué ventaja obtiene al usar jmp en lugar de llamada. ¿Qué trucos está jugando el compilador aquí? Supongo que está realizando una optimización de llamadas de cola aquí.
Por cierto, estoy usando enlaces estáticos aquí.
__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();
}
Muéstranos el código fuente. –
jmp simplemente transfiere la ejecución a una nueva ubicación. call empuja cosas a la pila y, por lo tanto, es un poco más caro de usar. –
Parece que realiza una optimización de llamadas de cola. – MetallicPriest