【问题标题】:Go compiler produces strange load into x0Go 编译器在 x0 中产生奇怪的负载
【发布时间】:2020-07-26 20:42:12
【问题描述】:

我正在使用带有 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 的加载仍然必须引发任何异常并导致任何其他副作用,即使加载值被丢弃。

这里到底发生了什么?编译器是否产生错误输出?

【问题讨论】:

    标签: go riscv


    【解决方案1】:

    我对继续使用 riscv 一无所知,但这是一种常见的模式。
    内存访问仅检查 [gp+0] 是否可访问和可读,而无需实际读取。
    这对于以下情况很有用:

    func f(a *[0x100001]byte) {
        (*a)[0x100000] = 1;
    }
    

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

    check_not_null(a)
    store(a + 0x100000, 1)
    

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

    【讨论】:

    • 这是有道理的。我想一旦检查了内存保护,这就是空操作。
    猜你喜欢
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多