LLVM编译器架构
阅读原文时间:2023年07月09日阅读:2

LLVM编译器架构

LLVM概述

LLVM项目是模块化和可重用的编译器及工具链技术的集合。尽管名称如此,LLVM与传统虚拟机关系不大。名称“ LLVM”本身不是缩写。它是项目的全名。

LLVM最初是伊利诺伊大学的一个研究项目,目的是提供一种基于SSA的现代编译策略,该策略能够支持任意编程语言的静态和动态编译。从那时起,LLVM逐渐发展成为一个由多个子项目组成的总体项目,其中许多子项目已用于各种商业和开源项目的产品中,并广泛用于学术研究。LLVM项目中的代码已根据“具有LLVM例外的Apache 2.0许可”获得许可

LLVM的主要子项目是:

  1. LLVM内核库提供一个现代化的源代码与目标无关的优化,随着代码生成支持许多流行的CPU(以及一些不太常见的!),这些包都是围绕着建立以及指定被称为LLVM中间表示的代码表示(“ LLVM IR”)。LLVM核心库有充分的文档记录,特别容易发明自己的语言(或移植现有的编译器)以将LLVM用作优化器和代码生成器
  2. Clang是“ LLVM本机” C / C ++ / Objective-C编译器,旨在提供惊人的快速编译,极其有用的错误和警告消息,并为构建出色的源代码级工具提供平台。该Clang静态分析器clang-tidy工具,代码自动发现错误,而且是那种可以使用clang前端的库来解析C / C ++代码生成工具的很好的例子。
  3. LLDB项目建立在由LLVM和Clang提供了极大的机调试库。它使用Clang AST和表达式解析器,LLVM JIT,LLVM反汇编程序等,从而提供了一种“可行”的体验。在加载符号时,它还比GDB速度更快,存储效率更高。
  4. libc中++libc ++ ABI项目提供了一个标准的conformant和高性能执行的C ++标准库,包括C ++ 11和C ++ 14的全力支持。
  5. 当目标没有简短的本机指令序列来实现核心IR操作时,compiler-rt项目将对底层代码生成器支持示例(例如__fixunsdfdi)和其他调用进行高度优化的实现。它还为动态测试工具(例如AddressSanitizerThreadSanitizerMemorySanitizerDataFlowSanitizer)提供了运行时runtime库的实现 。
  6. MLIR子项目是一种新的方法来构建可重用和可扩展的编译架构。MLIR旨在解决软件碎片,改善异构硬件的编译,显着降低构建特定于域的编译器的成本以及帮助将现有编译器连接在一起的问题。
  7. OpenMP的子项目提供的OpenMP与在clang的OpenMP实现使用运行时间。
  8. polly工程实施缓存局部性优化,使用多面体模型套件以及自动并行和矢量化。
  9. libclc项目旨在实现的OpenCL标准库。

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

11. 该LLD项目是一个新的链接。这是系统链接程序的直接替代,并且运行速度更快。

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

LLVM拥有广泛而友好的社区,这些社区对构建出色的低级工具感兴趣。如果有兴趣参与其中,那么最好的方法是浏览LLVM博客并注册LLVM Developer邮件列表。有关如何发送补丁程序,获取提交访问权限以及版权和许可主题的信息,请参阅《 LLVM开发人员政策》