ARM过程调用标准是否允许与C标准矛盾的易失性优化?

问题描述 投票:3回答:1

来自ARM体系结构的过程调用标准(§7.1.5):

编译器可能会忽略自动变量的易失性限定除非函数调用,否则其地址永远不会被占用的变量setjmp()。

这意味着在以下代码中:

volatile int x = 8;
if (x == 1)
{
    printf("can be optimised away??");
}

整个if范围可以优化吗?

这只是与标准相矛盾,对于初学者来说,易失性访问是可观察到的行为的一部分,必须像抽象机器代码中那样执行:

§5.1.2.3

对合规实现的最低要求是:

严格按照抽象机的规则。

还有§6.7.3

具有volatile限定类型的对象可以通过以下方式修改实现未知或具有其他未知副作用。因此任何引用此类对象的表达式为严格按照抽象机的规则进行评估]

有矛盾吗?如果是这样,PCS与C标准相抵触的合法性如何?

c arm language-lawyer volatile abi
1个回答
0
投票
因此,我进入了ARM工具链的支持小组,根据他们的意见,ARM PCS标准是一个独立的标准,未绑定到C标准,因此编译器可以选择遵守其中一个或两个。用自己的话说:

从某种意义上说,这并不是真正的矛盾

    APCS允许编译器尊重或忽略本地易失性
  • C标准要求编译器遵守本地易失性
  • 因此,与两者兼容的编译器将遵守本地易失性。

    [Armclang已选择遵循C标准,这使其与两者兼容

  • 因此,如果编译器选择执行此不符合C的优化,则它仍然是符合ARM PCS的实现,而不是符合C的编译器。

    最后,实现ARM PCS的用于ARM体系结构的C兼容编译器将永远不会执行此优化。

    © www.soinside.com 2019 - 2024. All rights reserved.