25:LLVM 简介和编译流程详解

2020-05-20  本文已影响0人  小瞎_MarkDash

目录

image.png

传统编译器设计

image.png

前端 (Frontend)

负责解析源代码,进行:

优化器 (Optimizer)

负责进行各种优化。例如消除冗余计算 (甚至直接将方法优化成一个固定值,而不去调用方法)等。

后端 (Backend)

将代码映射到目标指令集。生成机器语言,此过程会再次优化 (机器语言层面)。

LLVM 的设计

Clang 编译流程

ClangLLVM的一个子项目。它属于整个LLVM架构的编译器 前端,负责编译 CC++Objective-C

运行命令,打印源码编译阶段

运行命令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

1: 预处理

2.1: 编译-词法分析 (切割词)

2.2: 编译-语法分析 (重新组合,生成抽象语法树)

2.3 / 3.0: 生成中间码 IR (Intermediate Representation) / Pass 优化

LLVM的优化使用了叫Pass的东西,可以理解为优化节点,每个节点负责不同的优化事项 (跳转、运算等),一个个Pass搞下来,逻辑处理发生变化,就完成了优化。如果想玩LLVM优化可以试试写Pass

Pass能使FuncA→FuncB→FuncC变成FuncA→FuncC甚至FuncA(算好的值);也能使FuncA→FuncB变成FuncA→FuncX→FuncY→FuncB,变得复杂,做到混淆效果。不光是逻辑,其中的局部标识也能增加。直接混淆还能看懂些,优化完以后再混淆就真的难看懂。

2.4: Bitcode

Xcode7以后,Enable Bitcode苹果会在IR的基础上做进一步的优化,生成.bc代码。

iOS端:Bitcode可选
watchOS端:Bitcode必选
macOS端:Bitcode不可选

3.1: 生成汇编代码 (属于 后端Backend / 代码生成器CodeGenerator)

汇编代码可以由.ll.bc代码生成。

4: 生成目标文件 .o

汇编器将汇编代码转换为机器代码,这就是.o文件 (object file)。

5. 生成可执行文件 Mach-O

链接器 (Linker) 把.o文件和.dylib .a文件 生成一个Mach-O文件。

现在是编译阶段,这个Linker不是dylddyld是运行时的事情。

上一篇下一篇

猜你喜欢

热点阅读