C++ gcc是否能正常工作+;m";是否用作输出约束?

C++ gcc是否能正常工作+;m";是否用作输出约束?,c++,gcc,inline-assembly,C++,Gcc,Inline Assembly,根据关于扩展汇编程序的说明: 仅当操作数[…]的约束允许使用寄存器时,才应使用读写操作数 这似乎非常明确:您不能使用+m作为输出 然而,我已经看过很多次了。事实上,Linus Torvalds说 gcc文档是次要的。它们没有更新,它们不正确,它们不反映现实,它们也不重要。对于这样的事情,唯一正确的用法是“+m” 如果编译器最终会弄糟我的代码,我不想使用+m。即使检查输出asm是否正常工作,也不意味着明天当我改变一些看似不相关的事情时,它仍能正常工作。或者,当我得到下一次gcc更新时,它仍然可以工

根据关于扩展汇编程序的说明:

仅当操作数[…]的约束允许使用寄存器时,才应使用读写操作数

这似乎非常明确:您不能使用+m作为输出

然而,我已经看过很多次了。事实上,Linus Torvalds说

gcc文档是次要的。它们没有更新,它们不正确,它们不反映现实,它们也不重要。对于这样的事情,唯一正确的用法是“+m”

如果编译器最终会弄糟我的代码,我不想使用+m。即使检查输出asm是否正常工作,也不意味着明天当我改变一些看似不相关的事情时,它仍能正常工作。或者,当我得到下一次gcc更新时,它仍然可以工作


如果文档是正确的,我不能依靠它正常工作,我想知道这一点,这样我就可以寻求其他的选择(其中大多数都是令人不快的痛苦)。如果文件有误,请让我知道如何更正。

请不要引用Linus在2001年(!)就gcc所说的话,当时gcc/egcs裂痕刚刚开始愈合(2000年左右结束)。是的,在那个时间段内,asm限制的处理是一个可怕的混乱(Alan Cox是清理混乱的负责人,因为编译器开始真正注意到这些限制,我添加了一些补丁)

当前的GCC是一个完全不同的庞然大物,它在内部经历了广泛的重新设计

相信文档,不要写不好的约束。它们是约束,如果你对编译器撒谎,它可能会因为运气不好而选择大部分时间都有效的参数。总有一天会下雨的

如果您有一个示例表明编写非法约束是可以接受的(编译器可以检查!),请报告它

如果你有一个编译器不考虑的约束的例子,请报告它。


如果你有代码,根据ypu告诉它的,编译器可以合法地采取的选项,做一些可能(或不)有效的事情,有时有效,有时无效,好吧,把它归咎于你自己的错误,然后明智地去做不要对你的编译器撒谎,这会招致血腥的报复。

事实证明,问题在于文档(请参阅)。如果链路失效:

文档的这一部分有一段时间是错误的。该文档在4.8版本中进行了更正,但在早期版本中也是错误的


因为我使用的是rubenvb的x64编译器,它报告了版本4.7.2,这就是我正在阅读的文档的版本。然而,实际的代码签入是在2004年,所以我很有信心我正在运行的代码中包含了更改。

这是非常具体的,最好在gcc邮件列表中询问,维护人员在哪里看到它……啊,进退两难。。。一方面,你有万能的文档,你应该经常参考,另一方面,你有一个著名的黑客,像Linus,他说那些文档不重要。我感觉到你的痛苦@Plasmah是对的,这可能太具体了,所以最好问问维护人员自己。好的,但是之前没有使用过这些,gcc列表()中哪一个看起来更合适?这更像是一个“总体发展”问题吗?还是一只虫子?@Plasmah在另一方面,这本质上是一个经验的宝石,我喜欢它被带到这里。如果“文档模糊性”是一个问题,而“Linus quote”是一个(自我)答案,那么我更愿意这样做,因为它不那么开放,更多的是为未来的用户服务,因此用户需要在这一领域寻找先验知识/抄送\@David?@Plasmah我相信,能够权威地回答这个问题的人数确实非常有限。然而,编写asm并可能需要知道此答案的人数可能会更多。在出错的项目中,编写代码并受asm例程影响的人数更多。如果能在这里找到答案,这三组人都会受益。当然,诀窍在于找到答案。我现在正在写一封电子邮件来列出这个列表。虽然我原则上同意,但在搜索Linux 3.8.4内核源代码时,会发现跨多个体系结构的192个
“+m”
约束实例。对于内核维护者来说,这似乎是一个非常短视的错误。我没有试图开始(或重新启动)任何长期争论。我只是把它作为我能找到的关于这个主题的少数可靠信息来源之一。事实证明,相信本例中的文档是错误的答案(见下面我的答案)。不管文档怎么说,“+m”确实是一个受支持的约束。至于对编译器撒谎,正是这种恐惧引发了这个问题。