【编译器玄学研究报告】后续跟踪(1)——诈尸和翻车

2021-01-22 10:23:55 浏览数 (1)

【开门见山】


在前几期的【编译器玄学报告】中,我们分别介绍了armcc和armclang的一些比较“阴间”的坑——有些是编译器的bug,有一些就单纯只是C语法上的一些陷阱而已,还没有看过的小伙伴赶快点开下面的链接来看看:

  • 第一期:位域和volatile
  • 第二期:break
  • 第三期:“-O0” 就能逃出优化的魔爪么?

因为今天的内容跟他们密切相关

【诈尸的armcc】


原本已经结束产品生命周期的 Arm Compiler 5(armcc)在最新的MDK 5.33中诈尸了——发布了专门修正bug的修订版 5.06u7。

自从2015年对外宣布5.06是“最终绝不修改版”以来,armcc至今一共发布了7个修正版,像极了在毕业论文面前抓狂的你:

其中陪伴我们时间最长的就是 5.06u6了。而【编译器玄学研究报告】第二期和第三期中所涉及的编译器bug就是从 5.06 “自古以来” 的——直到 5.06u7,他们被修正啦!!!

打开安装目录下的 release note (C:/Keil_v5/ARM/ARMCC/sw/info/releasenotes.html)我们会发现:

对应第二期的bug:

[SDCOMP-52460] In certain circumstances, when compiling at -O3 -Otime or with --vectorize, the compiler could generate incorrect code for a break statement within a loop that is within a switch statement. This has been fixed.

对应第三期的bug:

[SDCOMP-52619] In certain circumstances, when compiling code that contains a function F which does not return and is annotated with __attribute__((weak)) or __weak, the compiler could generate code which incorrectly assumed that the final image does not contain a non-weak definition of F that does return. This has been fixed.

当然不要高兴的太早,这并不意味着armcc又回来了,这通常只是“大公司展示自身责任心”的一种擦屁股行为,对于结束了生命周期的产品来说,不能保证此类修正会持续进行。大家还是趁早转向armclang为好

【翻车的armclang】


在第一期的文章中,我们介绍了 volatile 配合位域使用时候的一些语法上的陷阱,并得出结论说——armclang在语法解释上相对armcc更为严格,从而导致了行为上的差异——只要老老实实给保留的位域补上 volatile关键字就行了。

然而,谁能想到打脸来的飞快,在最新的 Arm Compiler 6.15 上,原本6.14.1都一切正常的代码,在6.15却翻车了。不知道有多少“偷懒”没给寄存器添加非对其访问的硬件厂商哭晕在厕所(如果你不知道我在说什么,建议单击这里)。

这当然是Arm Compiler 6.15的锅,好在据消息灵通人士透露,最新的Arm Compiler 6.16内部预览版已经“修正”了这个bug。当然换个角度来说,“现役”编译器这种发现bug立即就修正的速度,也是 armcc这种“退役”老古董所不能比拟的。

【结语】


围观归围观、看笑话归看笑话,Arm Compiler 6作为一个基于LLVM的高可靠性编译器,拥有极高速度的bug修复响应能力,对广大客户来说还是值得信任、未来可期的;对于被“黄金屎山”祝福着的的广大“打工人”来说,Arm Compiler 5.06u7的诈尸发布更可谓是一缕来自新年的曙光。


原创不易,

如果你喜欢我的思维、觉得我的文章对你有所启发,

请务必 “点赞、收藏、转发” 三连,这对我很重要!谢谢!

0 人点赞