常用指令
clang 常用指令
# 查看编译的步骤
$ 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
# 查看编译结果
$ clang -rewrite-objc main.m
# 查看操作内部命令,可以使用 -### 命令
$ clang -### main.m -o main
代码执行步骤
-
预处理完成后就会进行词法分析,这里会把代码切成一个个
Token ,比如大小括号,等于号还有字符串等。clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m
。 -
然后是语法分析,验证语法是否正确,然后将所有节点组成抽象语法树
AST 。clang -fmodules -fsyntax-only -Xclang -ast-dump main.m
-
完成这些步骤后就可以开始
IR(intermediate representation) 中间代码的生成了,CodeGen 会负责将语法树自顶向下遍历逐步翻译成LLVM IR ,IR 是编译过程的前端的输出后端的输入。clang -S -fobjc-arc -emit-llvm main.m -o main.ll
-
这里
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
-
Pass 是LLVM 优化工作的一个节点,一个节点做些事,一起加起来就构成了LLVM 完整的优化和转化。如果开启了bitcode 苹果会做进一步的优化,有新的后端架构还是可以用这份优化过的bitcode 去生成。clang -emit-llvm -c main.m -o main.bc
-
生成汇编。
clang -S -fobjc-arc main.m -o main.s
-
生成目标文件。
clang -fmodules -c main.m -o main.o