aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/objfile
diff options
context:
space:
mode:
authorGuoqi Chen <chenguoqi@loongson.cn>2024-08-28 17:01:15 +0800
committerabner chenc <chenguoqi@loongson.cn>2024-09-19 00:40:50 +0000
commit165bf241f2f7c72cffd83e278d674ae3ddbd72a1 (patch)
tree9d97d45a9ae2b245e3ec419e9cbf55c6cb8f6900 /src/cmd/internal/objfile
parent7ba074fe43a3c1e9a35cd579520d7184d3a20d36 (diff)
downloadgo-165bf241f2f7c72cffd83e278d674ae3ddbd72a1.tar.xz
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 <limeidan@loongson.cn> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: David Chase <drchase@google.com> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: sophie zhao <zhaoxiaolin@loongson.cn>
Diffstat (limited to 'src/cmd/internal/objfile')
-rw-r--r--src/cmd/internal/objfile/disasm.go16
-rw-r--r--src/cmd/internal/objfile/elf.go2
2 files changed, 18 insertions, 0 deletions
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"