探究 Arm Compiler for Embedded 6 的 Clang 版本

server/2025/4/1 20:28:12/

原创标题: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

LIIGOArm 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版本并未在提供的搜索结果中直接明确标注。但根据相关信息可总结以下几点:

  1. 技术架构与Clang的关系
    AC6的核心编译器armclang是Clang的定制版本,整合了LLVM框架和Arm优化的库。Clang作为LLVM的前端,负责代码解析和中间表示生成,而Arm在此基础上扩展了对嵌入式架构(如Cortex-M、Cortex-A等)的优化支持2 7 8。

  2. Clang版本的可能范围

    • 根据AC6的发布时间线(如搜索结果中提到的2016年首次发布),结合Clang的发展历史,推测其可能基于Clang 3.x或更高版本。例如,Clang 3.8(2016年)开始支持C++14标准,而AC6也明确支持C++14,这可能与Clang版本有一定关联1 3。
    • 较新的AC6版本(如6.20.1、6.22)可能对应更新的Clang版本。例如,Clang 10.0(2020年)开始支持Armv8.5-A架构,而AC6支持Armv9-A和Armv8系列架构,暗示其Clang后端可能与此兼容7 9。
  3. 官方文档与版本适配建议
    Arm官方未在搜索结果中公开具体Clang版本,但建议开发者通过以下方式获取准确信息:

    • 使用armclang --version命令查看编译器的详细版本信息(包含Clang和LLVM的版本号)9。
    • 参考Arm官方文档(如《Arm Compiler for Embedded Reference Guide》),其中可能标注了Clang的版本适配关系7。
  4. 实际开发中的注意事项

    • AC6的Clang实现包含了Arm特有的扩展功能(如对TrustZone、SVE2指令集的支持),这些功能可能与标准Clang版本存在差异8 12。
    • 迁移旧项目时需注意,AC6的Clang前端与ARM Compiler 5(基于armcc)不完全兼容,需调整代码和编译选项13 10。

总结:AC6的Clang版本是Arm基于开源Clang/LLVM定制的闭源实现,具体版本号需通过编译器命令或官方文档确认。开发者应关注ArmClang的功能扩展和架构优化,而非单纯依赖开源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。

godbolt12345.png

进入网站后如上图所示,在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版本。


http://www.ppmy.cn/server/180404.html

相关文章

【Mysql:内置函数】

日期函数&#xff1a; 查看当前日期&#xff1a; select current_date();查看当前时间&#xff1a; select current_time(); 查看当前时间戳&#xff1a; select current_timestamp(); 计算两个日期的差值&#xff1a; select datediff(date1,date2); 当前的日期时间&a…

【C++】彻底理解三大智能指针

C 中的智能指针是现代 C 编程中不可或缺的工具&#xff0c;目的是为了解决手动内存管理带来的问题&#xff0c;如内存泄漏、悬空指针等。它们通过 RAII 原理确保资源在适当时候被释放。本报告将详细探讨 std::unique_ptr、std::shared_ptr 和 std::weak_ptr 的特性、用法和最佳…

鸿蒙harmonyOS:笔记 正则表达式

从给出的文本中&#xff0c;按照既定的相关规则&#xff0c;匹配出符合的数据&#xff0c;其中的规则就是正则表达式&#xff0c;使用正则表达式&#xff0c;可以使得我们用简洁的代码就能实现一定复杂的逻辑&#xff0c;比如判断一个邮箱账号是否符合正常的邮箱账号&#xff0…

页码设置相关问题记录

Q&#xff1a;中间没有显示页码怎么办&#xff1f; A&#xff1a;“页眉和页脚”-“页码”-“页面底端”-“普通数字2” Q&#xff1a;想让页码在某几节连续怎么办&#xff1f; A&#xff1a; ① 先保证节与节之间插入了“分节符”&#xff08;如何插入分节符和如何显示分节符…

pycharm2024.1.1版本_jihuo

目录 前置&#xff1a; 步骤&#xff1a; step one 下载软件 step two 卸载旧版本 1 卸载软件 2 清除残余 step three 下载补丁 step four 安装2024.1.1版本软件 step five 安装补丁 1 找位置放补丁 2 自动设置环境变量 step six 输入jihuo码 前置&#xff1a; 之…

Spring Boot自动配置原理解析

文章目录 前言一、SpringBootConfiguration二、EnableAutoConfiguration2.1、AutoConfigurationPackage2.2、Import(AutoConfigurationImportSelector.class) 三、ComponentScan四、自动配置源码4.1、获取所有候选的自动配置类4.2、过滤不满足条件的自动配置 总结 前言 在常规的…

MySQL DQL,数据查询语言的用法

语法&#xff1a;select 字段名 from 表名 [where <条件>]选择符合条件的记录 group by 字段名表 :分组 having <条件> :选择符合条件的组 order by 字段名表 …