Skip to content

Commit 851ebc2

Browse files
committed
cmd/internal/objfile,cmd/objdump: add disassembly support for riscv64
Add support to `go tool objdump` for disassembling riscv64 binaries. Revendor to bring in cmd/vendor/golang.org/x/arch/riscv64/riscv64asm, which provides the actual disassembly implementation. Fixes #36738 Change-Id: I0f29968509041c0c5698fc2d6910a6a0bea9d3c0 Cq-Include-Trybots: luci.golang.try:gotip-linux-riscv64 Reviewed-on: https://go-review.googlesource.com/c/go/+/622257 LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Cherry Mui <[email protected]> Reviewed-by: Carlos Amedee <[email protected]> Reviewed-by: Meng Zhuo <[email protected]> Reviewed-by: Michael Pratt <[email protected]>
1 parent aef81a7 commit 851ebc2

File tree

11 files changed

+3939
-3
lines changed

11 files changed

+3939
-3
lines changed

src/cmd/internal/objfile/disasm.go

+17-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"golang.org/x/arch/arm64/arm64asm"
2626
"golang.org/x/arch/loong64/loong64asm"
2727
"golang.org/x/arch/ppc64/ppc64asm"
28+
"golang.org/x/arch/riscv64/riscv64asm"
2829
"golang.org/x/arch/s390x/s390xasm"
2930
"golang.org/x/arch/x86/x86asm"
3031
)
@@ -62,7 +63,7 @@ func (e *Entry) Disasm() (*Disasm, error) {
6263
disasm := disasms[goarch]
6364
byteOrder := byteOrders[goarch]
6465
if disasm == nil || byteOrder == nil {
65-
return nil, fmt.Errorf("unsupported architecture")
66+
return nil, fmt.Errorf("unsupported architecture %q", goarch)
6667
}
6768

6869
// Filter out section symbols, overwriting syms in place.
@@ -398,6 +399,19 @@ func disasm_ppc64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.By
398399
return text, size
399400
}
400401

402+
func disasm_riscv64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.ByteOrder, gnuAsm bool) (string, int) {
403+
inst, err := riscv64asm.Decode(code)
404+
var text string
405+
if err != nil || inst.Op == 0 {
406+
text = "?"
407+
} else if gnuAsm {
408+
text = fmt.Sprintf("%-36s // %s", riscv64asm.GoSyntax(inst, pc, lookup, textReader{code, pc}), riscv64asm.GNUSyntax(inst))
409+
} else {
410+
text = riscv64asm.GoSyntax(inst, pc, lookup, textReader{code, pc})
411+
}
412+
return text, 4
413+
}
414+
401415
func disasm_s390x(code []byte, pc uint64, lookup lookupFunc, _ binary.ByteOrder, gnuAsm bool) (string, int) {
402416
inst, err := s390xasm.Decode(code)
403417
var text string
@@ -423,6 +437,7 @@ var disasms = map[string]disasmFunc{
423437
"loong64": disasm_loong64,
424438
"ppc64": disasm_ppc64,
425439
"ppc64le": disasm_ppc64,
440+
"riscv64": disasm_riscv64,
426441
"s390x": disasm_s390x,
427442
}
428443

@@ -434,6 +449,7 @@ var byteOrders = map[string]binary.ByteOrder{
434449
"loong64": binary.LittleEndian,
435450
"ppc64": binary.BigEndian,
436451
"ppc64le": binary.LittleEndian,
452+
"riscv64": binary.LittleEndian,
437453
"s390x": binary.BigEndian,
438454
}
439455

src/cmd/internal/objfile/elf.go

+4
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ func (f *elfFile) goarch() string {
127127
return "ppc64le"
128128
}
129129
return "ppc64"
130+
case elf.EM_RISCV:
131+
if f.elf.Class == elf.ELFCLASS64 {
132+
return "riscv64"
133+
}
130134
case elf.EM_S390:
131135
return "s390x"
132136
}

src/cmd/objdump/objdump_test.go

-2
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,6 @@ func mustHaveDisasm(t *testing.T) {
105105
switch runtime.GOARCH {
106106
case "mips", "mipsle", "mips64", "mips64le":
107107
t.Skipf("skipping on %s, issue 12559", runtime.GOARCH)
108-
case "riscv64":
109-
t.Skipf("skipping on %s, issue 36738", runtime.GOARCH)
110108
}
111109
}
112110

src/cmd/vendor/golang.org/x/arch/riscv64/riscv64asm/arg.go

+116
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)