LLVM初探

1,714 阅读2分钟

1、简介

LLVM项目是模块化、可重用的编译器以及工具链技术的集合。官网地址:llvm.org。它的创始人是Chris Lattner,也是swift之父。地址二

2、传统编译器的架构

从代码到机器码,编译器工作分为三个阶段(编译器的架构),前端(Frontend)、优化器(Optimizer)、后端(Backend)。

image.png

其中前端的工作是词法分析,语法分析,语义分析,和生成中间代码(IR)。优化器的工作就是进行中间代码的优化,分为多个pass。而后端就是生成机器码的工作。

image.png

前端是适应多种语言,后端是适应多种硬件设备。不同的前端后端使用统一的中间代码LLVM Intermediate Representation (LLVM IR)。

image.png

clang是基于LLVM架构的C/C++/Objective-C编译器前端,它是LLVM的一个子项目,官网:clang.llvm.org
相比于GCC,Clang具有如下优点:

  • 编译速度快:在某些平台上,Clang的编译速度显著的快过GCC(Debug模式下编译OC速度比GGC快3倍)
  • 占用内存小:Clang生成的AST所占用的内存是GCC的五分之一左右
  • 模块化设计:Clang采用基于库的模块化设计,易于 IDE 集成及其他用途的重用
  • 诊断信息可读性强:在编译过程中,Clang 创建并保留了大量详细的元数据 (metadata),有利于调试和错误报告
  • 设计清晰简单,容易理解,易于扩展增强

image.png


3、通过命令行了解OC源文件的编译过程

命令行查看编译的过程: Xcode新建一个命令行工具,cd到main.m上层目录,执行clang -ccc-print-phases main.m<br />查看preprocessor(预处理)的结果: clang -E main.m

1. 前端过程一,词法分析,生成Token:

$ clang -fmodules -E -Xclang -dump-tokens main.m

2. 前端过程二,语法分析,生成语法树(AST,Abstract Syntax Tree):

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

3. 前端过程三,语义分析并生成中间代码(IR),LLVM IR有3种表示形式:

  • text:便于阅读的文本格式,类似于汇编语言,拓展名.ll, $ clang -S -emit-llvm main.m

IR基本语法:官方语法参考:llvm.org/docs/LangRe…

- 注释以分号 ; 开头
- 全局标识符以@开头,局部标识符以%开头 p alloca,在当前函数栈帧中分配内存
- i32,32bit,4个字节的意思
- align,内存对齐
- store,写入数据
- load,读取数据
  • memory:内存格式
  • bitcode:二进制格式,拓展名.bc, $ clang -c -emit-llvm main.m

4、源码下载

1. 下载LLVM,大小 648.2 M,仅供参考:

  1. $ git clone git.llvm.org/git/llvm.gi…

2. 下载clang,大小 240.6 M,仅供参考:

  1. $ cd llvm/tools
  2. $ git clone git.llvm.org/git/clang.g…

5、 源码编译

1、通过辅助工具编译(快很多)

  1. 安装cmake和ninja(先安装brew,brew.sh/)

    1. $ brew install cmake
    2. $ brew install ninja,ninja如果安装失败,可以直接从github获取release版放入【/usr/local/bin】中,github.com/ninja-build…
  2. 编译,编译完毕后, 【llvm_build】目录大概 21.05 G(仅供参考)

    1. 在LLVM源码同级目录下新建一个【llvm_build】目录(最终会在【llvm_build】目录下生成【build.ninja】
    2. $ cd llvm_build
    3. $ cmake -G Ninja ../llvm -DCMAKE_INSTALL_PREFIX=LLVM的安装路径
    4. 更多cmake相关选项,可以参考: llvm.org/docs/CMake.…
  3. 安装,安装完毕后,安装目录大概 11.92 G(仅供参考)

    1. $ ninja install

2、生成Xcode项目再进行编译,但是速度很慢(可能需要1个多小时)

  1. 在llvm同级目录下新建一个【llvm_xcode】目录
  2. $ cd llvm_xcode
  3. $ cmake -G Xcode ../llvm

6、LLVM应用与实践

1. libclang、libTooling(语法树分析、语言转换等)

官方参考:clang.llvm.org/docs/Toolin…

2. Clang插件开发,官方参考,代码检查(命名规范、代码规范)等

  1. clang.llvm.org/docs/ClangP…
  2. clang.llvm.org/docs/Extern…
  3. clang.llvm.org/docs/RAVFro…

3. Pass开发(代码优化、代码混淆等)

官方参考:llvm.org/docs/Writin…

4. 开发新的编程语言

  1. llvm-tutorial-cn.readthedocs.io/en/latest/i…
  2. kaleidoscope-llvm-tutorial-zh-cn.readthedocs.io/zh_CN/lates…

7、相关书籍推荐

  1. 编译原理
  2. LLVM CookBook