From 165bf241f2f7c72cffd83e278d674ae3ddbd72a1 Mon Sep 17 00:00:00 2001 From: Guoqi Chen Date: Wed, 28 Aug 2024 17:01:15 +0800 Subject: cmd/objdump: add loong64 disassembler support This CL provides vendor support for loong64 disassembler gnu and plan9 syntax. cd $GOROOT/src/cmd go get golang.org/x/arch@master go mod tidy go mod vendor Change-Id: Ic8b888de0aa11cba58cbf559f8f69337d1d69309 Reviewed-on: https://go-review.googlesource.com/c/go/+/609015 Reviewed-by: Meidan Li LUCI-TryBot-Result: Go LUCI Reviewed-by: David Chase Reviewed-by: Dmitri Shuralyov Reviewed-by: sophie zhao --- src/cmd/internal/objfile/disasm.go | 16 ++++++++++++++++ src/cmd/internal/objfile/elf.go | 2 ++ 2 files changed, 18 insertions(+) (limited to 'src/cmd/internal/objfile') diff --git a/src/cmd/internal/objfile/disasm.go b/src/cmd/internal/objfile/disasm.go index 960778e8a6..77bc1221e9 100644 --- a/src/cmd/internal/objfile/disasm.go +++ b/src/cmd/internal/objfile/disasm.go @@ -23,6 +23,7 @@ import ( "golang.org/x/arch/arm/armasm" "golang.org/x/arch/arm64/arm64asm" + "golang.org/x/arch/loong64/loong64asm" "golang.org/x/arch/ppc64/ppc64asm" "golang.org/x/arch/s390x/s390xasm" "golang.org/x/arch/x86/x86asm" @@ -367,6 +368,19 @@ func disasm_arm64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.By return text, 4 } +func disasm_loong64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.ByteOrder, gnuAsm bool) (string, int) { + inst, err := loong64asm.Decode(code) + var text string + if err != nil || inst.Op == 0 { + text = "?" + } else if gnuAsm { + text = fmt.Sprintf("%-36s // %s", loong64asm.GoSyntax(inst, pc, lookup), loong64asm.GNUSyntax(inst)) + } else { + text = loong64asm.GoSyntax(inst, pc, lookup) + } + return text, 4 +} + func disasm_ppc64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.ByteOrder, gnuAsm bool) (string, int) { inst, err := ppc64asm.Decode(code, byteOrder) var text string @@ -406,6 +420,7 @@ var disasms = map[string]disasmFunc{ "amd64": disasm_amd64, "arm": disasm_arm, "arm64": disasm_arm64, + "loong64": disasm_loong64, "ppc64": disasm_ppc64, "ppc64le": disasm_ppc64, "s390x": disasm_s390x, @@ -416,6 +431,7 @@ var byteOrders = map[string]binary.ByteOrder{ "amd64": binary.LittleEndian, "arm": binary.LittleEndian, "arm64": binary.LittleEndian, + "loong64": binary.LittleEndian, "ppc64": binary.BigEndian, "ppc64le": binary.LittleEndian, "s390x": binary.BigEndian, diff --git a/src/cmd/internal/objfile/elf.go b/src/cmd/internal/objfile/elf.go index f25e4a65d6..9048be7d73 100644 --- a/src/cmd/internal/objfile/elf.go +++ b/src/cmd/internal/objfile/elf.go @@ -120,6 +120,8 @@ func (f *elfFile) goarch() string { return "arm" case elf.EM_AARCH64: return "arm64" + case elf.EM_LOONGARCH: + return "loong64" case elf.EM_PPC64: if f.elf.ByteOrder == binary.LittleEndian { return "ppc64le" -- cgit v1.3