LLVM 编译器和工具链技术
LLVM 编译器和工具链技术
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实现运行时库。
Polly:polly项目实现用多面体模型,一套高速缓存局部性优化的,以及自动并行和矢量化。
Libclc:libclc项目旨在实现OpenCL标准库
Klee:项目实现了一个“象征性的虚拟机”,采用一个定理证明,试图评估在努力发现问题和证明的功能性,通过程序中的所有动态路径。klee的一个主要特性,可以在检测到错误时,生成测试用例。
SAFECode:SAFECode项目是C/C++程序的存储器安全编译器。通过运行时检查来检测代码,以便在运行时检测内存安全错误(例如,缓冲区溢出)。可用于保护软件免受安全攻击,也可用作Valgrind等内存安全错误调试工具。
LLD:LLD是一个新的连接器。这是系统链接器的直接替代品,运行速度更快。英特尔为其 C/C++ 编译器全面采用 LLVM
除了LLVM的官方子项目之外,还有许多其它项目使用LLVM的组件,执行各种任务。通过这些外部项目,可以使用LLVM来编译Ruby,Python,Haskell,Java,D,PHP,Pure,Lua和许多其它语言。LLVM的主要优势在于其多功能性,灵活性和可重用性,用于各种不同任务:从轻量级JIT编译嵌入式语言(如Lua),到编译Fortran代码(用于大型超级计算机)。
英特尔为C/C++ 编译器全面采用 LLVM
英特尔的长期编译器专家 James Reinders透露,将在下一代英特尔 C/C++ 编译器中使用 LLVM 开源基础架构;并分享了一些相关信息。
“LLVM 有助于实现为英特尔架构,提供最佳 C/C++ 编译器的目标。最新的英特尔 C/C++ 编译器,使用 LLVM,可提供更快的编译时间、更好的优化、增强的标准支持,以及对 GPU 和 FPGA 卸载的支持......采用 LLVM 的好处很多,将提供从经典编译器,升级到基于 LLVM 的编译器的建议。致力于使其尽可能的无缝,同时,为使用英特尔编译器的开发者带来众多好处。”在构建时间方面,英特尔工程师报告,新的基于 LLVM 的 oneAPI DPC++/C++ Compiler 2021.3 的构建时间,相较经典 C++ 编译器要减少了 14%。虽然经典英特尔 C++ 编译器,一直比上游的 LLVM 和 GCC 快,但 oneAPI DPC++/C++ Compiler 2021.3,可提供比 GCC 11.1 快 41% 的性能。新的基于 LLVM 的编译器的浮点性能,比 ICC 高约 19%。
James 表示,在基于 LLVM 的编译器中,专注于新功能和硬件支持。包括在其中添加了对 GPU 和 FPGA 的高度优化支持,继续致力于提供 CPU 优化。基于 LLVM 的编译器,将支持 SYCL、C++20、OpenMP 5.1 和 OpenMP GPU 目标设备。
“鼓励用户通过现在转向,基于 LLVM 的 C/C++ 编译器,利用更快的构建时间、更高级别的优化和新功能。英特尔长期致力于 LLVM,以帮助持续创新,以及对行业领先优化的不懈追求。”建议所有新项目,都使用基于 LLVM 的英特尔 C/C++ 编译器,现有项目也应计划迁移到新的编译器。James 称,在未来的某个时间点,经典 C/C++ 编译器,将进入"Legacy Product Support"模式。标志着对经典编译器基础的定期更新结束,将不再出现在 oneAPI 工具包中。“全新的基于 LLVM 的 Intel C/C++,已与经典版本达到同等水平,基于 LLVM 的 C/C++ ,提供了最佳优化技术。建议所有用户现在就尝试新的 C/C++ 编译器,享受好处并提供反馈。”此外,基于 LLVM 的英特尔 Fortran 编译器,也正在进行中。目前,已有一个基于 LLVM 的 Fortran 编译器测试版,提供了对 Fortran 的广泛支持,还有一些功能仍在开发中。
参考链接:
https://llvm.liuxfe.com/
https://baijiahao.baidu.com/s?id=1707766059390977538&wfr=spider&for=pc