Skip to content

Commit 165bf24

Browse files
committed
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 <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: David Chase <[email protected]> Reviewed-by: Dmitri Shuralyov <[email protected]> Reviewed-by: sophie zhao <[email protected]>
1 parent 7ba074f commit 165bf24

File tree

12 files changed

+2871
-6
lines changed

12 files changed

+2871
-6
lines changed

src/cmd/go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.24
44

55
require (
66
github.com/google/pprof v0.0.0-20240722153945-304e4f0156b8
7-
golang.org/x/arch v0.9.1-0.20240807172201-9d90945922a7
7+
golang.org/x/arch v0.10.1-0.20240910142527-7874f23b9c06
88
golang.org/x/build v0.0.0-20240722200705-b9910f320300
99
golang.org/x/mod v0.20.0
1010
golang.org/x/sync v0.8.0

src/cmd/go.sum

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465 h1:KwWnWVW
66
github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw=
77
github.com/yuin/goldmark v1.6.0 h1:boZcn2GTjpsynOsC0iJHnBWa4Bi0qzfJjthwauItG68=
88
github.com/yuin/goldmark v1.6.0/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
9-
golang.org/x/arch v0.9.1-0.20240807172201-9d90945922a7 h1:4+03DsxQb03qtr7e32FA8tiq18ytCUClXaXxQBDRGbs=
10-
golang.org/x/arch v0.9.1-0.20240807172201-9d90945922a7/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
9+
golang.org/x/arch v0.10.1-0.20240910142527-7874f23b9c06 h1:UQRD9d43XiTfPsm0o04gmvWqcLLGkwqV+bOwtb7AP6c=
10+
golang.org/x/arch v0.10.1-0.20240910142527-7874f23b9c06/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
1111
golang.org/x/build v0.0.0-20240722200705-b9910f320300 h1:2Cqg4LnvfD2ZpG8+6KbyYUkweWhNS3SgfcN/eeVseJ0=
1212
golang.org/x/build v0.0.0-20240722200705-b9910f320300/go.mod h1:YsGhg4JUVUWLzdqU2wCrtpRrOveOql6w56FLDHq/CJ4=
1313
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=

src/cmd/internal/objfile/disasm.go

+16
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323

2424
"golang.org/x/arch/arm/armasm"
2525
"golang.org/x/arch/arm64/arm64asm"
26+
"golang.org/x/arch/loong64/loong64asm"
2627
"golang.org/x/arch/ppc64/ppc64asm"
2728
"golang.org/x/arch/s390x/s390xasm"
2829
"golang.org/x/arch/x86/x86asm"
@@ -367,6 +368,19 @@ func disasm_arm64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.By
367368
return text, 4
368369
}
369370

371+
func disasm_loong64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.ByteOrder, gnuAsm bool) (string, int) {
372+
inst, err := loong64asm.Decode(code)
373+
var text string
374+
if err != nil || inst.Op == 0 {
375+
text = "?"
376+
} else if gnuAsm {
377+
text = fmt.Sprintf("%-36s // %s", loong64asm.GoSyntax(inst, pc, lookup), loong64asm.GNUSyntax(inst))
378+
} else {
379+
text = loong64asm.GoSyntax(inst, pc, lookup)
380+
}
381+
return text, 4
382+
}
383+
370384
func disasm_ppc64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.ByteOrder, gnuAsm bool) (string, int) {
371385
inst, err := ppc64asm.Decode(code, byteOrder)
372386
var text string
@@ -406,6 +420,7 @@ var disasms = map[string]disasmFunc{
406420
"amd64": disasm_amd64,
407421
"arm": disasm_arm,
408422
"arm64": disasm_arm64,
423+
"loong64": disasm_loong64,
409424
"ppc64": disasm_ppc64,
410425
"ppc64le": disasm_ppc64,
411426
"s390x": disasm_s390x,
@@ -416,6 +431,7 @@ var byteOrders = map[string]binary.ByteOrder{
416431
"amd64": binary.LittleEndian,
417432
"arm": binary.LittleEndian,
418433
"arm64": binary.LittleEndian,
434+
"loong64": binary.LittleEndian,
419435
"ppc64": binary.BigEndian,
420436
"ppc64le": binary.LittleEndian,
421437
"s390x": binary.BigEndian,

src/cmd/internal/objfile/elf.go

+2
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ func (f *elfFile) goarch() string {
120120
return "arm"
121121
case elf.EM_AARCH64:
122122
return "arm64"
123+
case elf.EM_LOONGARCH:
124+
return "loong64"
123125
case elf.EM_PPC64:
124126
if f.elf.ByteOrder == binary.LittleEndian {
125127
return "ppc64le"

src/cmd/objdump/objdump_test.go

+16-2
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,18 @@ var armGnuNeed = []string{ // for both ARM and AMR64
6565
"cmp",
6666
}
6767

68+
var loong64Need = []string{
69+
"JMP main.main(SB)",
70+
"CALL main.Println(SB)",
71+
"RET",
72+
}
73+
74+
var loong64GnuNeed = []string{
75+
"ld.b",
76+
"bl",
77+
"beq",
78+
}
79+
6880
var ppcNeed = []string{
6981
"BR main.main(SB)",
7082
"CALL main.Println(SB)",
@@ -91,8 +103,6 @@ var s390xGnuNeed = []string{
91103

92104
func mustHaveDisasm(t *testing.T) {
93105
switch runtime.GOARCH {
94-
case "loong64":
95-
t.Skipf("skipping on %s", runtime.GOARCH)
96106
case "mips", "mipsle", "mips64", "mips64le":
97107
t.Skipf("skipping on %s, issue 12559", runtime.GOARCH)
98108
case "riscv64":
@@ -157,6 +167,8 @@ func testDisasm(t *testing.T, srcfname string, printCode bool, printGnuAsm bool,
157167
need = append(need, armNeed...)
158168
case "arm64":
159169
need = append(need, arm64Need...)
170+
case "loong64":
171+
need = append(need, loong64Need...)
160172
case "ppc64", "ppc64le":
161173
var pie bool
162174
for _, flag := range flags {
@@ -183,6 +195,8 @@ func testDisasm(t *testing.T, srcfname string, printCode bool, printGnuAsm bool,
183195
need = append(need, i386GnuNeed...)
184196
case "arm", "arm64":
185197
need = append(need, armGnuNeed...)
198+
case "loong64":
199+
need = append(need, loong64GnuNeed...)
186200
case "ppc64", "ppc64le":
187201
need = append(need, ppcGnuNeed...)
188202
case "s390x":

src/cmd/vendor/golang.org/x/arch/loong64/loong64asm/arg.go

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

0 commit comments

Comments
 (0)