Gcc 编译器如何处理returns\u tweeps属性?

Gcc 编译器如何处理returns\u tweeps属性?,gcc,glibc,Gcc,Glibc,GCC支持该属性,glibc函数(如setjmp和fork)需要该属性,编译器需要如何处理该属性 我看到过这样的语句:返回两次函数不能内联,需要发出有关寄存器关闭的警告,但我找不到编译器需要如何实现这一点的清晰描述 的行为两次返回\u取决于编译器实现的优化。例如,如果编译器进行了一些优化,可以消除对以下片段中local变量的读取(假设从未获取其地址,因此setjmp通常无法更新它),那么它需要知道setjmp可以自动返回,这样就不会在这种情况下应用优化: static int local; s

GCC支持该属性,glibc函数(如
setjmp
fork
)需要该属性,编译器需要如何处理该属性


我看到过这样的语句:
返回两次
函数不能内联,需要发出有关寄存器关闭的警告,但我找不到编译器需要如何实现这一点的清晰描述

的行为两次返回\u取决于编译器实现的优化。例如,如果编译器进行了一些优化,可以消除对以下片段中
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不会这样做。这可能是一个bug。)

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