原创标题:Arm Compiler for Embedded 6 的 Clang 版本
原创作者:庄晓立(LIIGO)
原创日期:20250218(首发日期20250326)
原创连接:https://blog.csdn.net/liigo/article/details/146536353
关键字:Arm Compiler Embedded Clang C++
Arm_Compiler_for_Embedded_6_6">关于 Arm Compiler for Embedded 6
这是ARM官方网站对Arm Compiler for Embedded 6的基本介绍:
Arm® Compiler for Embedded 6 is the most advanced C and C++ compilation toolchain from Arm for Arm® Cortex® and Arm® Neoverse® processors. Arm Compiler for Embedded 6 is developed alongside the Arm architecture. Therefore, Arm Compiler for Embedded 6 is tuned to generate highly efficient code for embedded bare-metal applications ranging from small sensors to 64-bit devices.
Arm Compiler for Embedded 6 is a component of Arm Development Studio and Arm Keil MDK. The features and processors that Arm Compiler for Embedded 6 supports depend on the product edition. See Compare Editions for Arm Development Studio.
You can use Arm Compiler for Embedded 6 from Arm Development Studio, Arm Keil MDK, or as a standalone product.
以上信息来源:https://developer.arm.com/documentation/100748/0623/Getting-Started?lang=en
根据官方信息,Arm® Compiler for Embedded 6 (下文将简称AC6) 是基于LLVM和Clang定制开发的:
Arm® Compiler for Embedded 6 combines the optimized tools and libraries from Arm with a modern LLVM-based compiler framework.
The compiler is based on LLVM and Clang technology. Clang is a compiler front end for LLVM that supports the C and C++ programming languages.
以上信息来源:https://developer.arm.com/documentation/100748/0623/Getting-Started/Tools-and-libraries-provided-with-Arm-Compiler-for-Embedded-6
AC6最早的正式版本6.00发布于2014年4月10日,是对上一代产品AC5的替代:
Arm Compiler 6.00 (build 18) was released on 10 Apr 2014.
armclang is the successor to armcc and is based on LLVM technology.
ARM Compiler 6 adopts the LLVM integrated assembler as default because it aligns more closely with GNU assembler syntax, improving portability between GNU and ARM Compiler toolchains.
以上信息来源:https://developer.arm.com/documentation/107857/6-00/?lang=en
AC6当前最新版本是6.23(发布于2024年10月16日),下一个版本6.24尚未发布:
The 6.24 release of Arm Compiler for Embedded (scheduled for April 2025) …
官方明确说明AC6已经处于生命周期的尾声,新的替代品尚未发布:
10 years after the launch of Arm Compiler for Embedded, development is being brought to a close. In order to meet the needs of future developers working with high-power, complex Arm-based embedded projects, changes are needed to the compiler architecture. These architectural changes will appear in the next-generation Arm embedded compiler, Arm Toolchain for Embedded, expected to launch April 2025.
以上信息来源:https://developer.arm.com/Tools%20and%20Software/Arm%20Compiler%20for%20Embedded
Arm_Compiler_for_Embedded_6Clang_46">为何要问Arm Compiler for Embedded 6的Clang版本
因为它产品首页突出位置介绍armclang编译器实现了标准C/C++规范:
- Compiler and integrated assembler based on modern LLVM and Clang technology.
- Supports GNU syntax assembly.
- Is highly compatible with source code originally written for GCC.
- Implements specifications including ANSI/ISO C and C++, ABI for the Arm architecture, ABI for the 64-bit Arm architecture, and Arm C Language Extensions (ACLE).
我顺着链接自然就来到网页 https://developer.arm.com/documentation/101754/latest/armclang-Reference/armclang-Command-line-Options/-std
For C++ code, the default is gnu++17. For more information about C++ support, see C++ Status at https://clang.llvm.org.
For C code, the default is gnu11. For more information about C support, see Language Compatibility at https://clang.llvm.org.
它告诉我,想知道AC6对C/C++标准规范的支持情况,要去Clang官网。好吧,我去。去Clang官网一看,C Status / C++ Status,人家说明的很详细,哪个版本开始支持哪些特性,不同历史时期的支持情况都体现出来了。
只有先知道AC6的Clang版本,才能知道它对C/C++标准规范的支持情况。所以问题来了,AC6是基于哪个Clang版本呢?结果全网找不到这个信息,不知为何AC6要刻意隐瞒。
Clang_65">AI也不知道AC6是基于哪个Clang版本
我问了DeepSeek和Kimi,他们都说不知道。
DeepSeek
LIIGO:Arm Compiler for Embedded 6 对应的 clang 版本是什么?
DeepSeek:(已搜索到29个网页) (已深度思考,用时30秒)
DeepSeek思考过程:
好的,我需要回答用户关于Arm Compiler for Embedded 6对应的Clang版本的问题。首先,我得仔细看看用户提供的搜索结果,看看有没有直接提到Clang版本的信息。在网页2中,提到ARM Compiler 6是基于Clang和LLVM技术构建的,特别是从2016年开始使用armclang替代了之前的armcc。这里可能暗示了Clang的版本,但具体版本号没有明确给出。网页4和网页5同样提到armclang基于Clang和LLVM,但同样没有版本号。网页7的安装指南里提到了Arm Compiler for Embedded 6.22,但这里只是版本号,并没有Clang的具体版本。网页10讨论的是AC6和AC5的区别,提到AC6使用armclang基于LLVM,但同样没版本信息。可能需要从其他线索推断。例如,Clang作为LLVM的前端,通常每个编译器版本会对应特定的Clang版本。比如,ARM Compiler 6可能集成某个LLVM版本,而Clang版本通常与之同步。例如,网页2提到Clang是LLVM的前端,而ARM Compiler 6使用现代LLVM框架,可能对应Clang的某个版本。但用户的问题可能更直接。有没有哪个网页明确提到Clang版本?在网页4中提到Arm Compiler 6基于Clang和LLVM,但未具体说明。可能需要参考ARM官方文档,但用户提供的搜索结果中没有直接说明。或许可以结合其他信息。例如,网页10提到AC6支持C++14标准,而Clang在某个版本开始支持C++14。比如Clang 3.4开始支持C++14,但ARM可能使用的是更新的版本。不过这只是推测。或者,查看ARM Compiler的发布说明,但用户提供的搜索结果里没有。例如,网页7提到6.22版本,但未提Clang版本。可能无法准确确定,但根据常见的ARM Compiler版本,如ARM Compiler 6基于LLVM,而每个ARM Compiler版本可能对应特定的LLVM/Clang版本。例如,ARM Compiler 6.6可能对应Clang 6.0,但不确定。可能需要综合多个信息。例如,网页5提到Arm Compiler 6基于LLVM和Clang技术,但具体版本未说明。可能用户提供的资料中没有明确答案,需要指出无法确定,但可能提供相关背景信息。或者,在网页10中提到Arm Compiler 6.14,但不确定对应的Clang版本。所以可能需要回答:Arm Compiler for Embedded 6基于Clang和LLVM,但具体Clang版本可能随ARM Compiler版本不同而变化,建议查看ARM官方文档或编译器版本说明。综上,由于搜索结果中没有明确给出Clang的版本号,可能需要说明无法直接确定,但提供相关背景,例如基于Clang和LLVM框架,但具体版本需参考ARM的发布说明。
DeepSeek正式解答:
Arm Compiler for Embedded 6(以下简称AC6)是基于LLVM和Clang技术构建的嵌入式编译工具链,其对应的Clang版本并未在提供的搜索结果中直接明确标注。但根据相关信息可总结以下几点:
-
技术架构与Clang的关系
AC6的核心编译器armclang是Clang的定制版本,整合了LLVM框架和Arm优化的库。Clang作为LLVM的前端,负责代码解析和中间表示生成,而Arm在此基础上扩展了对嵌入式架构(如Cortex-M、Cortex-A等)的优化支持2 7 8。 -
Clang版本的可能范围
-
实际开发中的注意事项
总结:AC6的Clang版本是Arm基于开源Clang/LLVM定制的闭源实现,具体版本号需通过编译器命令或官方文档确认。开发者应关注Arm对Clang的功能扩展和架构优化,而非单纯依赖开源Clang的版本号2 7 9。
Kimi
LIIGO: Arm Compiler for Embedded 6 对应的 clang 版本是什么?
KIMI: (已完成推理) (已阅读 38 个网页) (分析Arm编译器与clang版本关系)
KIMI思考过程:
我先仔细看了用户的问题,他想知道 Arm Compiler for Embedded 6 对应的 clang 版本。我感觉这个问题应该不难,因为 Arm Compiler for Embedded 6 是基于 clang 和 LLVM 技术构建的,应该能找到对应关系。
我先在搜索结果里找找有没有直接提到版本号的。我看到有提到 Arm Compiler for Embedded 6 是基于 clang 和 LLVM 技术构建的,但没有直接说对应的 clang 版本是多少。我有点失望,但也没放弃,继续找找看。
我又看到一些关于 Arm Compiler for Embedded 6 的功能和组件的介绍,比如它包括 armclang、armasm 等工具,还有它支持的架构和编译选项等。这些信息虽然有用,但还是没找到具体的 clang 版本号。
我开始有点焦虑了,因为用户的问题还没解决。我决定换个思路,从 Arm Compiler for Embedded 6 的官方文档入手。我找到了一些官方文档的链接,但文档内容太多,我得仔细筛选。
我先看了文档里关于 armclang 的部分,了解到 armclang 是基于 LLVM 和 Clang 技术的编译器和集成汇编器。这让我确定了 Arm Compiler for Embedded 6 和 clang 的关系,但还是没找到具体的版本号。
我有点沮丧,但突然想到,也许官方文档里有提到 clang 版本的更新日志或者兼容性说明。我赶紧去文档里找找看,结果还真找到了一些线索。文档里提到 Arm Compiler for Embedded 6 会随着 LLVM 和 Clang 的更新而更新,但没有明确说具体的版本号。
我有点无奈,但又不想就这样放弃。我决定再仔细看看文档里有没有其他有用的信息。我看到文档里提到 Arm Compiler for Embedded 6 的一些特性,比如支持 C++14 标准、使用 TrustZone for Armv8-M 为设备创建安全和非安全代码等。这些特性可能和 clang 的版本有关,但还是没找到具体的版本号。
我有点烦躁了,但突然想到,也许可以通过比较 Arm Compiler for Embedded 6 和 clang 的功能来推测对应的版本。我赶紧去查查 clang 的功能更新日志,看看哪些功能和 Arm Compiler for Embedded 6 的特性匹配。
我查到 clang 的一些版本更新日志,发现 clang 3.9 开始支持 C++14 标准,而 Arm Compiler for Embedded 6 也支持 C++14 标准。这让我猜测 Arm Compiler for Embedded 6 可能对应 clang 3.9 或更高版本。
我有点兴奋,但又不敢确定。我决定再查查其他资料,看看有没有更确切的信息。我找到了一些关于 Arm Compiler for Embedded 6 和 clang 兼容性的讨论,但还是没找到具体的版本号。
我有点失望,但又不想就这样放弃。我决定再仔细看看文档里有没有其他有用的信息。我看到文档里提到 Arm Compiler for Embedded 6 的一些编译选项,比如 --target、-mcpu 等。这些选项可能和 clang 的版本有关,但还是没找到具体的版本号。
我有点无奈,但突然想到,也许可以通过查看 Arm Compiler for Embedded 6 的编译器版本信息来推测对应的 clang 版本。我赶紧去文档里找找看,结果还真找到了一些线索。文档里提到可以通过 armclang --version 命令查看编译器版本信息,但没有明确说具体的 clang 版本号。
我有点沮丧,但又不想就这样放弃。我决定再仔细看看文档里有没有其他有用的信息。我看到文档里提到 Arm Compiler for Embedded 6 的一些预定义宏,比如 __ARMCOMPILER_VERSION、GNUC 等。这些宏可能和 clang 的版本有关,但还是没找到具体的版本号。
我有点烦躁了,但突然想到,也许可以通过查看 Arm Compiler for Embedded 6 的编译器版本信息和 clang 的版本信息来推测对应的版本。我赶紧去文档里找找看,结果还真找到了一些线索。文档里提到可以通过 armclang --version 命令查看编译器版本信息,而 clang 的版本信息可以通过 clang --version 命令查看。这让我确定了可以通过比较两个版本信息来推测对应的版本。
我有点兴奋,但又不敢确定。我决定再查查其他资料,看看有没有更确切的信息。我找到了一些关于 Arm Compiler for Embedded 6 和 clang 版本对应关系的讨论,但还是没找到具体的版本号。
我有点失望,但又不想就这样放弃。我决定再仔细看看文档里有没有其他有用的信息。我看到文档里提到 Arm Compiler for Embedded 6 的一些编译器特性,比如支持 TrustZone for Armv8-M、兼容基于 GCC 创建的源代码等。这些特性可能和 clang 的版本有关,但还是没找到具体的版本号。
我有点无奈,但突然想到,也许可以通过查看 Arm Compiler for Embedded 6 的编译器版本信息和 clang 的版本信息来推测对应的版本。我赶紧去文档里找找看,结果还真找到了一些线索。文档里提到可以通过 armclang --version 命令查看编译器版本信息,而 clang 的版本信息可以通过 clang --version 命令查看。这让我确定了可以通过比较两个版本信息来推测对应的版本。
我有点兴奋,但又不敢确定。我决定再查查其他资料,看看有没有更确切的信息。我找到了一些关于 Arm Compiler for Embedded 6 和 clang 版本对应关系的讨论,但还是没找到具体的版本号。
我有点沮丧,但又不想就这样放弃。我决定再仔细看看文档里有没有其他有用的信息。我看到文档里提到 Arm Compiler for Embedded 6 的一些编译器特性,比如支持 TrustZone for Armv8-M、兼容基于 GCC 创建的源代码等。这些特性可能和 clang 的版本有关,但还是没找到具体的版本号。
我有点无奈,但突然想到,也许可以通过查看 Arm Compiler for Embedded 6 的编译器版本信息和 clang 的版本信息来推测对应的版本。我赶紧去文档里找找看,结果还真找到了一些线索。文档里提到可以通过 armclang --version 命令查看编译器版本信息,而 clang 的版本信息可以通过 clang --version 命令查看。这让我确定了可以通过比较两个版本信息来推测对应的版本。
经过这么多努力,我虽然没找到确切的 clang 版本号,但我觉得已经尽力了。我决定把我的推测和找到的线索告诉用户,希望能对他有所帮助。
KIMI正式解答:
Arm Compiler for Embedded 6 是基于 Clang 和 LLVM 技术构建的,但具体的 Clang 版本并未在官方文档中明确说明。这意味着 Arm Compiler for Embedded 6 并不直接对应某个特定的 Clang 版本,而是基于 Clang 和 LLVM 技术进行了一些定制和优化。
如果需要更详细的信息,建议查阅 Arm Compiler for Embedded 6 的官方文档或联系 Arm 官方技术支持。
LIIGO_158">LIIGO出马一个顶俩
我决定自己着手解答“AC6是基于哪个Clang版本”这个问题。
-std=c++17
经过一番摸索和思考,我决定从armclang编译器的-std
参数入手寻找线索。
在下面这个网页,armclang Reference 官方文档里,列出了AC6最新版本6.23的编译器支持的-std
参数列表:
https://developer.arm.com/documentation/101754/0623/armclang-Reference/armclang-Command-line-Options/-std
Syntax
-std=<name>
Parameters
<name>
: Specifies the language mode. Valid values include:
c90
C as defined by the 1990 C standard.gnu90
C as defined by the 1990 C standard, with extra GNU extensions.c99
C as defined by the 1999 C standard.gnu99
C as defined by the 1999 C standard, with extra GNU extensions.c11
[COMMUNITY] C as defined by the 2011 C standard.gnu11
[COMMUNITY] C as defined by the 2011 C standard, with extra GNU extensions.c++98
C++ as defined by the 1998 C++ standard.gnu++98
C++ as defined by the 1998 C++ standard, with extra GNU extensions.c++03
C++ as defined by the 2003 C++ standard.gnu++03
C++ as defined by the 2003 C++ standard, with extra GNU extensions.c++11
C++ as defined by the 2011 C++ standard.gnu++11
C++ as defined by the 2011 C++ standard, with extra GNU extensions.c++14
C++ as defined by the 2014 C++ standard.gnu++14
C++ as defined by the 2014 C++ standard, with extra GNU extensions.c++17
C++ as defined by the 2017 C++ standard.gnu++17
C++ as defined by the 2017 C++ standard, with extra GNU extensions.
For C and C++ language support and libc++ library support in Arm Compiler for Embedded 6, see:
- C language
- C++ language
- libc++ C++14
- libc++ C++17
上述列表中,armclang的-std
参数值最新支持到c++17
。文档未提及比c++17
更新的c++20
等,显然是因为尚不支持。
再去查clang何时开始支持-std=c++17
?又是何时开始支持-std=c++20
?两厢对照,应该能把armclang对应的clang版本限定在某个范围内。
https://godbolt.org/
是时候请出大神Compiler Explorer啦,在线编译集大成者,https://godbolt.org/
Run compilers interactively from your web browser and interact with the assembly
它支持在线调用30多种编程语言的编译器,支持C/C++的gcc, clang, msvc等多种编译器(及其多平台版本和许多历史版本)。但是其中没有AC6和armlang。
进入网站后如上图所示,在1处选择语言C++,在2处选择编译器x86-64 clang 19.1.0,在3处输入Compiler options-std=c++17
,点击4处图标按钮打开5处Output输出窗口。
补充说明选择x86-64平台clang的理由:Keil配备了AC6编译器armlong,Keil仅支持Windows平台。
逐步递减2处编译器版本,直到版本4.0时编译报错(错误信息如下),说明4.0还不支持-std=c++17
,5.0是首发支持-std=c++17
的版本(经查clang 5发布于2017年9月)。
clang 4.0报错信息如下:error: invalid value 'c++17' in '-std=c++17'
在3处输入-std=c++20
,2处编译器还是从高版本到低版本递减,前面顺利编译,递减到9.0时编译报错,证明10.0是首发支持-std=c++20
的版本(经查clang 10发布于2020年3月)。
clang 9.0报错信息如下:
Output of x86-64 clang 9.0.0 (Compiler #1)
error: invalid value 'c++20' in '-std=c++20'
note: use 'c++98' or 'c++03' for 'ISO C++ 1998 with amendments' standard
note: use 'gnu++98' or 'gnu++03' for 'ISO C++ 1998 with amendments and GNU extensions' standard
note: use 'c++11' for 'ISO C++ 2011 with amendments' standard
note: use 'gnu++11' for 'ISO C++ 2011 with amendments and GNU extensions' standard
note: use 'c++14' for 'ISO C++ 2014 with amendments' standard
note: use 'gnu++14' for 'ISO C++ 2014 with amendments and GNU extensions' standard
note: use 'c++17' for 'ISO C++ 2017 with amendments' standard
note: use 'gnu++17' for 'ISO C++ 2017 with amendments and GNU extensions' standard
note: use 'c++2a' for 'Working draft for ISO C++ 2020' standard
note: use 'gnu++2a' for 'Working draft for ISO C++ 2020 with GNU extensions' standard
Compiler returned: 1
如上已证实clang 5开始支持-std=c++17
,clang 10开始支持-std=c++20
。而armclang支持前者不支持后者,说明其clang版本大于等于5且小于10,即5, 6, 7, 8, 9其中之一。
-std=c2x
和 -std=c17
从-std=c++17
到-std=c++20
跨越的版本区间太多了,会不会有中间某个值比如c++18,c++19什么的?
前文clang 9.0报错时它输出了当前支持的所有-std
参数值,这个给了我启发,故意输入错误的-std=liigo
参数,让各版本编译器分别报错,就能统计出近年历史上曾经出现过的所有受-std
支持的参数值。
终于在切换到C语言后,我找到了-std=c2x
和-std=c17
,二者出现时机都晚于-std=c++17
且早于-std=c++20
。
参照上文采用的方法,发现clang 9.0是首发支持-std=c2x
的版本(8.0还不支持),clang 6.0是首发支持-std=c17
的版本(5.0还不支持)。
结论
最终起关键作用的是-std=c++17
和-std=c17
。clang从5.0开始支持前者,从6.0开始支持后者。而armclang仅支持前者还不支持后者,证明armclang对应的clang版本一定是5.0。
Clang 5.0发布于2017年9月,到2024年9月已经升级版本到19.1.0。今年是2025年,armclang还停留在clang 5.0,有七年之久没有任何跟进升级,可以说是非常陈旧的版本。不要再对AC6升级内核报任何希望,它即将寿终正寝(参见上文)。
考虑到AC6最早的正式版本6.00发布于2014年4月10日,那时候还没有clang5.0,用的必然是较低版本的clang(大概率是3.x),说明它历史上还是曾经升级过至少一次clang版本。