diff options
Diffstat (limited to 'src/cmd/internal/objfile')
| -rw-r--r-- | src/cmd/internal/objfile/disasm.go | 18 | ||||
| -rw-r--r-- | src/cmd/internal/objfile/elf.go | 4 |
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" } |
