1
需要使用returns_twice屬性的編譯器,GCC支持哪些編譯器,glibc函數需要這些屬性,如setjmp
和fork
?編譯器爲returns_twice屬性做些什麼?
我見過這樣的語句,returns_twice
函數不能被內聯,需要發出關於註冊clobbering的警告,但我找不到一個編譯器如何實現這個的清晰描述。
需要使用returns_twice屬性的編譯器,GCC支持哪些編譯器,glibc函數需要這些屬性,如setjmp
和fork
?編譯器爲returns_twice屬性做些什麼?
我見過這樣的語句,returns_twice
函數不能被內聯,需要發出關於註冊clobbering的警告,但我找不到一個編譯器如何實現這個的清晰描述。
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;
}
你問是因爲你在編寫一個編譯器嗎?因爲你有一個功能,你正在考慮裝飾這個屬性?其他?我不認爲fork是returns_twice(可能是vfork)。從本質上講,returns_twice意味着setjmp需要任何魔法才能正常工作...... –
我從編譯器中實現它的角度提問,這意味着「setjmp正常工作所需的任何魔法」的技術細節。我瞭解如何以及爲什麼要在我的代碼中使用該屬性。 – Jeff