一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
生成IR中间代码
完成以上步骤后,就会开始生成IR中间代码,代码生成器(Code Generator)会将语法树自顶向下遍历,逐步翻译成LLVM IR
通过以下命令,可以生成.ll文件,查看IR代码:
clang -S -fobjc-arc -emit-llvm main.m
Objective-C代码,在这一步会进行Runtime的桥接:property合成,ARC处理等 查看IR中间代码:
IR基本语法介绍:
@:全局标示%:局部标示alloca:开辟空间align:内存对齐i32:32个bit,4字节store:写入内存load:读取数据call:调用函数ret:返回
IR的优化
在Xcode中,找到Target→Build Setting→Optimization Level,可以对当前项目设置优化等级
在LLVM中,优化级别分别是-O0、-O1、-O2、-O3、-Os(第一个是大写英文字母O)
通过以下命令,可设置优化等级,并生成IR代码:
clang -Os -S -fobjc-arc -emit-llvm main.m -o main.ll
查看优化后的IR代码:
main函数中的代码优化的非常简短,直接计算出结果并返回
Bitcode
Xcode7以后,开启Bitcode设置,苹果会做进一步的优化,生成.bc中间代码
命令:
clang -emit-llvm -c main.ll -o main.bc
什么是Bitcode?
Bitcode是被编译程序的一种中间形式的代码。包含Bitcode并上传到App Store Connect的App,会在App Store上编译和链接。包含Bitcode可以在不提交新版本App的情况下,允许Apple在将来的时候再次优化你的App二进制文件
在Xcode中,默认开启Bitcode设置。如果你的App支持Bitcode,App使用到的其他二进制形式也要支持Bitcode,否则就会报错
解决Bitcode报错只有两种方案:
- 【方案一】将不支持
Bitcode的SDK移除掉,或等待第三方更新 - 【方案二】:将使用
Bitcode的选项设置为NO
生成汇编代码
通过最终的.ll或.bc代码,生成汇编代码
命令:
clang -S -fobjc-arc main.ll -o main.s
clang -S -fobjc-arc main.bc -o main.s
查看汇编代码:
汇编代码也可以设置
OPT的优化等级进行优化
clang -Os -S -fobjc-arc main.ll -o main.s
查看优化后的汇编代码: