原創標題: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
這是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 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要刻意隱瞞。
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的發布時間線(如搜索結果中提到的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。
-
官方文檔與版本適配建議
Arm官方未在搜索結果中公開具體Clang版本,但建議開發者通過以下方式獲取準確信息:- 使用armclang --version命令查看編譯器的詳細版本信息(包含Clang和LLVM的版本號)9。
- 參考Arm官方文檔(如《Arm Compiler for Embedded Reference Guide》),其中可能標注了Clang的版本適配關系7。
-
實際開發中的注意事項
- AC6的Clang實現包含了Arm特有的擴展功能(如對TrustZone、SVE2指令集的支持),這些功能可能與標準Clang版本存在差異8 12。
- 遷移舊項目時需注意,AC6的Clang前端與ARM Compiler 5(基于armcc)不完全兼容,需調整代碼和編譯選項13 10。
總結: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出馬一個頂倆
我決定自己著手解答“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版本。