LLVM和iOS文件编译过程

2020-07-06  本文已影响0人  今晚打老虎_9527

编译器背景

GCC

image

LLVM

LLVM比gcc的优势是模块化,中间端都是统一的,添加新的语言的话,只需要添加一个新的前端就行

image

Clang

clang是LLVM的子项目,是LLVM架构里C族编译器的前端


image

对比GCC优点:

OC文件的编译过程

#import "Person.h"
#import <UIKit/UIKit.h>

@implementation Person

- (void)test {
    UIApplication *app = [UIApplication sharedApplication];
    UIView *statusBar = [app valueForKey :@"statusBar"];
    NSLog(@"%@", statusBar);
}

@end

终端输入clang -ccc-print-phases Person.m,可以查看编译过程

image
  1. 找到这个文件

  2. 预处理,替换import,include,宏定义

    终端输入clang -E Person.m,可以查看预处理结果

  3. 词法分析,生成token,后面的loc代表行号和第几个字符

    终端输入clang -fmodules -E -Xclang -dump-tokens Person.m

image
  1. 语法分析,token拼接,生成语法树(AST)

    终端输入clang -fmodules -fsyntax-only -Xclang -ast-dump Person.m

image
  1. 生成中间代码,IR
    LLVM IR有3种表现形式

    • text,便于阅读的文本格式,类似汇编,拓展名为.ll,clang -S -emit-llvm main.m
    • memory,内存格式
    • bitcode,二进制格式,拓展名为.bt,clang -c -emit-llvm main.m
  2. 汇编

  3. 链接

  4. 转成目标可执行文件

上一篇下一篇

猜你喜欢

热点阅读