LLVM 项目博客

LLVM 项目新闻和来自前线的详细信息

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 调用和复杂数据类型),这些操作和类型需要目标特定信息才能正确编译。

实现这些目标的具体步骤如下

  1. 实现基础设施,能够扩展到多种架构,同时遵循 ClangIR 的设计原则,例如 CodeGen 奇偶校验、功能保护和 AST 反向引用。
  2. 处理基本的调用约定场景,作为验证基础设施的概念证明。
  3. 为第二种架构添加降低功能,以进一步验证基础设施的可扩展性。
  4. 将目标特定的 ClangIR 降低功能统一到库中,因为有一些孤立的方法处理目标特定的代码降低功能,例如 cir.va_arg
  5. 将调用约定降低集成到主管道中,以确保未来贡献和基础设施的持续发展。

贡献

贡献(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 组织了这个项目。