Go 编译器对 x0 产生奇怪的负载
Go compiler produces strange load into x0
我正在使用带有 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] 加载到零,根据规范,这应该是“异常或其他”:
Loads with a destination of x0 must still raise any exceptions and cause any other side effects even though the load value is discarded.
这里到底发生了什么?编译器是否产生错误输出?
我对 go on riscv 一无所知,但这是一种常见的模式。
内存访问只检查[gp+0]是否可访问和可读,而不实际读取。
这对于以下情况很有用:
func f(a *[0x100001]byte) {
(*a)[0x100000] = 1;
}
编译器必须生成以下伪代码:
check_not_null(a)
store(a + 0x100000, 1)
空值检查可以使用您发现的相同结构来实现,无需分支。
我正在使用带有 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] 加载到零,根据规范,这应该是“异常或其他”:
Loads with a destination of x0 must still raise any exceptions and cause any other side effects even though the load value is discarded.
这里到底发生了什么?编译器是否产生错误输出?
我对 go on riscv 一无所知,但这是一种常见的模式。
内存访问只检查[gp+0]是否可访问和可读,而不实际读取。
这对于以下情况很有用:
func f(a *[0x100001]byte) {
(*a)[0x100000] = 1;
}
编译器必须生成以下伪代码:
check_not_null(a)
store(a + 0x100000, 1)
空值检查可以使用您发现的相同结构来实现,无需分支。