Rust 到 C 的编译器 - 95.9%的测试通过率,奇怪的平台以及一次 Rust 周的演讲

主要观点:

  • 介绍在Rust to C 编译器上的进展,包括新的文章格式、演讲、测试通过情况、修复的 bug、子切片问题、回退内在函数、支持更多 C 编译器、性能提升和内部重构等。
    关键信息:
  • 将在 Rust Week 期间做关于该项目的演讲,平衡了初学者友好和高级话题。
  • 核心测试通过率从 92%提升到 95.9%,.NET 侧的 Rust 核心测试通过率达到 96.3%。
  • 修复了 128 位整数相关的内在函数问题,如__builtin_popcountll的错误使用、溢出检查等。
  • 解决了子切片的 bug,之前仅在特定模式下出现且未被检测到。
  • 发现一些内在函数可由 Rust 编译器支持的模拟版本实现,节省了手动实现的工作。
  • 努力提高 C 编译器兼容性,以支持更多平台,但遇到获取某些平台编译器的法律问题。
  • 目前计划尽可能符合标准 C99,使用标准 POSIX API,并扩展内在函数的回退列表。
  • 进行了各种性能改进,如整数字面量的处理、嵌入调试信息的方式等。
  • rustc_codegen_clr进行了内部重构,将部分内容拆分为单独的 crate 并推进到更内存高效的内部表示。
    重要细节:
  • C 的__builtin_popcount内在函数有 3 个变体,__builtin_popcountll用于unsigned long long类型,非 128 位整数。
  • 实现 128 位整数的位计数内在函数时曾错误地截断为 64 位。
  • 子切片 bug 是忘记了sizeof导致偏移错误,仅在从切片末尾子切片时出错。
  • 某些内在函数如carrying_mul_add在处理 128 位整数时需要特殊处理,因为 C 不支持大于 128 位的整数。
  • 支持更多 C 编译器有助于 Rust 代码在更多平台运行,但获取某些平台编译器存在法律和预算问题。
  • 进行了性能改进,如整数字面量的十六进制和十进制形式大小比较、更智能的嵌入调试信息方式等。
  • 内部重构解决了一些与动态大小类型相关的复杂问题,将逐步完全迁移到新的内部表示。
阅读 31
0 条评论