【开门见山】
在前几期的【编译器玄学报告】中,我们分别介绍了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的诈尸发布更可谓是一缕来自新年的曙光。
原创不易,
如果你喜欢我的思维、觉得我的文章对你有所启发,
请务必 “点赞、收藏、转发” 三连,这对我很重要!谢谢!