硬汉嵌入式论坛

 找回密码
 立即注册
查看: 948|回复: 22
收起左侧

[其它] 用LLVM for ARM 代替 Keil 的AC6(armclang)编译,LLVM完全碾压GCC

  [复制链接]

12

主题

32

回帖

68

积分

初级会员

积分
68
发表于 2025-4-16 15:20:47 | 显示全部楼层 |阅读模式
本帖最后由 huanglaihei 于 2025-4-16 15:40 编辑

LLVM使用:
LLVM-ET-Arm-19.1.5-Windows-x86_64

GCC使用:
arm-gnu-toolchain-14.2.rel1-mingw-w64-i686-arm-none-eabi

armclang(AC6)使用:
ARMCompiler6.22_standalone_win-x86_64

编译文件,不链接,优化开到最大。
1744788193861.jpg

c文件不包含标准库
编辑体积比较:
llvm for arm
llvm.jpg


GCC
gcc.jpg

armclang(AC6)
ac6.jpg


体积比较:
armclang(AC6) = 5.05KB     <   llvm for arm = 5.38KB      <   GCC = 9.10KB

llvm for arm 开源链接:
https://github.com/arm/arm-toolc ... m-software/embedded
https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm





回复

使用道具 举报

12

主题

32

回帖

68

积分

初级会员

积分
68
 楼主| 发表于 2025-4-16 15:35:32 | 显示全部楼层
本帖最后由 huanglaihei 于 2025-4-16 16:32 编辑

兄弟们,llvm for arm 是 开源的,编译效率比GCC强太多了,而且在windowns上配合Ninja, 编译速度和keil 的上ac6 一样快!!!(好像还更快?)     
总之,windowns 上用llvm for arm + Ninja 能直接秒杀给 网上绝大多数教程的 gcc + MinGW,能秒杀到渣都不剩,当然仅限单片机开发
回复

使用道具 举报

12

主题

32

回帖

68

积分

初级会员

积分
68
 楼主| 发表于 2025-4-16 15:35:39 | 显示全部楼层
本帖最后由 huanglaihei 于 2025-4-16 16:32 编辑

兄弟们,llvm for arm 是 开源的,编译效率比GCC强太多了,而且在windowns上配合Ninja, 编译速度和keil 的上ac6 一样快!!!(好像还更快?)     
总之,windowns 上用llvm for arm + Ninja 能直接秒杀给 网上绝大多数教程的 gcc + MinGW,能秒杀到渣都不剩,当然仅限单片机开发
回复

使用道具 举报

2

主题

17

回帖

23

积分

新手上路

积分
23
发表于 2025-4-16 17:25:16 | 显示全部楼层
不知道怎么使用
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2025-4-16 18:10:37 | 显示全部楼层
使用gcc的O0调试挺好,使用armclang的调试体验感觉有些差。完了也试试clang。感谢分享,塞班
回复

使用道具 举报

12

主题

32

回帖

68

积分

初级会员

积分
68
 楼主| 发表于 2025-4-16 19:21:37 | 显示全部楼层

后面我出个简易教程
回复

使用道具 举报

2

主题

66

回帖

72

积分

初级会员

积分
72
发表于 2025-4-16 19:41:35 | 显示全部楼层
比较编译器生成的代码大小,哪有用object文件的尺寸作为依据的
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2025-4-16 19:52:16 来自手机 | 显示全部楼层
感觉资料很少啊
回复

使用道具 举报

12

主题

32

回帖

68

积分

初级会员

积分
68
 楼主| 发表于 2025-4-16 19:52:46 | 显示全部楼层
qinfeng173 发表于 2025-4-16 19:41
比较编译器生成的代码大小,哪有用object文件的尺寸作为依据的

程序很简单,没有使用C库,链接也只是将目标文件里的二进制文件链接到一起,
回复

使用道具 举报

81

主题

490

回帖

733

积分

金牌会员

积分
733
发表于 2025-4-16 20:20:12 | 显示全部楼层
需要写cmake吗?
回复

使用道具 举报

12

主题

32

回帖

68

积分

初级会员

积分
68
 楼主| 发表于 2025-4-16 20:29:18 | 显示全部楼层

用camke管理很方便,当然不用cmake也可以,毕竟单片机项目的文件一般不会很多,自己手动管理makefile也没有问题
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2025-4-16 22:35:35 | 显示全部楼层
huanglaihei 发表于 2025-4-16 20:29
用camke管理很方便,当然不用cmake也可以,毕竟单片机项目的文件一般不会很多,自己手动管理makefile也没 ...

系统include目录不太好设置,使用或者不使用浮点还得改 一下系统目录,没法通过编译参数自动找
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2025-4-16 23:02:10 | 显示全部楼层
貌似可以使用multilib.yaml来实现系统目录的自动选择,我先研究一下怎么用
回复

使用道具 举报

3

