编译器为returns_twice属性做了什么?

时间:2017-06-09 16:25:54

标签: gcc glibc

GCC支持returns_twice属性需要哪些编译器,setjmpfork等glibc函数需要?

我已经看到returns_twice函数无法内联并且需要发出有关寄存器clobbering的警告的语句,但我找不到编译器需要如何实现它的清晰描述。

1 个答案:

答案 0 :(得分:1)

returns_twice的行为取决于编译器实现的优化。例如,如果编译器具有可以消除以下片段中local变量的读取的优化(假设从未采用其地址,那么setjmp通常不能更新它) ,它需要知道setjmp可以自发返回,因此在这种情况下它不会应用优化:

static int local;

static doit (void)
{
  jmp_buf jmp;
  local = 0;
  if (setjmp (jmp) != 0)
    return local;
  local = 1;
  longjmp (jmp, 1);
  local = 0;
  return 0;
}

(奇怪的是,如果你将local转换为全局寄存器变量,GCC会这样做。也许是一个错误。)