mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/internal/disasm: correct instruction length handling for riscv64
disasm_riscv64 currently always returns an instruction length of four, which is not correct if compressed instructions are in use. Return the length of the decoded instruction, defaulting to two bytes if the instruction is unknown. With this change it is possible to correctly objdump a binary that is written in C and includes compressed instructions: $ go tool objdump ./hello TEXT _start(SB) :0 0x5b0 ef002002 CALL 8(PC) :0 0x5b4 aa87 ADD X10, X0, X15 :0 0x5b6 17250000 AUIPC $2, X10 :0 0x5ba 033525a3 MOV -1486(X10), X10 :0 0x5be 8265 MOV (X2), X11 :0 0x5c0 3000 ADDI $8, X2, X12 ... Fixes #71102 Change-Id: Ia99eb114a98c6d535de872ce8a526cd5e6203fff Reviewed-on: https://go-review.googlesource.com/c/go/+/639995 Reviewed-by: Michael Knyszek <mknyszek@google.com> Reviewed-by: Jorropo <jorropo.pgm@gmail.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Michael Pratt <mpratt@google.com>
This commit is contained in:
parent
a76cc5a4ec
commit
d8ad4af78b
1 changed files with 3 additions and 1 deletions
|
|
@ -410,14 +410,16 @@ func disasm_ppc64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.By
|
||||||
func disasm_riscv64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.ByteOrder, gnuAsm bool) (string, int) {
|
func disasm_riscv64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.ByteOrder, gnuAsm bool) (string, int) {
|
||||||
inst, err := riscv64asm.Decode(code)
|
inst, err := riscv64asm.Decode(code)
|
||||||
var text string
|
var text string
|
||||||
|
size := inst.Len
|
||||||
if err != nil || inst.Op == 0 {
|
if err != nil || inst.Op == 0 {
|
||||||
|
size = 2
|
||||||
text = "?"
|
text = "?"
|
||||||
} else if gnuAsm {
|
} else if gnuAsm {
|
||||||
text = fmt.Sprintf("%-36s // %s", riscv64asm.GoSyntax(inst, pc, lookup, textReader{code, pc}), riscv64asm.GNUSyntax(inst))
|
text = fmt.Sprintf("%-36s // %s", riscv64asm.GoSyntax(inst, pc, lookup, textReader{code, pc}), riscv64asm.GNUSyntax(inst))
|
||||||
} else {
|
} else {
|
||||||
text = riscv64asm.GoSyntax(inst, pc, lookup, textReader{code, pc})
|
text = riscv64asm.GoSyntax(inst, pc, lookup, textReader{code, pc})
|
||||||
}
|
}
|
||||||
return text, 4
|
return text, size
|
||||||
}
|
}
|
||||||
|
|
||||||
func disasm_s390x(code []byte, pc uint64, lookup lookupFunc, _ binary.ByteOrder, gnuAsm bool) (string, int) {
|
func disasm_s390x(code []byte, pc uint64, lookup lookupFunc, _ binary.ByteOrder, gnuAsm bool) (string, int) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue