【问题标题】:what do compilers do for the returns_twice attribute?编译器对returns_twice 属性做了什么?
【发布时间】:2017-06-09 16:25:54
【问题描述】:

编译器需要哪些编译器才能处理 GCC 支持的 returns_twice 属性以及 setjmpfork 等 glibc 函数所必需的?

我已经看到returns_twice 函数不能被内联并且需要发出关于寄存器破坏的警告的声明,但是我找不到编译器需要如何实现它的清晰描述。

【问题讨论】:

  • 你问是因为你在写一个编译器吗?因为你有一个你正在考虑用这个属性装饰的函数?其他?我不认为fork 是returns_twice(vfork 可能是)。从本质上讲,returns_twice 意味着 setjmp 正常工作所需的任何魔法......
  • 我是从在编译器中实现它的角度来询问的,这意味着“setjmp 正常工作需要什么魔法”的技术细节。我了解如何以及为什么在我的代码中使用该属性。

标签: gcc glibc


【解决方案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 不会这样做。也许是一个错误。)

【讨论】:

    猜你喜欢
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    相关资源
    最近更新 更多