GSoC 2024:ClangIR 中的 ABI 降低
ClangIR 是在 LLVM 生态系统中为 C/C++ 构建高级中间表示 (IR) 的一项持续性工作。其主要优势在于能够保留更多源代码信息。虽然 ClangIR 正在取得进展,但它仍然缺少某些功能,尤其是 ABI 处理。目前,ClangIR 会降低大多数函数,而不会考虑 ABI 特定的调用约定细节。
目标
“使用 ClangIR 构建和运行单源基准测试 - 第 2 部分” Google Summer of Code 2024 构建在我 GSoC 2023 中贡献的基础上,解决了我在遇到的主要问题之一:目标特定降低。它侧重于扩展 ClangIR 的代码生成功能,特别是在 X86-64 的 ABI 降低方面。一些测试依赖于操作和类型(例如,va_arg
调用和复杂数据类型),这些操作和类型需要目标特定信息才能正确编译。
实现这些目标的具体步骤如下
- 实现基础设施,能够扩展到多种架构,同时遵循 ClangIR 的设计原则,例如 CodeGen 奇偶校验、功能保护和 AST 反向引用。
- 处理基本的调用约定场景,作为验证基础设施的概念证明。
- 为第二种架构添加降低功能,以进一步验证基础设施的可扩展性。
- 将目标特定的 ClangIR 降低功能统一到库中,因为有一些孤立的方法处理目标特定的代码降低功能,例如
cir.va_arg
。 - 将调用约定降低集成到主管道中,以确保未来贡献和基础设施的持续发展。
贡献
贡献(PR)列表可以在 这里 找到。
目标降低库
该项目最重要的贡献是开发了模块化的 TargetLowering
库。这确保了目标特定的 MLIR 降低传递可以利用此共享库进行降低逻辑。该库还遵循 ClangIR 的功能保护原则,确保任何贡献者都可以参考原始 CodeGen 进行贡献,任何未实现的功能都会在特定代码点断言,从而易于跟踪缺失的功能。
调用约定降低传递
作为概念证明,TargetLowering
库的初始开发侧重于实现一个 调用约定降低传递,该传递面向多种架构。目前,ClangIR 在 CodeGen 期间忽略目标 ABI,以保留高级信息。例如,结构体不会被展开以提高参数传递效率。ABI 特定的 LLVM 属性也会被忽略。此传递通过正确标记 LLVM 属性并重写函数定义和调用来处理展开的结构体,从而解决了这些问题。这已在 X86-64 和 AArch64 中实现,展示了该库的多架构支持。
不足
目标特定降低统一
虽然一些目标特定的降低代码已移入库,但它是复制和粘贴,而不是正确集成。这不利于利用该库的多架构功能。
集成到主管道
这仍然在进行中,因为该库尚未成熟到足以处理大多数现有的 ClangIR 测试。对于许多未实现的功能,也存在带有不可达语句的功能保护。
未来工作
现在,已经有了处理目标无关到目标特定 CIR 代码的基础设施,还有大量未来的工作要做,包括:
- 使用 MLIR 的内置工具改进 DataLayout 相关查询。
- 实现对更多类型的调用约定降低,例如指针。
- 扩展 TargetLowering 库以支持更多架构。
- 统一 ClangIR 其他部分中剩余的目标特定降低代码。
鸣谢
我要感谢我的 Google Summer of Code 导师 Bruno Cardoso Lopes 和 Nathan Lanza,感谢他们又一次为我提供了很棒的 GSoC 体验。我还要感谢 LLVM 社区和 Google 组织了这个项目。