LLVM概述

LLVM项目是模块化和可重用的编译器和工具链技术的集合。尽管名称如此,LLVM与传统虚拟机几乎没有关系。LLVM本身不是首字母缩略词;它是项目的全名。

LLVM开始是作为伊利诺大学的一个研究项目,他的目标是提供提一个现代化的、基于SSA编译策略的、同时支持静态和动态编译任何编程语言的编译器架构。从那时起,LLVM已经发展成为一个由多个子项目组成的总体项目,其中许多子项目正在被各种商业和开源项目用于生产环境,并被广泛用于学术研究。LLVM项目中的代码均是以“Apache 2.0 License with LLVM exceptions”许可证进行许可进行发布。

LLVM的主要子项目有:

  • LLVM Core libraries

    LLVM内核库提供一个现代化的、与源代码和目标机器无关的优化器,提供一个支持主流CPU(以及一些不常见的!)的目标代码生成器。

    LLVM内核库是围绕着一个被很好的定义的、被称作LLVM中间表示的代码表示(”LLVM IR”)的代码表示展开的。

    LLVM内核库拥有优秀的文档,使用LLVM作为优化器和代码生成器会使得发明您的新语言(或者移植现有的编译器)变得十分简单。

  • clang

    Clang是一个”LLVM原生”C/C++/Objective-C编译器,旨在提供惊人的快速编译(例如,在调试配置中编译Objective-C代码时比GCC快3倍),非常有用的错误和警告消息,并且提供用于构建优秀源代码工具的平台。Clang静态分析器可以自动查找代码中的错误,可以使用clang前端的库来解析C/C++代码。

  • LLDB

    LLDB项目是建立在LLVM和Clang上的优秀本地调试库。它使用Clang AST和表达式解析器,LLVM JIT,LLVM反汇编程序等,以便提供”正常工作”的体验。在加载符号时,它也比GDB快速且内存效率更高。

  • libc++ & libc++ ABI

    libc++和libc++ ABI项目提供了一个标准的符合性和高性能执行的C++标准库,包括C++11和C++14的全力支持。

  • compiler-rt

    Compiler-rt项目提供了高度调整,如”低级别的代码生成器支持例程的实现__fixunsdfdi”等产生的通话时目标不具有本地指令的短序列来实现核心IR操作。它还为动态测试工具(如AddressSanitizer,ThreadSanitizer,MemorySanitizer和DataFlowSanitizer)提供了运行时库的实现 。

  • OpenMP

    OpenMP子项目提供一个clang实现中使用OpenMP的OpenMP实现运行时库。

  • polly

    polly项目实现用多面体模型一套高速缓存局部性优化的以及自动并行和矢量化。

  • libclc

    libclc项目旨在实现OpenCL标准库

  • klee

    项目实现了一个”象征性的虚拟机”,它采用一个定理证明,试图评估在努力发现问题和证明的功能性,通过程序中的所有动态路径。klee的一个主要特性是它可以在检测到错误时生成测试用例。

  • SAFECode

    SAFECode项目是C/C++程序的存储器安全编译器。它通过运行时检查来检测代码,以便在运行时检测内存安全错误(例如,缓冲区溢出)。它可用于保护软件免受安全攻击,也可用作Valgrind等内存安全错误调试工具。

  • LLD

    LLD是一个新的连接器。这是系统链接器的直接替代品,运行速度更快。

除了LLVM的官方子项目之外,还有许多其他项目使用LLVM的组件来执行各种任务。通过这些外部项目,您可以使用LLVM来编译Ruby,Python,Haskell,Java,D,PHP,Pure,Lua和许多其他语言。LLVM的主要优势在于其多功能性,灵活性和可重用性,这就是它被用于各种不同任务的原因:从轻量级JIT编译嵌入式语言(如Lua)到编译Fortran代码(用于大型超级计算机)。