最近分析了一下ARMCC编译器对于builtin函数的一些优化手段,与GCC不同,值得学习。在这里写出来与大家分享
1.Printf
1.1前言
GCC前端调用fold_builtin_printf函数进行printf函数的fold优化。单个字符打印优化成putchar。在string中不包含%的情况下,printf("string\n");优化成puts。
但是在参数1包含%的情况下,情况就不妙了,GCC就没有什么优化手段。比如所有源文件只使用%d的打印功能时,却链接了完整的printf库函数。而printf库函数中针对%c%l等标志的打印分支根本就派不上用场,这里就有了优化的空间,我们来看看ARMCC是如何实现的。
1.2编译器
int a = 1;
printf("%d",a);
armcc -S t.c -O2
查看生成的汇编文件,首先发现调用的是__2printf函数。
还生成了一些奇怪的伪指令
REQUIRE _printf_percent
REQUIRE _printf_d
REQUIRE _printf_int_dec
IMPORT _printf_percent [CODE]
IMPORT _printf_d [CODE]
IMPORT _printf_int_dec [CODE]
很明显可以看出,是对应printf参数生成的