Cx 开发日志 — 2026-05-01

发布: (2026年5月3日 GMT+8 08:17)
3 分钟阅读
原文: Dev.to

Source: Dev.to

IR 后端更新

内存操作(提交 6252994

  • 向 IR 类型系统中添加了 Ptr 类型(大小 = 8 字节,对齐 = 8 字节)。
  • 新增了三条 IR 指令:
    • Alloca – 按指定的大小和对齐方式在栈上分配空间。
    • Load – 从特定类型的指针读取值。
    • Store – 通过指针写入值。

IR 验证器现在包含 43 项新检查,强制执行以下规则:

  • Alloca 的大小必须 > 0,且对齐必须是 2 的幂。
  • LoadStore 要求指针操作数显式标记为 IrType::Ptr

这些扩展对于处理超出单寄存器值的内存结构至关重要,类似于 Cranelift 或 LLVM 降级阶段中的基础设施。

结构体注册表(提交 c95eea6

  • 引入 build_struct_table(),遍历每个 SemanticStmt::StructDef
  • 对每个结构体,字段类型被降级并通过 compute_struct_layout()(最初在第 8 阶段加入)计算布局。
  • StructLayoutInfo 现在记录字段的偏移、大小和对齐,并在 LoweringCtx 与降级函数之间传递。
  • lower_type 现在将 SemanticType::Struct(_) 映射为 Ok(IrType::Ptr),而不再返回 UnsupportedSemanticType

这与 LLVM 将结构体视为指针的做法相呼应,提高了计算效率。布局计算仅在每个结构体上执行一次,并在函数之间复用,避免了重复工作。

Submain 与 Main

  • Submain:在 34 天内有 22 次新提交,包含第 10‑11 阶段的更新(错误管理、溢出控制、可选分号)。
  • 测试覆盖率:submain 有 117 条测试,main 有 78 条。
  • 风险:长期分叉会增加集成难度和项目风险。合并工作亟需进行。

下一步

  1. 降级结构体字段访问 – 使用 StructLayoutInfo 实现点访问的降级,进行指针算术后再使用 Load/Store
  2. 降级结构体字面量 – 将 SemanticExprKind::StructLit 转换为 Alloca 加上基于布局偏移的每个字段的 Store 操作。
  3. 将 submain 合并到 main – 最高优先级;需要整合 22 次新提交和 39 条待完成的测试。

这些工作为 Cx 中更复杂的结构体处理奠定了基础。立即开展实现工作并完成待合并的内容,对统一项目进展至关重要。

关注 Cx 语言项目

0 浏览
Back to Blog

相关文章

阅读更多 »

Binalyzer:Phase 3 已完成!

概述:比较 ELF 与 PE 的节分析,解释格式差异以及你是如何处理的。最后,Binalyzer 的第 3 阶段现在已经…