为了账号安全,请及时绑定邮箱和手机立即绑定

Go 编译器在 x0 中产生奇怪的负载

Go 编译器在 x0 中产生奇怪的负载

Go
梦里花落0921 2022-06-21 10:07:57
我正在使用带有 linux/riscv64 目标的 Go 1.14,并且我正在编译一个 hello world,我在程序集中看到了这个:1b078:       04813183                ld      gp,72(sp)1b07c:       00018003                lb      zero,0(gp)1b080:       00313423                sd      gp,8(sp)正如您所看到的,从 [GP+0] 开始,负载为零,根据规范,这应该是“异常或其他”:即使加载值被丢弃,目标为 x0 的加载仍必须引发任何异常并导致任何其他副作用。这里到底发生了什么?编译器是否产生错误的输出?
查看完整描述

1 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

我对继续 riscv 一无所知,但这是一种常见的模式。

内存访问仅检查 [gp+0] 是否可访问和可读,而无需实际读取。

这对于以下情况很有用:


func f(a *[0x100001]byte) {

    (*a)[0x100000] = 1;

}

编译器必须生成以下伪代码:


check_not_null(a)

store(a + 0x100000, 1)

可以使用您发现的相同构造来实现空检查,而无需分支。


查看完整回答
反对 回复 2022-06-21
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信