2017-06-09 26 views
1

需要使用returns_twice屬性的編譯器,GCC支持哪些編譯器,glibc函數需要這些屬性,如setjmpfork編譯器爲returns_twice屬性做些什麼?

我見過這樣的語句,returns_twice函數不能被內聯,需要發出關於註冊clobbering的警告,但我找不到一個編譯器如何實現這個的清晰描述。

+0

你問是因爲你在編寫一個編譯器嗎?因爲你有一個功能,你正在考慮裝飾這個屬性?其他?我不認爲fork是returns_twice(可能是vfork)。從本質上講,returns_twice意味着setjmp需要任何魔法才能正常工作...... –

+0

我從編譯器中實現它的角度提問,這意味着「setjmp正常工作所需的任何魔法」的技術細節。我瞭解如何以及爲什麼要在我的代碼中使用該屬性。 – Jeff

回答

1

returns_twice的行爲取決於編譯器實現的優化。例如,如果編譯器具有可以消除以下片段中的local變量的讀取的優化(假定其從未被採用,以致setjmp通常不能更新它),則它需要知道setjmp可以迴歸自然,所以它不會在這種情況下,應用優化:(奇怪的是,GCC不做到這一點,如果你把local到一個全局寄存器變量可能的錯誤。)

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; 
} 

相關問題