llvm+clang

https://www.jianshu.com/p/96058bf1ecc2

https://www.jianshu.com/p/1d8d1c079e4e

https://blog.csdn.net/talentedlas/article/details/51945569

一>clang编译过程

clang + LLVM clang作为编译前端,LLVM作为编译后端,

1.查看编译的步骤

clang -ccc-print-phases main.m

aofeilindeMacBook-Pro:ocDemo aofeilin$ clang -ccc-print-phases main.m

0: input, "main.m", objective-c

1: preprocessor, {0}, objective-c-cpp-output

2: compiler, {1}, ir

3: backend, {2}, assembler

4: assembler, {3}, object

5: linker, {4}, image

6: bind-arch, "x86_64", {5}, image

2.预处理完成后就会进行词法分析,这里会把代码切成一个个 Token,比如大小括号,等于号还有字符串等。

clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m

3.然后是语法分析,验证语法是否正确,然后将所有节点组成抽象语法树 AST 。

clang -fmodules -fsyntax-only -Xclang -ast-dump main.m

4.这里 LLVM 会去做些优化工作,在 Xcode 的编译设置里也可以设置优化级别-01,-03,-0s,还可以写些自己的 Pass,官方有比较完整的 Pass 教程: Writing an LLVM Pass — LLVM 5 documentation 。

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

5.Pass 是 LLVM 优化工作的一个节点,一个节点做些事,一起加起来就构成了 LLVM 完整的优化和转化。

如果开启了 bitcode 苹果会做进一步的优化,有新的后端架构还是可以用这份优化过的 bitcode 去生成。

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

6.生成汇编
clang -S -fobjc-arc main.m -o main.s

7.生成目标文件
clang -fmodules -c main.m -o main.o

llvm+clang_第1张图片
77821-33c15724bd87c803.png

二>LLVM 会进行机器无关的代码优化,生成机器语言,代码优化。
llvm+clang_第2张图片
20160718211639694.png

https://blog.csdn.net/hitfyb/article/details/50876207

https://segmentfault.com/a/1190000003101087

View->Navigators->Show report Navigator—by time 打开日志查看执行过程

1.执行Xcode build的流程


C09ED3D86178CDDC60CD04D2D66FF447.png
llvm+clang_第3张图片
6850647E7544E488D22F000ACFCF53F7.png
F3AA7D39EE433A216D721B0ADCD56736.png
llvm+clang_第4张图片
25878B3EC7EE35734BA847ABBF3F0F4B.png

下面是完整步骤:
1.编译信息写入辅助文件,创建文件架构 .app 文件
2.处理文件打包信息
3.执行 CocoaPod 编译前脚本,checkPods Manifest.lock
4.编译.m文件,使用 CompileC 和 clang 命令
5.链接需要的 Framework
6.编译 xib
7.拷贝 xib ,资源文件
8.编译 ImageAssets
9.处理 info.plist
10.执行 CocoaPod 脚本
11.拷贝标准库
12.创建 .app 文件和签名

编译器后端进行与机器无关的代码优化,生成机器语言,后端的处理。

你可能感兴趣的:(llvm+clang)