簡體   English   中英

帶有 goto 的擴展 asm,包括來自 gcc 文檔的示例,無法編譯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM