EuroLLVM 2024 参会报告
EuroLLVM 是一个专注于 LLVM 基金会旗下项目的开发者会议,这些项目位于 LLVM GitHub 单仓库中,如 Clang 以及最近因机器学习研究而兴起的 MLIR 框架。Trail of Bits 在编译器工程和 LLVM 相关领域有深厚历史,派遣了一批编译器专家参会,并展示了两个项目:VAST(一个基于 MLIR 的 C/C++ 编译器)和 PoTATo(一种新颖的 MLIR 指向分析方法)。在本博客中,我们分享为期两天的开发者会议(包括一天会前研讨会)的收获和经验。
安全意识
与往年相比,一个显著差异是安全性的新兴关注。LLVM 社区内似乎有越来越强的动力来增强整个软件生态系统的安全性。这代表了编译器社区的一个相对新发展,LLVM 领导层积极寻求该主题的专业知识。
开幕主题演讲引入了安全主题,断言它已成为编译器的第三大支柱,与优化和翻译并列。ARM 的 Kristof Beyls 发表了主题演讲,简要回顾了编译器关注点和角色的演变历史。他强调,安全性现在是与正确性和性能并列的主要关注点。
主题演讲的技术部分提出了一个有趣的问题:是否有人验证安全缓解措施是否正确应用或是否应用?为了回答这个问题,Kristof 使用 BOLT 实现了一个静态二进制分析工具。Kristof 选择验证的缓解措施是 -fstack-clash-protection 和 -mbranch-protection=standard,特别是其 pac-ret 机制。
基于 BOLT 的扫描器评估在 Fedora 39 AArch64-linux 发行版中的库上进行,包括大约 3,000 个已安装包。对于 pac-ret,分析揭示了 250 万条返回指令,其中 46,000 条缺乏适当保护。扫描使用 -fstack-clash-protection 的 1,920 个库,识别出 39 个可能易受攻击,尽管有些可能是误报。
关于偏好 BOLT 而非逆向工程领域的工具(如 IDA、Ghidra 或 Angr)引发了一场有趣的讨论。区别在于 BOLT 适用于批量处理二进制文件,而 IDA 或 Ghidra 专注于用户交互性。此外,BOLT 的优势在于它支持最新的目标架构更改,因为它是编译管道的一部分,而逆向工程工具往往滞后,特别是对于更小众的指令。
更多细节,Kristof 在 LLVM discourse 上的 RFC 提供了额外信息。
对于对编译器加固感兴趣的人,OpenSSF 指南提供了全面概述。此外,对于编译器工程师的安全性的更深入讨论,我们建议阅读《低级软件安全》在线书。它仍在进行中,欢迎对指南做出贡献。
关于程序分析和调试的一个值得注意的演讲是《Clang 静态分析器的增量符号执行》,讨论了 Clang 静态分析器如何现在可以缓存结果。这一创新有助于在代码库更改时保持诊断信息的相关性,并最小化调用分析器的需求。另一个亮点是《Mojo 调试:扩展 MLIR 和 LLDB》,探讨了 LLDB 的新发展,允许其在 Clang 环境之外使用。该演讲还涵盖了从 Modular 仓库上游化调试方言的潜力。
MLIR 不仅仅是机器学习
MLIR 是一个编译器基础设施项目,因机器学习(ML)繁荣而获得关注。然而,MLIR 中的 ML 代表多级,该项目允许的远不止张量操作。以 RISC-V 工作闻名的 SiFive 在电路设计等应用中采用它。使用 MLIR 的通用语言编译器也正在涌现,如用于 JavaScript 的 JSIR 方言、作为 Python 超集的 Mojo、ClangIR 以及我们自己的 VAST for C/C++。
本次开发者会议的 MLIR 主题可以总结为“弄清楚如何在共享管道中充分利用 LLVM 和 MLIR”。许多演讲者展示的工作以某种方式得出结论,许多性能优化在 MLIR 中做得更好,得益于其更好的抽象。然后 LLVM 主要负责生成目标机器代码。
在回顾了 MLIR 相比 LLVM 的所有慢速方式后,Jeff Niu(Modular)评论说,在 Mojo 编译器中,大部分运行时仍然花费在 LLVM 中。原因很简单:当代码编译到 LLVM 时,有更多的输入要处理。
慕尼黑工业大学的一个团队甚至选择完全跳过 LLVM IR,直接生成机器-IR(MIR),在即时(JIT)编译工作负载中实现了约 20% 的性能提升。
那些对 MLIR 内部机制感兴趣的人一定要观看第二次会议主题演讲《MLIR 中的高效习惯用法》。该主题演讲深入探讨了不同 MLIR 原语和模式的性能比较。它让开发者对执行操作(如获取属性或迭代或变异 IR)的成本有了很好的直觉。在类似主题上,《接口实现深度探讨》演讲更好地洞察了 MLIR 通用性的基石。这些接口使方言能够表达常见概念,如副作用、符号和控制流交互。该演讲阐明了它们的实现细节以及在追求通用性时产生的相关开销。
基于区域的分析
我们注意到的另一个有趣趋势是,几个独立团队发现,传统上使用基于基本块的控制流图定义的分析在使用基于区域的控制流表示时可能实现更好的运行时性能。这一改进主要是因为分析不需要重建循环信息,整体表示更小,因此分析更快。呈现的主要例子是在 Mojo 编译器内部完成的数据流分析。
对于像 Mojo 这样的情况,从源代码开始并编译基于 MLIR 的管道,切换到基于区域的控制流进行分析只是在管道中更早进行分析的问题。其他用户没那么幸运,需要从传统控制流图构建区域。如果你是其中之一,你并不孤单。高性能计算行业的团队总是在寻找从循环中挤出更多性能的方法,将循环明确表示为区域而不是在图中寻找它们使许多事情变得更容易。这就是为什么 MLIR 现在有一个通行证来将控制流图提升到基于区域的控制流。听起来熟悉吗?在底层,我们的 LLVM-to-C 反编译器 Rellic 做了非常类似的事情。
然而,使用区域进行控制流并非一切顺利。区域需要具有单入口和单出口。然而,许多编程语言允许在循环体内使用 break 和 continue 等结构。这些被视为异常入口或出口。幸运的是,随着关于区域的讨论如此之多,核心 MLIR 开发者已经注意到,并正在酝酿一个主要新功能来解决这个问题。如在 MLIR 研讨会中呈现的,新设计的基于区域的控制流将允许指定 continue 或 break 等结构的语义。想法很简单:这些操作将产生终止信号,并将控制流转发到捕获该信号的某个父区域。不幸的是,这仍然不允许我们在高级表示中表示 goto,因为信令机制只允许用户将控制流传递给父区域。
C/C++ 后继语言
会议上最后一个主要主题是,鉴于最近的发展,C/C++ 的后继语言。其中一个努力是 Carbon,它有一个专门的小组讨论。小组问题范围从技术问题(如如何支持重构工具)到更管理性的问题(如 Carbon 如何避免过度受 Google 需求的影响,Google 目前是项目的主要支持者)。关于小组的更全面总结,请查看 Alex Bradbury 的优秀博客文章。
其他 C++ 替代者也提到了——特别是 Rust 和 Swift。两种语言都认识到 C++ 在软件生态系统中的权威,并有自己的 C++ 互操作性故事。在 Carbon 小组讨论中提到了 Google 的 Crubit for Rust,而 Swift 有 Apple 的 Egor Zhdan 关于互操作性的单独演讲。
我们的贡献
我们自己的 Henrich Lauko 发表了关于 VAST(我们基于 MLIR 的 C/C++ 编译器)即将推出的新功能:IR 塔的演讲。大局观是,VAST 是一个基于 MLIR 的 C/C++ 编译器 IR 项目,提供多层抽象。VAST 的用户然后可以为他们的分析或转换用例选择正确的抽象。然而,有许多有价值的基于 LLVM 的工具,如果我们不能将它们与我们的高级 MLIR 表示一起使用,那将是不幸的。这正是我们开发 IR 塔的原因。它使用户能够将低级分析与高级抽象桥接起来。
IR 塔引入了一种机制,允许用户在转换之间和之后拍摄 IR 快照,并将它们链接在一起,创建来源链。这样,当一段代码更改时,总有一个引用链回到原始输入。敏锐的读者已经会心一笑。
Henrich 呈现的演示用例是通过使用塔将输入 C 源代码一直向下带到 LLVM,执行依赖分析,并通过塔中的来源链接将分析结果一直翻译回 C,来重新利用 MLIR 中的 LLVM 分析。
与 Henrich 一起,Robert Konicar 以 PoTATo 的形式展示了他学生劳动的淀粉果实。该项目实现了一个简单的 MLIR 方言,专门用于实现指向分析。想法是将内存操作从源方言翻译到 PoTATo 方言,进行一些基本优化,然后运行你选择的指向分析,产生别名集。当然,为了将相关信息带回原始代码,可以使用 VAST IR 塔。Robert 在海报上呈现的结果很有希望:在指向分析之前应用基本复制传播显著减少了问题大小。
AI 走廊谈话
除了参加官方演讲和研讨会外,Trail of Bits 代表在休息时间和宴会上花了很多时间与人聊天。许多对话的暗流是各种形式的 AI 和机器学习。因为 EuroLLVM 专注于语言、编译器和硬件运行时,对话通常采取“我们如何最好地服务这种新计算范式?”的形式。硬件人员对如何为专用加速器生成代码感兴趣;编译器人群以各种可想象的方式优化线性代数;而语言正在尽力满足数据科学家的需求。
关于反向项目的讨论——即“机器学习如何帮助 LLVM 人群?”——很少见。这些项目通常研究在 LLVM 周围领域收集的各种数据,以便使用机器学习方法理解它们。从我们所见,像 LLM 和 GAN 这样的东西并没有以任何方式真正提到。似乎是新想法的机会!
如果你喜欢这篇文章,分享它: Twitter LinkedIn GitHub Mastodon Hacker News
页面内容 安全意识 MLIR 不仅仅是机器学习 基于区域的分析 C/C++ 后继语言 我们的贡献 AI 走廊谈话 最近帖子 Trail of Bits 的 Buttercup 在 AIxCC 挑战赛中获得第二名 Buttercup 现在开源! AIxCC 决赛:记录表 攻击者的提示注入工程:利用 GitHub Copilot 在 NVIDIA Triton 中 uncovering 内存损坏(作为新员工) © 2025 Trail of Bits. 使用 Hugo 和 Mainroad 主题生成。