2017-06-09 6 views
1

returns_twice属性はGCCでサポートされていて、setjmpforkのようなglibc関数に必要ですか?returns_twice属性に対してコンパイラは何をしますか?

returns_twice関数はインライン化できず、レジスタのclobberingに関する警告を発行する必要がありますが、コンパイラがこれを実装する必要があるかどうかの明確な説明は見つかりません。

+0

あなたはコンパイラを書いているのであなたは尋ねていますか?あなたはこの属性で装飾を検討している機能を持っているからですか?その他?私はフォークがreturns_twice(vforkかもしれない)だとは思わない。本質的には、returns_twiceは、setjmpが正しく動作するために必要な魔法を意味します。 –

+0

コンパイラで実装するという観点から、「setjmpが正しく動作するためにはどんな魔法が必要ですか」の技術的な詳細を尋ねています。私はどのように、なぜ私のコードで属性を使うのかを理解しています。 – Jeff

答えて

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ははこれを行いませんおそらくバグを)

関連する問題