EuroLLVM 2024技术报告
安全认知升级
与往年相比,最显著的变化是安全议题的凸显。LLVM社区正积极推动整个软件生态系统安全性的提升,编译器领域首次将安全列为与优化、翻译并列的第三大核心支柱。
ARM的Kristof Beyls在主题演讲中通过BOLT工具验证安全缓解措施的实际应用效果,重点检测-fstack-clash-protection
和-mbranch-protection=standard
(特别是pac-ret机制)。在Fedora 39 AArch64发行版的3000个软件包扫描中,发现250万条返回指令中有4.6万条缺乏保护,1920个使用栈冲突保护的库中39个存在潜在漏洞。
BOLT相比IDA/Ghidra等逆向工具的优势在于其批处理能力和对最新架构的即时支持。开发者可参考Kristof在LLVM论坛的RFC文档,以及OpenSSF指南和《低级软件安全》在线书籍获取更多安全实践指导。
MLIR超越机器学习
虽然MLIR因机器学习热潮而兴起,但其"ML"实际代表"多层级"。SiFive将其应用于RISC-V电路设计,新兴项目包括JSIR(JavaScript)、Mojo(Python超集)、ClangIR以及Trail of Bits的VAST(C/C++编译器)。
会议核心共识表明:多数性能优化更适合在MLIR层面完成,LLVM主要负责目标代码生成。Modular的Jeff Niu指出Mojo编译器大部分运行时仍消耗在LLVM阶段,而慕尼黑工业大学团队直接生成机器IR(MIR),在JIT编译中实现约20%的性能提升。
关键技术分享包括:
- 《MLIR高效惯用法》主题演讲:对比不同MLIR原语性能模式
- 《接口实现深度解析》:详解MLIR泛型核心机制的实现开销
基于区域的分析
多个独立团队发现:传统基于基本块的控制流图分析在改用区域化控制流表示时可获得更好的运行时性能。这种改进源于无需重建循环信息,且表示形式更紧凑。
Mojo编译器内部的数据流分析是典型案例。MLIR现已提供将控制流图提升为区域化表示的通道(pass),与Trail of Bits的LLVM-to-C反编译器Rellic采用相似思路。
区域化控制的挑战在于需要单入口/单出口结构,而break/continue等语句会造成异常出口。MLIR核心开发者正在设计新特性,通过终止信号机制将控制流转至父区域,但目前仍无法支持goto语句的高层表示。
C/C++后继语言
会议重点讨论了C/C++的替代语言方案。Carbon语言设有专题讨论组,议题涵盖重构工具支持到如何避免过度受谷歌影响等技术管理问题。Rust(通过Google的Crubit项目)和Swift(苹果的Egor Zhdan分享互操作性方案)也展示了与C++的互操作策略。
技术贡献
VAST的IR塔架构
Henrich Lauko展示了VAST编译器的新特性"IR塔",支持在变换过程中拍摄IR快照并建立溯源链。演示案例通过将C源码降至LLVM层进行依赖分析,再通过溯源链将结果回溯至C代码层面。
PoTATo指针分析
Robert Konicar展示了专为指针分析设计的MLIR方言,通过将内存操作转换为PoTATo方言并进行基本优化,可运行指针分析生成别名集。结合VAST的IR塔可实现分析结果的原代码映射,基础复制传播优化显著减小了问题规模。
AI技术走廊讨论
会间交流聚焦"如何最佳服务新计算范式":硬件专家关注专用加速器代码生成,编译器团队优化线性代数计算,语言团队努力满足数据科学家需求。相反方向的研究(如何用机器学习助力LLVM社区)相对较少,为创新思路留下了空间。
分享至: Twitter | LinkedIn | GitHub | Mastodon | Hacker News