主题

382

回帖

391

积分

高级会员

积分
391
发表于 2025-4-16 23:54:04 | 显示全部楼层
huanglaihei 发表于 2025-4-16 20:29
用camke管理很方便,当然不用cmake也可以,毕竟单片机项目的文件一般不会很多,自己手动管理makefile也没 ...

白嫖mdk傻孩子大佬是专业的,gcc的好像说还可以用RTE
【教程】如何用GCC“零汇编”白嫖MDK
https://mp.weixin.qq.com/s?__biz ... 189#wechat_redirect
回复

使用道具 举报

2

主题

66

回帖

72

积分

初级会员

积分
72
发表于 2025-4-17 11:09:50 | 显示全部楼层
huanglaihei 发表于 2025-4-16 19:52
程序很简单,没有使用C库,链接也只是将目标文件里的二进制文件链接到一起,

你都要比较代码大小了,研究一下具体的代码和常量段的尺寸难道不是基本操作?从来没听说用object文件的大小来评估代码大小的,object文件里面除了真实代码和数据之外,其他乱七八糟的东西多了去了。回到你的题目,现代LLVM和GCC编译器的优化结果不可能有这么大差别,对于hello.c这样简单的代码,能差个几十个字节顶天了。
回复

使用道具 举报

0

主题

15

回帖

15

积分

新手上路

积分
15
发表于 2025-4-17 11:36:52 | 显示全部楼层
qinfeng173 发表于 2025-4-17 11:09
你都要比较代码大小了,研究一下具体的代码和常量段的尺寸难道不是基本操作?从来没听说用object文件的大 ...

是 的 ,object文件中可能还塞了调试信息。不准确的很。另外我试了整个工程gcc O0编译下来,甚至比ARM CLANG 还小。IAR编译出来的尺寸是最小的
回复

使用道具 举报

12

主题

32

回帖

68

积分

初级会员

积分
68
 楼主| 发表于 2025-4-17 12:19:14 | 显示全部楼层
qinfeng173 发表于 2025-4-17 11:09
你都要比较代码大小了,研究一下具体的代码和常量段的尺寸难道不是基本操作?从来没听说用object文件的大 ...

我这样测试确实不太严谨,我昨晚在另一台电脑上用 coremark 跑过,优化拉满,不使用浮点,LLVM确实遥遥领先,包括链接之后的程序大小也是仅次于armclang,因为现在用的电脑没有环境无法截图发出来,后面补上。这个目标文件里主要有 机器代码, 数据段,符号表 重定位信息 段头表 等,没有调试信息,我看了 .text .data .bss, 发现gcc和llvm 差距很大,后面我再补充下浮点运算的情况
回复

使用道具 举报

10

主题

678

回帖

708

积分

金牌会员

积分
708
发表于 2025-4-17 14:31:49 | 显示全部楼层
大佬,来个傻瓜教程。谢谢。
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2025-4-17 14:53:49 | 显示全部楼层
gcc 不会差的,反倒是 llvm 有中间层抽象,很难优化到极致
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2025-4-17 22:17:32 | 显示全部楼层
我在stm32f401上对比了一下gcc和clang的coremark跑分。确实clang编译出来程序性能要好很多。工程是基于cmake的,可以clion打开,仓库 https://github.com/luchenxu73/stm32-compiler-benchmark
回复

使用道具 举报

9

主题

171

回帖

198

积分

初级会员

积分
198
发表于 3 天前 | 显示全部楼层
参考前面网友的帖子, 我也在现成的工程测试了一下 FLASH 占用 (不严格测试)
GCC 13.3 -> Os 编译, 编译参数基本相同
FLASH : 64.195K
RAM : 45.383K

LLVM (ATfE 20.1.0) -> Os 编译参数基本相同
FLASH : 72.035K
RAM : 45K

两者程序都能正确运行, 其中 LLVM 编译的 RAM 占用比 GCC 少 0.383K, FLASH 比 GCC 多 7.84K, 不知道是哪里的问题

PS: 网友的测试 LLVM RT-Thread 测试 结果也类似
回复

使用道具 举报

0

主题

80

回帖

80

积分

初级会员

积分
80
发表于 昨天 10:23 | 显示全部楼层
LLVM的汇编代码兼容GCC吗?以前考虑用使用免费的GCC开发环境,要用STM32时已经切换到GCC了
结果后面缺货换回国产MCU后又要切回来。国产MCU很多是没做GCC支持的,用GCC只能自己写启动代码和链接工具
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 昨天 13:54 来自手机 | 显示全部楼层
cowen 发表于 2025-4-24 10:23
LLVM的汇编代码兼容GCC吗?以前考虑用使用免费的GCC开发环境,要用STM32时已经切换到GCC了
结果后面缺货换 ...

兼容的,有些地方要改改而已。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-4-25 19:12 , Processed in 0.367454 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表