go cmd/internal/obj/x86:改进汇编错误消息

um6iljoc  于 6个月前  发布在  Go
关注(0)|答案(4)|浏览(57)

一些汇编器错误信息具有误导性,且缺少上下文信息。
程序员遇到的99%的错误是invalid instruction,这并没有太大帮助。
Go(或Plan 9)汇编器有其特殊之处,使得初次体验与这样的错误信息相结合,非常令人不愉快。
错误信息的多个方面可以改进,但对于刚开始的时候,一些明显糟糕的事情可以改变。
我提出了一些错误信息可以更精确/详细的情况。如果适用,对于相同情况的clang汇编器错误信息也提供了。
这是一个关于此主题的讨论的提议。也许有人会指出重要的陷阱,或者提供更多值得修复的情况。
此范围仅限于x86汇编器后端。

TEXT main·asmErrors(SB),$0
// 1
// Case: immediate operand overflow.
// Note: base16->base10 constant conversion inerror message
//       is annoying too,but it is separate issue.
//
// Have: "invalid instruction: ADDQ $-2415919103, AX"
// Want: "ADDQ(imm32,r): constant -2415919103 overflows imm32"
ADDQ $-0x8FFFFFFF,AX
// 2
// Case: invalid operand types combination.
//
// Have: "invalid instruction: MOVL (R8), (R9)"
// Want: "MOVL with (mem,mem) operands combination does not exist"
//
// Clang:
// > invalid operand for instruction
// >   movl (%R8),(%R9)
// >               ^~~~~
MOVL (R8),(R9)
// 3
// Case: negative immediate for unsigned operand.
//
// Have: "invalid instruction: PSHUFL: $-10, X0, X1"
// Want: "PSHUFL(uint8,xmm,xmm): invalid negative immediate value -10"
PSHUFL $-10,X0,X1
// 4
// Case: using "SP"register as "index"inSIB addressing.
// Note: same goes for XMM andother non-suitable for index registers.
//
// Have: "invalid instruction: MOVL (AX)(SP*2), AX"
// Want: "SP register can't be used as index inSIB addressing"
MOVL (AX)(SP*2),AX
// 5
// Case: SIB without explicit "scale".
// See:  #13282.
//
// Have[1]: "invalid instruction: MOVL foo<>(SB)(AX), AX"
// Have[2]: "asmidx: bad address 0/2064/2064"
// Want:    "SIB addressing without explicit scale is forbidden"
MOVL foo<>(SB)(AX),AX// [1]
MOVL (AX)(AX),AX// [2]

RET
qyyhg6bp

qyyhg6bp1#

Want 部分提供的错误信息仅用于演示目的。
我认为收集尽可能多的奇怪案例更为重要,以评估可以带来多大的改进。
这次调查使我发现了两个距离较远的相关问题。

  1. BYTE 接受 uint64 参数,但始终只写入单字节。默默无闻地。
  2. asmidx: blah-blah 这样的错误不提供错误位置(源文件+行)。
2admgd59

2admgd592#

"非法指令"错误信息非常离奇:
https://blog.sgmansfield.com/2017/04/a-foray-into-go-assembly-programming/
我几乎准备了一个CL,用于修复大多数"无效指令"错误消息,使其更精确和描述性。

iyzzxitl

iyzzxitl3#

https://golang.org/cl/108515提到了这个问题:cmd/internal/obj/x86: improve error messages

v6ylcynt

v6ylcynt4#

我认为收集尽可能多的奇怪案例更为重要,以评估可以带来多大的改进。我遇到了以下案例:

TEXT ·test(SB), NOSPLIT, $0
    // valid: LEAQ 0(CX)(R14*1), R15
    LEAQ 0(CX)(R14), R15
    RET

信息是:

asm: asmidx: bad address 0/2078/2065
asm: assembly failed

相关问题