Commit 94cf54e8 authored by Shenghou Ma's avatar Shenghou Ma Committed by Russ Cox

cmd/internal/objfile: add ppc64/ppc64le disassembler support

Change-Id: I7d213b4f8e4cda73ea7687fb97dbd22e58163948
Reviewed-on: https://go-review.googlesource.com/9682
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarRuss Cox <rsc@golang.org>
parent ed0a9567
...@@ -16,6 +16,7 @@ import ( ...@@ -16,6 +16,7 @@ import (
"text/tabwriter" "text/tabwriter"
"golang.org/x/arch/arm/armasm" "golang.org/x/arch/arm/armasm"
"golang.org/x/arch/ppc64/ppc64asm"
"golang.org/x/arch/x86/x86asm" "golang.org/x/arch/x86/x86asm"
) )
...@@ -49,6 +50,7 @@ func (f *File) Disasm() (*Disasm, error) { ...@@ -49,6 +50,7 @@ func (f *File) Disasm() (*Disasm, error) {
} }
goarch := f.GOARCH() goarch := f.GOARCH()
println("GOARCH", goarch)
disasm := disasms[goarch] disasm := disasms[goarch]
byteOrder := byteOrders[goarch] byteOrder := byteOrders[goarch]
if disasm == nil || byteOrder == nil { if disasm == nil || byteOrder == nil {
...@@ -170,7 +172,7 @@ func (d *Disasm) Decode(start, end uint64, relocs []Reloc, f func(pc, size uint6 ...@@ -170,7 +172,7 @@ func (d *Disasm) Decode(start, end uint64, relocs []Reloc, f func(pc, size uint6
lookup := d.lookup lookup := d.lookup
for pc := start; pc < end; { for pc := start; pc < end; {
i := pc - d.textStart i := pc - d.textStart
text, size := d.disasm(code[i:], pc, lookup) text, size := d.disasm(code[i:], pc, lookup, d.byteOrder)
file, line, _ := d.pcln.PCToLine(pc) file, line, _ := d.pcln.PCToLine(pc)
text += "\t" text += "\t"
first := true first := true
...@@ -189,13 +191,13 @@ func (d *Disasm) Decode(start, end uint64, relocs []Reloc, f func(pc, size uint6 ...@@ -189,13 +191,13 @@ func (d *Disasm) Decode(start, end uint64, relocs []Reloc, f func(pc, size uint6
} }
type lookupFunc func(addr uint64) (sym string, base uint64) type lookupFunc func(addr uint64) (sym string, base uint64)
type disasmFunc func(code []byte, pc uint64, lookup lookupFunc) (text string, size int) type disasmFunc func(code []byte, pc uint64, lookup lookupFunc, ord binary.ByteOrder) (text string, size int)
func disasm_386(code []byte, pc uint64, lookup lookupFunc) (string, int) { func disasm_386(code []byte, pc uint64, lookup lookupFunc, _ binary.ByteOrder) (string, int) {
return disasm_x86(code, pc, lookup, 32) return disasm_x86(code, pc, lookup, 32)
} }
func disasm_amd64(code []byte, pc uint64, lookup lookupFunc) (string, int) { func disasm_amd64(code []byte, pc uint64, lookup lookupFunc, _ binary.ByteOrder) (string, int) {
return disasm_x86(code, pc, lookup, 64) return disasm_x86(code, pc, lookup, 64)
} }
...@@ -232,7 +234,7 @@ func (r textReader) ReadAt(data []byte, off int64) (n int, err error) { ...@@ -232,7 +234,7 @@ func (r textReader) ReadAt(data []byte, off int64) (n int, err error) {
return return
} }
func disasm_arm(code []byte, pc uint64, lookup lookupFunc) (string, int) { func disasm_arm(code []byte, pc uint64, lookup lookupFunc, _ binary.ByteOrder) (string, int) {
inst, err := armasm.Decode(code, armasm.ModeARM) inst, err := armasm.Decode(code, armasm.ModeARM)
var text string var text string
size := inst.Len size := inst.Len
...@@ -245,10 +247,25 @@ func disasm_arm(code []byte, pc uint64, lookup lookupFunc) (string, int) { ...@@ -245,10 +247,25 @@ func disasm_arm(code []byte, pc uint64, lookup lookupFunc) (string, int) {
return text, size return text, size
} }
func disasm_ppc64(code []byte, pc uint64, lookup lookupFunc, byteOrder binary.ByteOrder) (string, int) {
inst, err := ppc64asm.Decode(code, byteOrder)
var text string
size := inst.Len
if err != nil || size == 0 || inst.Op == 0 {
size = 4
text = "?"
} else {
text = ppc64asm.GoSyntax(inst, pc, lookup)
}
return text, size
}
var disasms = map[string]disasmFunc{ var disasms = map[string]disasmFunc{
"386": disasm_386, "386": disasm_386,
"amd64": disasm_amd64, "amd64": disasm_amd64,
"arm": disasm_arm, "arm": disasm_arm,
"ppc64": disasm_ppc64,
"ppc64le": disasm_ppc64,
} }
var byteOrders = map[string]binary.ByteOrder{ var byteOrders = map[string]binary.ByteOrder{
......
...@@ -9,6 +9,7 @@ package objfile ...@@ -9,6 +9,7 @@ package objfile
import ( import (
"debug/dwarf" "debug/dwarf"
"debug/elf" "debug/elf"
"encoding/binary"
"fmt" "fmt"
"os" "os"
) )
...@@ -99,6 +100,9 @@ func (f *elfFile) goarch() string { ...@@ -99,6 +100,9 @@ func (f *elfFile) goarch() string {
case elf.EM_ARM: case elf.EM_ARM:
return "arm" return "arm"
case elf.EM_PPC64: case elf.EM_PPC64:
if f.elf.ByteOrder == binary.LittleEndian {
return "ppc64le"
}
return "ppc64" return "ppc64"
case elf.EM_S390: case elf.EM_S390:
return "s390x" return "s390x"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment