【LLVM】LLVM编译流程

LLVM的编译流程

在介绍编译流程之前,首先回顾一下LLVM:
LLVM是一个模块化的、可重用的编译器和工具链技术的集合,Clang 是 LLVM 的子项目,是 C,C++ 和 Objective-C 编译器,它的编译速度比GCC快3倍,其中clang static analyzer主要进行语法分析、语义分析以及生成中间代码,在这个过程中会对代码进行检查,对于出错以及警告的代码会给与标记。此外,LLVM核心库还提供一个优化器,对流行的CPU做生成代码的支持(如x86等机器)。lld是Clang/LLVM的内置链接器,clang必须调用链接器来产生可执行文件。

LLVM相对于其它编译器的特殊性在于它提供一种代码编写良好的中间表示IR,这意味着它可以作为多种语言的后端,这样它就可以在提供语言无关的优化的同时还可以针对不同的硬件设备(CPU)生成对应的机器代码。

在介绍LLVM的编译流程之前,对于编译器的编译链接过程需要有一定的了解,可以参阅这些文章

快速开始——介绍LLVM编译流程

我们从一个例子开始,观察一次编译过程是如何完成的。首先我们编写如下的代码:

#import <Foundation/Foundation.h>
#define DEFINEEight 8
int main(){
    @autoreleasepool {
        int eight = DEFINEEight;
        int six = 6;
        NSString* site = [[NSString alloc] initWithString:@"starming"];
        int rank = eight + six;
        NSLog(@"%@ rank %d", site, rank);
    }
    return 0;
}

可以看到这段代码输出一个字符串和相加后的数字。将此代码保存为main.m文件。然后使用clang对其进行编译:

clang -ccc-print-phases main.m

可以看到编译过程输出如下:


编译流程
  • 0步骤获得源代码main.m,是OC语言。
  • 1步骤是预处理阶段,做相应处理(后面会提到)
  • 2步骤是编译阶段
  • 3步骤通过后端进行汇编前的处理
  • 4步骤汇编阶段
  • 5步骤链接阶段,做相应处理
  • 6步骤绑定相应变量(或常量等)到硬件机器上(如寄存器)
    通过如上步骤可以了解到整个过程以及过程中的一些信息。例如首先进行的预处理操作可以使用如下命令查看具体信息:
clang -E main.m

执行完后可以看到预处理后的样子:


预处理后

这个过程包括宏的替换,头文件的导入等等。在预处理完成后会进行词法分析,在此步骤会把代码切成一个个Token,比如大小括号,等于号还有字符串等。通过如下命令可以看到词法分析后的结果:

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

词法分析结果如下:


词法分析

接下来是语法分析,验证程序的语法是否正确,然后将所有的节点组成抽象语法树AST:

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

这些步骤完成之后就要开始进行IR中间代码的生成了,代码生成器CodeGen会负责将语法树自顶向下遍历逐步翻译成LLVM IR,IR就是编译过程的前端的输出以及后端的输入:

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

此步骤LLVM会去做些优化工作,在Xcode的编译设置里也可以设置优化的级别-01,-03,-0s等,还可以通过编写自己的pass自定制优化解决方案,编写自己的Pass请参阅[这篇文章]

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

什么是pass呢,可以将pass理解为LLVM优化工作的一个节点,一个节点做一些事,把这些节点加起来就构成了LLVM完整的优化器了。而且当你在Xcode里开启了bitcode的话还会做进一步的优化工作:对于新的后端架构可以使用这份优化后的bitcode去生成。这也是LLVM灵活性的一个体现吧。
开启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

最后生成可执行文件:

clang main.o -o main

这样通过执行./main就可以看到程序的执行结果啦!starming rank 14

那么以上就是LLVM的整个编译流程了。对于具体的Clang编译过程中的细节问题,将在后续的文章中进行介绍和讨论。欢迎关注!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容