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