iOS之LLVM 三

116 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

生成IR中间代码

完成以上步骤后,就会开始生成IR中间代码,代码生成器(Code Generator)会将语法树自顶向下遍历,逐步翻译成LLVM IR

通过以下命令,可以生成.ll文件,查看IR代码:

clang -S -fobjc-arc -emit-llvm main.m
  • Objective-C代码,在这一步会进行Runtime的桥接:property合成,ARC处理等 查看IR中间代码:

image-6.png IR基本语法介绍:

  • @:全局标示
  • %:局部标示
  • alloca:开辟空间
  • align:内存对齐
  • i3232bit4字节
  • store:写入内存
  • load:读取数据
  • call:调用函数
  • ret:返回
IR的优化

Xcode中,找到TargetBuild SettingOptimization Level,可以对当前项目设置优化等级

LLVM中,优化级别分别是-O0-O1-O2-O3-Os(第一个是大写英文字母O

通过以下命令,可设置优化等级,并生成IR代码:

clang -Os -S -fobjc-arc -emit-llvm main.m -o main.ll

查看优化后的IR代码:

image-7.png

  • main函数中的代码优化的非常简短,直接计算出结果并返回
Bitcode

Xcode7以后,开启Bitcode设置,苹果会做进一步的优化,生成.bc中间代码

命令:

clang -emit-llvm -c main.ll -o main.bc

什么是Bitcode

Bitcode是被编译程序的一种中间形式的代码。包含Bitcode并上传到App Store ConnectApp,会在App Store上编译和链接。包含Bitcode可以在不提交新版本App的情况下,允许Apple在将来的时候再次优化你的App二进制文件

Xcode中,默认开启Bitcode设置。如果你的App支持BitcodeApp使用到的其他二进制形式也要支持Bitcode,否则就会报错

解决Bitcode报错只有两种方案:

  • 【方案一】将不支持BitcodeSDK移除掉,或等待第三方更新
  • 【方案二】:将使用Bitcode的选项设置为NO

生成汇编代码

通过最终的.ll.bc代码,生成汇编代码

命令:

clang -S -fobjc-arc main.ll -o main.s
clang -S -fobjc-arc main.bc -o main.s

查看汇编代码:

image-8.png 汇编代码也可以设置OPT的优化等级进行优化

clang -Os -S -fobjc-arc main.ll -o main.s

查看优化后的汇编代码:

image-9.png