在 LLVM 中处理结构参数和返回的混乱情况

  • 主要观点:Inko 0.18.0 计划添加在栈上分配类型的功能,这涉及到处理结构参数和返回值的复杂问题,LLVM 在此方面存在不足,需各前端生成符合目标 ABI 的 IR,文中给出了 AMD64 和 ARM64 架构下处理结构参数和返回值的规则及示例。
  • 关键信息

    • Inko 0.18.0 可定义在栈上分配的类型。
    • LLVM 支持聚合类型但不处理与目标 ABI 兼容的机器码。
    • 不同架构(AMD64、ARM64)处理结构参数和返回值的规则不同。
    • 结构在 IR 级别需复制以处理类型不匹配问题。
    • LLVM 可引入system-abi函数属性改善此情况。
  • 重要细节

    • AMD64 中,结构大小小于 8 字节以整数传递,8 到 16 字节需分类组合字段,大于 16 字节保持结构类型并设置byval参数属性;返回结构逻辑与传递类似,大于 16 字节需特殊处理。
    • ARM64 中,结构为同质浮点聚合时返回扁平化版本,否则根据大小分别以 64 位整数、一对i64值或指针传递;返回结构规则与传递类似,小于 8 字节返回整数。
    • 处理结构参数和返回值时可能需使用memcpy,并可通过memcpyopt优化 pass 去除不必要的memcpy调用。
    • 介绍了引入system-abi函数属性的想法,以简化结构处理并减少 ABI 相关错误,但此想法是否会被添加到 LLVM 中尚不确定。
阅读 5
0 条评论