1.2 LLVM主要子项目
经过20多年的发展,LLVM已经成为编译器领域最成功的项目之一,其使用范围非常广泛,现代新型语言、工具等基本上都是基于LLVM实现的。LLVM不仅是一款编译器,还是编译器和工具链的集合,其主要子项目如下。
1)LLVM核心库(即平常大家提到的LLVM):提供了编译优化器、各种后端的代码生成,其输入为LLVM IR,输出为编译器处理后的目标架构代码。
2)Clang:LLVM原生支持的C/C++/Object-C编译器,其中编译优化器和代码生成模块直接使用LLVM核心库。Clang主要负责从C/C++/Object-C到LLVM IR的转换、LLVM核心库的调用,同时提供多样化的前端处理工具,例如针对代码分析的静态分析器、针对代码静态检查的工具(clang-tidy)、针对代码风格的自动格式化工具(clang-format)等。
3)LLDB:基于LLVM核心库及Clang构建的调试器。
4)libc:C标准库的实现,支持C17和后续的C2x、POSIX标准。
5)libcxx:一种C++标准库的实现,包括iostreams和STL等库的实现,支持C++11、C++14等更高版本。
6)libunwind:提供基于DWARF标准的堆栈展开的辅助函数,通常用于实现C++等语言的异常处理。在使用libunwind替代glibc中堆栈展开的功能时,有可能还需要其他的库(例如在Linux中还需要llvm-libgcc库)的配合。
7)libcxxabi:在libunwind之上实现的C++异常处理功能,提供标准的C++异常函数。
8)libclc:OpenCL标准库的实现。
9)OpenMP:一种OpenMP运行时的实现,OpenMP有助于多线程编程,提供并行化处理。
10)compiler-rt:提供独立于编程语言的支持库。compiler-rt包含通用函数(如32位i386后端的64位除法)、各种杀毒程序工具(sanitizers)、fuzzing库、profling库、插桩库XRay等。
11)LLD:一种链接器的实现。
12)Flang:LLVM原生支持的Fortran编译器前端。
13)pstl:并行STL的实现。
14)POLLY:多面体编译器的实现,主要实现了自动并行、矢量化等优化。
15)MLIR:通过定义多级IR框架,允许用户自定义IR并重用基础编译器框架。目前有许多编译器项目通过MLIR实现,例如AI编译器、Circt(EDA编译器)等。
16)BOLT:链接后的优化器,对链接后的二进制代码进行优化,例如通过收集运行时信息,对代码进行重新布局,从而提高执行效率。