【问题标题】:Clang-15 vs Clang-14 local static init guardsClang-15 与 Clang-14 本地静态初始化守卫
【发布时间】:2022-10-02 06:18:23
【问题描述】:

我正在使用 Clang++ 为 Cortex-M0+ 目标进行编译,并且在从版本 14 迁移到版本 15 时,我发现为本地静态变量的保护变量生成的代码有所不同。

因此,例如:

int foo()
{
    static int x = 1;
    ...
}

Clang-14 生成以下内容:

ldr r0, .LCPI0_4
ldrb    r0, [r0]
dmb sy
lsls    r0, r0, #31
beq .LBB0_8

Clang-15 现在生成:

ldr r0, .LCPI0_4
movs    r1, #2
bl  __atomic_load_1
lsls    r0, r0, #31
beq .LBB0_8

为什么改变? Clang 14 代码不正确吗?

    标签: static clang atomic clang++ cortex-m


    【解决方案1】:

    谁都没有错。只是在第一个版本中,执行原子加载的代码是内联的,而在第二个版本中,它被称为库函数。如果您查看__atomic_load_1 中的代码,您可能会发现它执行完全相同的指令或等效指令。

    每种方式都有优点和缺点。内联版本避免了函数调用的开销,而库版本可以在运行时选择最适合实际运行时 CPU 特性的代码。

    差异可能是 clang 版本之间有意识的设计更改,或者您使用的代码生成和优化选项的差异,或者构建 clang 安装时的不同配置选项。其他人可能知道有关控制此内容的更多详细信息。但就代码的正确行为而言,无需担心。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-15
      • 2019-07-25
      • 2018-07-29
      • 2021-12-31
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      相关资源
      最近更新 更多