首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARM程序调用标准是否允许与C标准相矛盾的易失性优化?

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

Stack Overflow用户
提问于 2019-09-14 08:51:50
回答 1查看 186关注 0票数 3

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

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

这是否意味着在以下代码中:

代码语言:javascript
复制
volatile int x = 8;
if (x == 1)
{
    printf("can be optimised away??");
}

整个if范围可以优化吗?

这违反了标准,首先,易失性访问是可观察行为的一部分,必须按照抽象机器代码的方式执行:

第5.1.2.3节

对符合标准的实现的最低要求是: 对易失性对象的访问严格按照抽象机器的规则进行评估。

也有第6.7.3节

具有易失性限定类型的对象可以以实现未知的方式进行修改,或者具有其他未知的副作用。因此,引用这样一个对象的任何表达式都必须严格按照抽象机器的规则进行计算。

有矛盾吗?如果是这样的话,PCS与C标准的矛盾又是如何成立的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-19 18:02:13

因此,我到达了ARM工具链的支持组,根据它们,ARM PCS标准是一个独立的标准,不受C标准的约束,因此编译器可以选择遵守其中一个标准或两者。用他们自己的话说:

在某种程度上这并不是一个矛盾

  • APCS允许编译器尊重或忽略本地易失性。
  • C标准要求编译器尊重本地易失性。

因此,与两者兼容的编译器将尊重本地易失性。

Armclang选择遵循C标准,这使得它与两者兼容。

因此,如果编译器选择执行这种不符合C的优化,那么它仍然是ARM PCS一致性实现,而不是符合C的编译器。

总之,实现ARM PCS的ARM体系结构的C兼容编译器永远不会执行这种优化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57933921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档