aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/objfile
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/internal/objfile')
-rw-r--r--src/cmd/internal/objfile/disasm.go18
-rw-r--r--src/cmd/internal/objfile/elf.go4
2 files changed, 21 insertions, 1 deletions
diff --git a/src/cmd/internal/objfile/disasm.go b/src/cmd/internal/objfile/disasm.go
index 77bc1221e9..5a7d288e94 100644
--- a/src/cmd/internal/objfile/disasm.go
+++ b/src/cmd/internal/objfile/disasm.go
@@ -25,6 +25,7 @@ import (
"golang.org/x/arch/arm64/arm64asm"
"golang.org/x/arch/loong64/loong64asm"
"golang.org/x/arch/ppc64/ppc64asm"
+ "golang.org/x/arch/riscv64/riscv64asm"
"golang.org/x/arch/s390x/s390xasm"
"golang.org/x/arch/x86/x86asm"
)
@@ -62,7 +63,7 @@ func (e *Entry) Disasm() (*Disasm, error) {
disasm := disasms[goarch]
byteOrder := byteOrders[goarch]
if disasm == nil || byteOrder == nil {
- return nil, fmt.Errorf("unsupported architecture")
+ return nil, fmt.Errorf("unsupported architecture %q", goarch)
}
// Filter out section symbols, overwriting syms in place.
@@ -398,6 +399,19 @@ func disasm_ppc64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.By
return text, size
}
+func disasm_riscv64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.ByteOrder, gnuAsm bool) (string, int) {
+ inst, err := riscv64asm.Decode(code)
+ var text string
+ if err != nil || inst.Op == 0 {
+ text = "?"
+ } else if gnuAsm {
+ text = fmt.Sprintf("%-36s // %s", riscv64asm.GoSyntax(inst, pc, lookup, textReader{code, pc}), riscv64asm.GNUSyntax(inst))
+ } else {
+ text = riscv64asm.GoSyntax(inst, pc, lookup, textReader{code, pc})
+ }
+ return text, 4
+}
+
func disasm_s390x(code []byte, pc uint64, lookup lookupFunc, _ binary.ByteOrder, gnuAsm bool) (string, int) {
inst, err := s390xasm.Decode(code)
var text string
@@ -423,6 +437,7 @@ var disasms = map[string]disasmFunc{
"loong64": disasm_loong64,
"ppc64": disasm_ppc64,
"ppc64le": disasm_ppc64,
+ "riscv64": disasm_riscv64,
"s390x": disasm_s390x,
}
@@ -434,6 +449,7 @@ var byteOrders = map[string]binary.ByteOrder{
"loong64": binary.LittleEndian,
"ppc64": binary.BigEndian,
"ppc64le": binary.LittleEndian,
+ "riscv64": binary.LittleEndian,
"s390x": binary.BigEndian,
}
diff --git a/src/cmd/internal/objfile/elf.go b/src/cmd/internal/objfile/elf.go
index 9048be7d73..8923290cff 100644
--- a/src/cmd/internal/objfile/elf.go
+++ b/src/cmd/internal/objfile/elf.go
@@ -127,6 +127,10 @@ func (f *elfFile) goarch() string {
return "ppc64le"
}
return "ppc64"
+ case elf.EM_RISCV:
+ if f.elf.Class == elf.ELFCLASS64 {
+ return "riscv64"
+ }
case elf.EM_S390:
return "s390x"
}