- 主要观点: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 中尚不确定。
- AMD64 中,结构大小小于 8 字节以整数传递,8 到 16 字节需分类组合字段,大于 16 字节保持结构类型并设置
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。