站点地图
下载! 搜索 本站 实用 链接 发布 邮件 由以下团队维护 llvm-admin 团队 |
使用 LLVM 构建的项目
此页面是一个使用 LLVM 构建的不完整项目列表,按时间倒序排列。此列表的想法是展示一些已使用 LLVM 完成的事情,用于各种课程项目或其他目的,这些可以作为未来项目的想法来源。另一个好的查找地点是已发表的使用 LLVM 的论文和学位论文列表。 请注意,此页面并非旨在反映 LLVM 的当前状态或展示对任何特定项目的认可。这只是各种人员辛勤工作的一个展示。它也稍微展示了 LLVM 的功能是如何随着时间演变的。 我们一直在寻找对此页面的新贡献。如果您从事的项目在课程或出版物中使用 LLVM,我们肯定很乐意听到,并希望在此处收录您的工作。请仅发送电子邮件至LLVM-dev 邮件列表,并提供如下条目。我们并不特别寻求源代码(尽管我们欢迎通过正常渠道贡献源代码),而是希望展示您工作的“润色成果”,包括报告、论文、演示文稿、海报或您拥有的任何其他内容。
Dragonegg 将 LLVM 优化器和代码生成器与 GCC 解析器集成在一起。这使得 LLVM 可以编译 Ada、Fortran 和 GCC 编译器前端支持的其他语言,并访问 Clang 不支持的 C 功能。请参阅 dragonegg 网页。 当前的 MRE 是单片的。扩展它们以提出新功能或重用它们来执行新语言很困难。VMKit 是一个库,可以简化新 MRE 的开发以及在 MRE 内部试验新机制的过程。VMKit 提供了 MRE 的基本组件:JIT 编译器、GC 和线程管理器。请参阅 vmkit 网页。 作者:Gleison Mendonca、Breno Campos Ferreira Guimaraes、Péricles Alves、Marcio Machado Pereira、Guido Araéujo 和 Fernando Magno Quintao Pereira。
请参阅 Dawn 项目 网页。 基于指令的编程模型,例如 OpenACC 和 OpenMP,如今已成为支持并行应用程序开发的有前途的技术。这些系统允许开发人员以最少的人工干预将顺序程序转换为并行程序。然而,将编译指示插入到生产代码中是一项困难且容易出错的任务,通常需要熟悉目标程序。这种困难限制了开发人员注释他们自己未编写的代码的能力。本文提供了解决此问题的一个基本组成部分。我们引入了一种静态程序分析,该分析推断源代码中引用的内存区域的边界。当并行化代码旨在在加速器设备(例如 GPU)中执行时,此类边界允许我们自动插入数据传输原语。为了验证我们的想法,我们已将它们应用于 Polybench,使用了两种不同的架构:Nvidia 和基于 Qualcomm 的架构。我们已成功分析了 Polybench 中 98% 的内存访问。此结果使我们能够将自动注释插入到这些基准测试中,从而将速度提高 100 倍以上。 作者:Zach DeVito
Terra 是一种系统编程语言,它嵌入在 Lua 中并由 Lua 进行元编程,Lua 处理条件编译、类型系统、命名空间和模板/函数特化等细节,这些细节通常是其他语言中的特殊构造。Terra 代码共享 Lua 的语法和控制流构造,并且可以轻松调用 Lua 函数,反之亦然。由于 JIT 编译器在运行时可用,因此库和嵌入式特定领域语言可以使用它来动态生成或自动调整具有自定义优化功能的任意高性能代码。 Terra 向后兼容(并且可以嵌入)现有 C 代码,并且同样是一种小型、单态、静态类型、编译语言,具有手动内存管理。还内置了对 SIMD 操作和其他低级功能(如非临时写入和预取)的支持。Terra 可以选择独立于 LuaJIT 和 LLVM 运行。事实上,如果您的最终程序不需要 Lua,您可以将 Terra 代码保存到对象文件、共享库或可执行文件中。 作者:Codasip Ltd.
Codasip Studio 是一个高度自动化的开发环境,涵盖了特定应用指令集处理器 (ASIP) 设计的所有方面,包括基于 LLVM 的 C/C++ 编译器生成。 从用 CodAL(Codasip 的处理器描述语言)编写的处理器的高级描述开始,用户可以生成设计实现、验证环境、虚拟系统原型和完整的可再发行编程环境。 Codasip Studio 包括一个编译器后端生成器,该生成器分析 CodAL 描述,然后自动为具有对 ASIP 编程的众多扩展支持的 LLVM 后端生成源代码。这样,用户可以在几天内为其特定架构生成一个可用的 C/C++ 编译器。 作者:Pony 开发团队
Pony 是一种面向对象的、actor 模型、功能安全、高性能编程语言。它通过使用 actor 模型扩展类模型来强调并发思维,从而使 actor 成为一等公民。该语言是静态类型的、类型安全和内存安全的,并带有一系列强大的保证:没有数据竞争、没有未捕获的异常,也没有死锁。Pony 实现了标记和非扫描垃圾收集器,而无需世代或读写屏障。不需要“停止世界”步骤。actor 之间的所有消息传递都是因果的。 作者:smackers
SMACK 是一种自动软件验证器,用于验证其输入 LLVM 中间表示 (IR) 程序中给出的断言。在底层,SMACK 是从 LLVM IR 到 Boogie 中间验证语言 (IVL) 的转换器。以 Boogie 为目标利用了一个规范平台,该平台简化了验证、模型检查和抽象解释算法的实现。 DiscoPoP(潜在并行性发现)是一种工具,可帮助识别顺序 C/C++ 程序中的潜在并行性。它检测代码以查找控制和数据依赖性。一系列分析建立在依赖性的基础上,以探索潜在的并行性和并行模式。检测是在 LLVM 的帮助下完成的。还提供了一个修改后的 Clang 版本,其中包含一个新的选项“-dp”来调用 DiscoPoP。 作者:Jérôme Gorin(ARTEMIS/Institut Telecom/Telecom SudParis)、Mickaël Raulet、Matthieu Wipliez(IETR/INSA Rennes)
Jade(即时自适应解码引擎)是一种通用视频解码器引擎,它使用 LLVM 来即时编译视频解码器配置。这些配置由 MPEG 可重构视频编码 (RVC) 委员会设计。MPEG RVC 标准建立在解码器的基于流的数据流表示之上。它由用 RVC-CAL 语言编写的标准编码工具库和解码器的数据流配置(框图)组成。 Jade 项目托管为 Open RVC-CAL 编译器(Orcc)的一部分,并且需要它将视频编码工具的 RVC-CAL 标准库转换为 LLVM 汇编代码。 Crack 旨在提供脚本语言的易开发性和编译语言的性能。该语言从 C++、Java 和 Python 中派生概念,结合了面向对象编程、运算符重载和强类型。 Rubinius 是 Ruby 的新虚拟机。它利用 LLVM 使用 LLVM 的 JIT 将 Ruby 代码动态编译为机器代码。 作者:MacRuby 项目团队
MacRuby 是在核心 Mac OS X 技术(例如 Objective-C 通用运行时和垃圾收集器以及 CoreFoundation 框架)之上实现的 Ruby。它主要由 Apple 开发,旨在实现完整 Mac OS X 应用程序的创建。 MacRuby 使用 LLVM 进行优化传递、Ruby 表达式的 JIT 和 AOT 编译。它还使用零成本 DWARF 异常来实现 Ruby 异常处理。 由各种贡献者。
除了生成易于移植的开源 OpenCL 实现之外,pocl 的另一个主要目标是通过编译器优化提高 OpenCL 程序的性能可移植性,从而减少对依赖于目标的手动优化的需求。 pocl 的一个重要部分是一组 LLVM 传递,用于在内核编译器中静态并行化多个工作项,即使在存在工作组屏障的情况下也是如此。这使得可以多种方式静态并行化工作组中细粒度的静态并发性。 作者:坦佩雷理工大学的定制并行计算小组
TCE 是一套工具,用于设计基于传输触发架构 (TTA) 的定制外露数据路径处理器。 该工具集提供了从 C/C++ 程序到可综合 VHDL/Verilog 和并行程序二进制文件的完整协同设计流程。处理器定制点包括寄存器文件、功能单元、支持的操作以及互连网络。 TCE 使用 Clang 和 LLVM 来支持 C/C++/OpenCL C 语言、独立于目标的优化以及部分代码生成。它为设计的处理器“动态”生成新的基于 LLVM 的代码生成器,并将它们作为运行时库加载到编译器后端,以避免每个目标重新编译编译器链的较大部分。 作者:Gary Benson(Red Hat,美国)
IcedTea 项目旨在提供一个框架,仅使用自由软件构建工具来构建 OpenJDK,并为 OpenJDK 中尚未免费的部分提供替代品。随着时间的推移,各种 OpenJDK 扩展已包含在 IcedTea 中。 其中一个扩展是 Zero。OpenJDK 仅支持 x86 和 SPARC 处理器;Zero 是一个独立于处理器的层,允许 OpenJDK 使用任何处理器构建和运行。Zero 包含一个名为 Shark 的 JIT 编译器,它使用 LLVM 提供本机代码生成,而无需引入依赖于处理器的代码。 Zero 和 Shark 的开发由 Red Hat 资助。 作者:Albert Graef,约翰内斯·古腾堡大学美因茨分校(德国)
Pure 是一种基于项重写的代数/函数式编程语言。程序是方程的集合,这些方程用于以符号方式评估表达式。Pure 提供动态类型、急切和惰性求值、词法闭包、卫生宏系统(也基于项重写)、内置列表和矩阵支持(包括列表和矩阵推导)以及易于使用的 C 接口。解释器使用 LLVM 作为后端,将 Pure 程序 JIT 编译为快速本机代码。 除了通常的代数数据结构外,Pure 还具有 MATLAB 样式的矩阵,以便以有效的方式支持数值计算和信号处理。Pure 目前主要针对数学应用,但它被设计为一种通用语言。动态解释器环境和 C 接口使其可以用作许多应用领域的一种函数式脚本语言。 作者:LDC 开发人员
D 是一种具有类似 C 语法的静态类型语言。它务实地结合了效率、控制和建模能力,以及安全性和程序员生产力。D 支持强大的概念,如编译时函数执行 (CTFE) 和模板元编程,为并发提供了一种创新的方法,并提供了许多经典范例。 LDC 编译器使用来自参考编译器的前端,并结合 LLVM 作为后端来生成高效的本机代码。 此项目 描述了为类似 Java 的编程语言开发编译器前端以生成 LLVM 汇编代码的过程。它用于编译器课程中,以展示如何通过使用 JFlex 和 Cup 等常用工具来逐步设计和实现翻译过程的后续阶段。每个步骤开发的源代码都可用。 作者:Fernando Pereira 和 Jens Palsberg,加州大学洛杉矶分校。
在这个项目中,我们已经表明,寄存器分配可以看作是解决谜题集合。我们将寄存器文件建模为谜题板,将程序变量建模为谜题碎片;预着色和寄存器别名自然地融入其中。对于 x86、SPARC V8 和 StrongARM 等架构,我们可以在多项式时间内解决谜题,并且我们使用了一个简单的启发式方法来增强谜题求解器,以进行溢出。对于 SPEC CPU2000,我们的实现与 LLVM 使用的线性扫描的扩展版本一样快。我们的实现生成的 Pentium 代码质量与 George 和 Appel 的较慢、最先进的迭代寄存器合并算法(由 Smith、Ramsey 和 Holloway 扩展)生成的代码质量相似。 项目页面,其中包含指向验证 LLVM 寄存器分配器输出的工具的链接。 Faust 实时信号处理系统
FAUST 是一种用于实时音频信号处理的编译语言。FAUST 的名称代表 Functional AUdio STream(功能音频流)。其编程模型结合了两种方法:函数式编程和框图组合。您可以将 FAUST 视为具有文本语法的结构化框图语言。该项目旨在为 Faust 开发一个新的后端,该后端将直接生成 LLVM IR,而不是 Faust 当前生成的 C++ 类。借助(尚未发布的)Faust 编译器的库版本,它将允许开发人员嵌入 Faust + LLVM JIT,以动态定义、即时编译和执行 Faust 插件。LLVM IR 和工具还允许一些不错的字节码操作,例如“部分求值/特化”,这也将得到研究。 作者:Adobe Systems Incorporated
有效利用可用于图像处理的计算资源是 Adobe Image Foundation 项目的目标。我们的语言“Hydra”用于描述单阶段和多阶段图像处理内核,然后将其编译并在目标机器上的较大应用程序中运行。与它的名字一样,我们的 Hydra 可以在 GPU 上运行,也可以在主机 CPU 上运行。AIF 将 LLVM 用于我们的 CPU 路径。 第一个使用我们系统的 Adobe 应用程序是即将发布的 After Effects CS3。我们欢迎您试用我们的公开测试版,网址为 labs.adobe.com。 作者:Domagoj Babic,不列颠哥伦比亚大学。
Calysto 是一种可扩展的上下文和路径敏感的基于 SSA 的静态断言检查器。与其他静态检查器不同,Calysto 直接分析 SSA,这意味着它不仅检查原始代码,还检查用于编译代码的编译器的前端(包括 SSA 优化)。在 SSA 上执行静态检查的优点是语言独立性,以及检查的代码比源代码更接近生成的汇编代码。 有几个主要因素有助于 Calysto 的可扩展性
目前,Calysto 仍处于开发阶段,初步结果令人鼓舞。第一个公开版本很可能在 2007 年秋季的某个时候发布。Spear 和 Calysto 生成的 基准测试 可用。 作者:Fernando Pereira,加州大学洛杉矶分校。
当限制为单静态分配 (SSA) 形式的程序时,寄存器分配问题具有精确的多项式解。尽管引人注目,但这一重大的理论成就尚未得到经验认可。本项目包括使用 LLVM 编译器框架实现完整的基于 SSA 的寄存器分配器。我们实现了一个目标程序的静态转换,该转换简化了寄存器分配器的实现并提高了其生成的代码的质量。我们还描述了执行寄存器合并和 SSA 消除的新技术。为了验证我们的分配技术,我们将我们方法的不同风格与 此处描述的线性扫描寄存器分配器的现代且经过大量调整的扩展进行了广泛比较。当目标架构提供少量寄存器时,所提出的算法始终如一地生成更快的代码。例如,当将寄存器数量限制为四个通用寄存器和三个保留寄存器时,我们实现了平均 9.2% 的加速。通过使用积极的合并技术增强算法,我们已能够将速度提升提高到 13.0%。 本项目得到了 Google 的 Summer of Code 计划的支持。Fernando Pereira 由 CAPES 根据流程编号 218603-9 资助。 作者:Michael O. McCracken,加州大学圣地亚哥分校。
LENS 项目 旨在改进测量程序和调查其行为的任务。LENS 以 XML 格式定义程序的外部表示,以存储基于程序结构(包括循环结构信息)可访问的有用信息。 Lens 基于 XPath 和 LENS XML 文档结构为程序组件定义了一个灵活的命名方案。这允许用户和工具从统一的界面有选择地查询程序行为,从而允许用户或工具询问有关程序组件的各种问题,这些问题可以通过任何理解查询的工具来回答。查询、指标和程序结构都存储在 LENS 文件中,并使用版本名称进行注释,以支持历史比较和科学记录保存。 编译器编写者可以使用 LENS 轻松地公开程序的转换和分析结果,而无需担心显示或处理信息过载。已使用 LLVM 演示了此功能。LENS 将 LLVM 用于两个目的:首先,使用 LLVM 传递在 XML 中生成初始程序结构文件;其次,作为选择性查询编译器信息优势的演示,LLVM 中内置了一个接口,允许 LLVM 传递轻松响应 LENS 文件中的查询。 作者:洛斯阿拉莫斯国家实验室
Trident 是一个用于浮点算法的 C 语言编译器,它生成针对可重构逻辑设备的电路的寄存器传输级 VHDL 描述。Trident 使用传统的编译器优化和调度技术自动提取并行性和流水线循环体。Trident 还提供了一个开放框架,用于实验、分析和优化 FPGA 上的浮点算法,以及轻松集成自定义浮点库的灵活性。 Trident 使用 LLVM C/C++ 前端来解析输入语言并生成低级平台无关代码。 Ascenium 是一种细粒度、连续可重构的处理器,它可以以硬连线速度处理大多数指令,同时保留被传统高级语言定位的能力,从而为用户提供“硬件的所有性能,软件的所有易用性”。 Ascenium 团队更喜欢 LLVM 字节码作为其代码生成器的输入,原因有几个
Ascenium 的 HOT CHIPS 17 演示文稿 更详细地描述了架构和编译器。 作者:Tobias Nurmiranta
这是一个用 scheme 编写的 小型 scheme 编译器,用于 LLVM。它足够好,可以编译自身并工作。 该代码与 SICP(计算机程序的构造和解释)第五章中的代码非常相似,不同之处在于它实现了 SICP 假设显式控制求值器(虚拟机)已经拥有的额外功能。编译器的大部分功能是在 scheme 的一个子集 llvm-defines 中实现的,该子集被编译为 llvm 函数。 LLVM 可视化工具 (LLVM-TV) 可用于可视化 LLVM 框架中编写的转换的效果。我们的可视化反映了转换之间编译单元在单个时间点的状态;我们将这些保存的状态称为“快照”。用户可以可视化同一模块的一系列快照(例如,在程序被优化时)或不同模块的快照,以进行比较。 我们的目标受众包括在 LLVM 框架内工作的开发人员,他们试图理解 LLVM 表示及其分析和转换。此外,LLVM-TV 的设计使其易于添加新型程序可视化模块。LLVM-TV 基于 wxWidgets 跨平台 GUI 框架,并使用 AT&T Research 的 GraphViz 绘制图形。 Wiki 页面,其中包含概述;设计文档和用户手册。您可以从 LLVM SVN 下载 llvm-tv (https://llvm.gnu.ac.cn/svn/llvm-project/television/trunk)。 线性扫描寄存器分配是一种快速的全局寄存器分配,最初在 线性扫描寄存器分配 中提出,作为更广泛使用的图形着色方法的替代方案。在本文中,我在具有 SSA 形式的系统中应用了线性扫描寄存器分配算法,并展示了如何通过利用生存期空洞和内存操作数来改进该算法,并消除为溢出代码保留寄存器的需要。 作者:Misha Brukman 和 Brian Gaeke
传统架构使用硬件指令集来实现双重目的:首先,作为一种语言,用于表达软件程序的语义;其次,作为一种控制硬件的手段。低级虚拟架构 项目的论点是将这两种用途彼此分离,允许以语义更丰富、更易于操作的格式表达软件,并允许直接在编译代码上进行更强大的优化和全程序分析。 我们在 LLVA 中使用的语义丰富的格式基于 LLVM 编译器基础设施的中间表示,可以最好地理解为“虚拟指令集”。这意味着,虽然其指令与底层硬件中可用的指令紧密匹配,但它们可能与底层硬件理解的指令不完全对应。我们将这些底层指令称为“实现指令集”。在这两层之间存在翻译层,通常在软件中实现。 在这个项目中,我们通过以下方式迈出了下一步:(1) 将整个 Linux 内核移植到 LLVA,以及 (2) 设计一个环境,在该环境中,内核可以直接从其 LLVM 字节码表示运行 — 本质上,这是一个最小但完整的模拟计算机系统,LLVA 作为其本机指令集。我们发明的模拟器 llva-emu 通过将程序从 LLVM 字节码格式“即时”翻译为处理器的本机指令集来执行内核代码。 作者:Brian Fahs
正如每个现代计算机用户都经历过的那样,软件更新和升级经常需要重新启动程序,有时甚至需要重新启动整个操作系统。这可能是一种痛苦和烦人的体验。如果这种常见的烦恼可以完全避免或至少大大减少,那会怎么样?想象一下,只有在您想关闭计算机时才重新启动系统,或者只有在您想关闭应用程序时才关闭应用程序,而不是在更新发生时关闭应用程序。本项目的目的是研究对可执行文件执行动态修补的潜力,并创建一个修补工具,该工具能够自动生成补丁并将其应用于已经在运行的应用程序。本项目应回答以下问题:如何执行动态更新?需要哪种类型的分析?这种分析可以有效地自动化吗?可以在正在运行的可执行文件中更新什么(例如,算法、组织、数据等)? 作者:Tanya Brethour、Joel Stanley 和 Bill Wendling
在本报告中,我们介绍了基于 [1999 TOPLAS SSAPRE 论文] 的 PRE 算法的实现细节、经验性能数据和值得注意的修改。[1999 TOPLAS SSAPRE 论文] 中描述了一种称为 SSAPRE 的 PRE 的特定实现,它比传统的 PRE 实现更有效,因为它依赖于静态单赋值 (SSA) 形式的有用属性,以比传统的基于位向量的方法更稀疏的方式执行数据流分析。我们的实现特定于称为 LLVM(低级虚拟机)的基于 SSA 的编译器基础设施。 我们介绍了 Jello 的设计和实现,Jello 是一个用于 Intel IA32 架构的可重定向即时 (JIT) 编译器。 Jello 的输入是一个静态编译为低级虚拟机 (LLVM) 字节码的 C 程序。 Jello 利用 LLVM 字节码表示的特性来实现高效的运行时代码生成,同时强调可重定向性。 我们的方法在静态单赋值形式中使用抽象机器代码表示,该表示是机器无关的,但可以处理机器特定的功能,例如隐式和显式寄存器引用。 因为这种表示是目标无关的,所以代码生成的许多阶段可以是目标无关的,这使得 JIT 易于重定向到新平台,而无需更改代码生成器。 Jello 的最终目标是为未来在运行时优化传统上静态编译的语言编写的程序的研究提供一个灵活的主机。 请注意,Jello 最终演变为当前的 LLVM JIT,它是工具 lli 的一部分。 作者:Alon Zakai 以及 Emscripten 贡献者 的其余人员
Emscripten 将 LLVM bitcode 编译成 JavaScript,这使得可以将 C 和 C++ 源代码编译成 JavaScript(首先使用 Clang 将其编译成 LLVM bitcode),然后在 Web 上运行。 Emscripten 已被用于移植大型现有 C 和 C++ 代码库,例如 Python(标准 CPython 实现)、Bullet 物理引擎和 eSpeak 语音合成器等等。 Emscripten 本身是用 JavaScript 编写的。 重要组件包括 Relooper 算法,该算法从 LLVM bitcode 中存在的低级基本块信息生成高级 JavaScript 控制流结构(“if”、“while”等),以及用于 LLVM 汇编的 JavaScript 解析器。 Rust 是一种大括号、块结构表达式语言。 它在视觉上类似于 C 语言系列,但在语法和语义细节上差异很大。 它的设计面向“大规模编程”的关注点,即创建和维护边界——抽象的和操作的——以保持大型系统的完整性、可用性和并发性。 它支持命令式过程式、并发 Actor 模型、面向对象和纯函数式风格的混合。 Rust 还支持泛型编程和元编程,包括静态和动态风格。 静态/原生编译使用 LLVM。 ESL (嵌入式系统语言) 是一种新的编程语言,专为高效实现嵌入式系统和其他低级系统编程项目而设计。 ESL 是一种类型化编译语言,其功能允许程序员指定数据值的具体表示形式; 这在处理通信协议或设备寄存器等情况时非常有用。 新颖的功能包括:没有保留字,过程可以返回多个值,自动字节序转换,类型上的方法(但没有类)。 语法比 C-like 更像 Pascal-like,但带有 C 括号。 编译器从 LL IR 自举。 实时系统编译器 (RTSC) 是一种操作系统感知的编译器,它允许通用地操作给定实时应用程序的实时系统架构。 目前,其最有趣的应用是将事件触发(即基于 OSEK OS)系统自动迁移到时间触发(即基于 OSEKTime)系统。 为了实现这一点,RTSC 从应用程序的源代码中派生出一个抽象的全局依赖图,该图由所谓的“原子基本块”(ABB) 组成。 这个“ABB 图”不依赖于原始操作系统,但包含应用程序的所有控制和数据依赖关系。 因此,这个图可以映射到另一个目标操作系统。 目前,输入应用程序可以用 OSEK OS 编写,然后迁移到 OSEKTime 或 POSIX 系统。 LLVM 框架贯穿整个过程。 首先,使用 LLVM 框架执行构建 ABB 图所需的应用程序静态分析。 此外,目标系统的操作和最终生成也基于 LLVM。 Vuo 是一种面向多媒体艺术家的现代可视化编程语言。 Vuo 编译器接受用各种语言编写的模块化组件,以及组件之间的数据流图。 使用 LLVM 代码生成 API,Vuo 编译器将该图转换为原生的多线程可执行文件。 |