[英]Extended asm with goto, including an example from the gcc docs, fails to compile
一些使用goto
限定符的擴展匯編語句無法使用 GCC 10.1.0 編譯。 具體來說,
int foo(int count)
{
asm goto ("dec %0; jb %l[stop]"
: "+r" (count)
:
:
: stop);
return count;
stop:
return 0;
}
(這是GCC 擴展 asm 文檔中的一個示例)無法expected ':' before string constant
進行編譯。 刪除"+r" (count)
和dec %0
允許它成功編譯,但無論我何時嘗試在與 goto label 相同的 asm 語句中提供 output 操作數時,它都會以同樣的方式出錯。
您正在參考的當前開發GCC 文檔似乎適用於 GCC 的最新主干分支,不適用於 Z32D8B233E3C58A262A0B7587229 的任何官方版本。 GCC 的官方版本目前不支持帶有任何 output 或輸入/輸出約束的asm goto
。 你可以在Godbolt上看到這個。 最新的主干有效,但 10.2 和 10.1 無效。 修復方法是等待 GCC(版本 11.x)的下一個主要版本; 下載並編譯最新的主干版本; 修改您的內聯程序集,使其不依賴任何 output 或輸出/輸入約束。
直到最近,GCC 版本 10.x 的文檔都這樣說:
asm goto 語句不能有輸出。 這是由於編譯器的內部限制:控制轉移指令不能有輸出。 如果匯編程序代碼確實修改了任何內容,請使用“內存”破壞程序強制優化器將所有寄存器值刷新到 memory 並在 asm 語句之后重新加載它們(如有必要)。
可以在此URL中找到正式版本的所有文檔和當前開發文檔的列表。 當前的開發文檔位於頁面底部。 經驗法則是您應該查閱 GCC 特定版本的文檔。 我相信所有 10.x 版本文檔與 GCC 網頁上的最新 10.x 版本文檔相同。
最新版本的 CLANG/LLVM (11.0+) 確實支持此功能,但這也是相對較新的添加。
asm goto 不允許 output 操作數。
這是一個 gnu 決定。 在來自 c-parser.c 的 function c_parser_for_statement 中,您可以找到:
/* For asm goto, we don't allow output operands, but reserve
the slot for a future extension that does allow them. */
https://github.com/gcc-mirror/gcc/blob/releases/gcc-10/gcc/c/c-parser.c
然而,這種情況可能會改變,因為在主分支中,這條評論不再存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.