网站地图
下载! 搜索本网站 有用链接 发布邮件 由 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 代码向后兼容(并且可以嵌入到现有 C 代码中),并且同样是一种小型、单态、静态类型、编译语言,具有手动内存管理功能。它还内置支持 SIMD 操作和其他低级功能,如非临时写入和预取。Terra 可以选择独立于 LuaJIT 和 LLVM 运行。事实上,如果您的最终程序不需要 Lua,则可以将 Terra 代码保存到目标文件、共享库或可执行文件中。 作者:Codasip Ltd.
Codasip Studio 是一个高度自动化的开发环境,涵盖了应用专用指令集处理器 (ASIP) 设计的所有方面,包括基于 LLVM 的 C/C++ 编译器生成。 从用 CodAL(Codasip 的处理器描述语言)编写的处理器的更高级别的描述开始,用户能够生成设计实现、验证环境、虚拟系统原型和完整的可再发行编程环境。 Codasip Studio 包含一个编译器后端生成器,该生成器分析 CodAL 描述,然后自动生成 LLVM 后端的源代码,并支持 ASIP 编程的众多扩展。这样,用户能够在几天内为其特定架构生成一个工作的 C/C++ 编译器。 作者:Pony 开发团队
Pony 是一种面向对象、actor 模型、功能安全的、高性能编程语言。它通过使用 actor 模型扩展类模型来强调并发思维,从而使 actor 成为一等公民。该语言是静态类型的、类型和内存安全的,并附带一系列强大的保证:无数据竞争、无未捕获异常和无死锁。Pony 实现了一个标记和不清除垃圾收集器,而无需生成或读写屏障。不需要“停止世界”步骤。actor 之间的所有消息传递都是因果关系的。 作者:smackers
SMACK 是一种自动软件验证器,它验证其输入 LLVM 中间表示 (IR) 程序中给出的断言。在幕后,SMACK 是从 LLVM IR 到 Boogie 中间验证语言 (IVL) 的翻译器。针对 Boogie 利用了一个规范平台,该平台简化了验证、模型检查和抽象解释算法的实现。 DiscoPoP(潜在并行性的发现) 是一种工具,可帮助识别顺序 C/C++ 程序中的潜在并行性。它对代码进行检测,以查找控制和数据依赖关系。一系列分析建立在依赖关系之上,以探索潜在的并行性和并行模式。检测是在 LLVM 的帮助下完成的。还提供了一个带有新选项“-dp”的修改版 Clang 来调用 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 项目作为开放 RVC-CAL 编译器 (Orcc) 的一部分托管,并需要它将视频编码工具的 RVC-CAL 标准库转换为 LLVM 汇编代码。 Crack 旨在提供脚本语言的易开发性以及编译语言的性能。该语言借鉴了 C++、Java 和 Python 的概念,结合了面向对象编程、运算符重载和强类型。 Rubinius 是一个新的 Ruby 虚拟机。它利用 LLVM 将 Ruby 代码动态编译为机器代码,使用 LLVM 的 JIT。 作者: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%。 该项目得到了谷歌的 夏季代码 计划的支持。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 Corporation 完成
Ascenium 是一种细粒度的连续可重构处理器,它以硬连线速度处理大多数指令,同时保留了能够被传统的高级语言目标化的能力,为用户提供了“硬件的所有性能,软件的所有便利”。 Ascenium 团队更喜欢将 LLVM 字节码作为其代码生成器的输入,原因如下:
Ascenium 的 HOT CHIPS 17 演示文稿 更详细地描述了体系结构和编译器。 作者:Tobias Nurmiranta
这是一个用 Scheme 编写的用于 LLVM 的 小型 Scheme 编译器。它足以编译自身并工作。 代码与 SICP(计算机程序的结构与解释)一书第五章中的代码非常相似,区别在于它实现了 SICP 假设显式控制求值器(虚拟机)已经具有的额外功能。编译器的许多功能是在 Scheme 的一个子集中实现的,即 llvm-defines,这些子集被编译成 llvm 函数。 LLVM 可视化工具 (LLVM-TV) 可用于可视化在 LLVM 框架中编写的转换的效果。我们的可视化反映了编译单元在特定时间点(转换之间)的状态;我们将这些保存的状态称为“快照”。用户可以可视化同一模块的一系列快照(例如,程序正在被优化时)或不同模块的快照,以进行比较。 我们的目标受众是在 LLVM 框架内工作的开发人员,他们试图理解 LLVM 表示及其分析和转换。此外,LLVM-TV 旨在简化添加新型程序可视化模块的过程。LLVM-TV 基于 wxWidgets 跨平台 GUI 框架,并使用 AT&T Research 的 GraphViz 绘制图形。 维基页面,其中包含概述、设计文档和用户手册。您可以从 LLVM SVN (https://llvm.net.cn/svn/llvm-project/television/trunk) 下载 llvm-tv。 线性扫描寄存器分配是一种快速的全局寄存器分配,最初在 线性扫描寄存器分配 中提出,作为更广泛使用的图着色方法的替代方案。在本文中,我将线性扫描寄存器分配算法应用于具有 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 论文] 中,描述了 PRE 的特定实现,称为 SSAPRE,它比传统的 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 位码编译成 JavaScript,这使得将 C 和 C++ 源代码编译成 JavaScript(通过首先使用 Clang 将其编译成 LLVM 位码)成为可能,然后可以在 Web 上运行。Emscripten 已用于移植大型现有的 C 和 C++ 代码库,例如 Python(标准 CPython 实现)、Bullet 物理引擎和 eSpeak 语音合成器等。 Emscripten 本身是用 JavaScript 编写的。重要的组件包括 Relooper 算法,该算法从 LLVM 位码中存在的低级基本块信息生成高级 JavaScript 控制流结构(“if”,“while”等),以及 LLVM 汇编的 JavaScript 解析器。 作者:Rust 贡献者
Rust 是一种带花括号的块结构表达式语言。它在视觉上类似于 C 语言家族,但在语法和语义细节方面存在显着差异。其设计面向“大型编程”的关注点,即创建和维护边界(抽象和操作的)以保持大型系统的完整性、可用性和并发性。 它支持命令式过程式、并发参与者、面向对象和纯函数式风格的混合。Rust 还支持泛型编程和元编程,包括静态和动态风格。 静态/本机编译使用 LLVM。 ESL(嵌入式系统语言) 是一种新的编程语言,旨在高效地实现嵌入式系统和其他低级系统编程项目。ESL 是一种类型化的编译语言,其特性允许程序员指定数据值的具体表示;例如,在处理通信协议或设备寄存器时非常有用。 新颖的功能包括:没有保留字、过程可以返回多个值、自动字节序转换、类型上的方法(但没有类)。语法比 C 更像 Pascal,但使用 C 的括号。编译器从 LL IR 引导。 实时系统编译器 (RTSC) 是一种操作系统感知编译器,允许对给定实时应用程序的实时系统架构进行通用操作。 目前,它最有趣的应用是将事件触发(即基于 OSEK OS)系统自动迁移到时间触发(即基于 OSEKTime)系统。为此,RTSC 从应用程序的源代码派生出抽象的全局依赖图,该图由所谓的“原子基本块”(ABB)组成。此“ABB 图”独立于原始操作系统,但包含应用程序的所有控制和数据依赖关系。因此,该图可以映射到另一个目标操作系统。目前,输入应用程序可以为 OSEK OS 编写,然后迁移到 OSEKTime 或 POSIX 系统。 LLVM 框架贯穿整个过程。首先,使用 LLVM 框架执行应用程序的静态分析以构建 ABB 图。此外,目标系统的操作和最终生成也基于 LLVM。 Vuo 是一种用于多媒体艺术家的现代可视化编程语言。Vuo 编译器采用用各种语言编写的模块化组件,以及组件之间的数据流图。使用 LLVM 代码生成 API,Vuo 编译器将图转换为本机多线程可执行文件。 |