LLVM学习笔记 - 基本流程

LLVM是模块化,可重用的编译器以及工具链技术的集合,并且LLVM就是全称并不是简称,所以说LLVM是一种编译器显然是不够准确的,她至少可以代表两个,1.LLVM编译架构 2.LLVM编译器后端

基本的编译器架构前面昨天有写过就不赘述了

在LLVM架构里面优化器是恒定不变的,需要支持新的内核,比如现在是arm x86再多一个内核,就需要调整LLVM架构的后端部分,如果再多一个编程语言则只需要对应的编译器转成LLVM IR也就是LLVM能用的中间代码即可

Clang

   Clang属于LLVM架构的前端,主要支持语言是C/C++/OC,Clang的编译速度是GCC的三倍,生成的语法树也只有GCC的五分之一,易于集成,报错也容易看懂,不像GCC报错你压根就看不懂(虽然但是,我感觉两个报错信息都不是人看的)

   Clang的编译过程

       1.预处理 一般就是#define 宏定义直接赋值比如 #define Age  4;  int li  = Age + 10; 这个预处理就是把这个Age 直接编译成 int li = 4 + 10;就是这种简单的处理,不赘述了

       2.词法分析 所谓的词法分析,就是把程序分割成一个个token,然后看看符不符合规范,具体查看程序生成了哪些token的方式:

             1.cd到程序对应的目录 

             2.clang -fmodules -E -Xclang -dump-tokens main.c 输入上述指令,其中main.c为文件名称  

             LLVM学习笔记 - 基本流程_第1张图片

            比如我生成的就如图所示,可以看出基本把所有代码都切成块了,然后看看有没不合法的token

     3.语法分析&语义分析 词法分析只是判断单个token是不是合法,并没有分析这个token的具体语义,和这一堆代码具体什么意思,语法分析的重点就是语法树,语法树的简称是AST,语法树生成命令是 clang -fmodules -fsyntax-only -Xclang -ast-dump main.c步骤和生成单个token是一样的

         LLVM学习笔记 - 基本流程_第2张图片

         语法树

                LLVM学习笔记 - 基本流程_第3张图片

                这是一个函数的语法树函数名是test,实际的语法树还会标记是什么返回值,比如int void等等,然后声明了两个变量a,b ,下面是程序段,然后就是int c = a + b - 3;的语法树,还是很直观就不                    赘述了,可以直观的看出语法树的目的就是分析语法和语义

          4.生成中间代码 这个框架的中间代码就是LLVM IR ,这个中间代码有三种格式:

                 1..ll文件  是一种可读性较强(强个锤子)的文本格式, 类似于汇编语言 其中生成指令是 clang -S -emit-llvm main.c,注意路径下必须有main.c这个文件,没有就别折腾了,与上面不同的是,这                                  里会生成一个.ll文件,而不是把内容显示在命令行里面

                                

                               结果如图,依稀可以看出是声明了各种大学,主函数和print的自定义函数,属性定义比如print里面的%1/2/3就是三个值对应我定义的ABC alloc初始化,内存对齐4 int 32,分配了4                                 个节,store写入就是赋值,load,取出来,进行计算等等,所以可以得出结论,这就是把之前的代码转换成了一种LLVM框架自己的中间语言(废话)

               2.内存格式  就是平时用Xcode看内存的那种格式了,不赘述

               3.二进制格式  拓展名是.bc 生成代码是 clang -c -emit-llvm main.c

                                      LLVM学习笔记 - 基本流程_第4张图片

                                    生成的不是二进制是16进制的,不过关系不大,反正都不是人读的,只能看下知道他是刚才那堆中间代码就好了

Clang的流程基本就是这样了,值得一提的是这个中间代码其实是一个东西来着,只是对应的格式不一样

 

你可能感兴趣的:(编译)