傻孩子(GorgonMeducer) · 2021年01月15日

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

作者: GorgonMeducer 傻孩子
首发:裸机思维

image.png
【开门见山】


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

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

【诈尸的armcc】


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

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

image.png

其中陪伴我们时间最长的就是 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的诈尸发布更可谓是一缕来自新年的曙光。


专栏推荐文章

如果你喜欢我的思维,欢迎订阅裸机思维
版权归裸机思维(傻孩子图书工作室旗下公众号)所有,
所有内容原创,严禁任何形式的转载。
推荐阅读
关注数
1480
内容数
118
探讨嵌入式系统开发的相关思维、方法、技巧。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息