1
returns_twice属性はGCCでサポートされていて、setjmp
とfork
のようなglibc関数に必要ですか?returns_twice属性に対してコンパイラは何をしますか?
returns_twice
関数はインライン化できず、レジスタのclobberingに関する警告を発行する必要がありますが、コンパイラがこれを実装する必要があるかどうかの明確な説明は見つかりません。
returns_twice属性はGCCでサポートされていて、setjmp
とfork
のようなglibc関数に必要ですか?returns_twice属性に対してコンパイラは何をしますか?
returns_twice
関数はインライン化できず、レジスタのclobberingに関する警告を発行する必要がありますが、コンパイラがこれを実装する必要があるかどうかの明確な説明は見つかりません。
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ははこれを行いませんおそらくバグを)
あなたはコンパイラを書いているのであなたは尋ねていますか?あなたはこの属性で装飾を検討している機能を持っているからですか?その他?私はフォークがreturns_twice(vforkかもしれない)だとは思わない。本質的には、returns_twiceは、setjmpが正しく動作するために必要な魔法を意味します。 –
コンパイラで実装するという観点から、「setjmpが正しく動作するためにはどんな魔法が必要ですか」の技術的な詳細を尋ねています。私はどのように、なぜ私のコードで属性を使うのかを理解しています。 – Jeff