diff options
| author | Rob Pike <r@golang.org> | 2015-03-05 10:39:23 -0800 |
|---|---|---|
| committer | Rob Pike <r@golang.org> | 2015-03-05 19:18:46 +0000 |
| commit | 24a43e6a7542c2aefd1e2f16f0daae8100e4bdce (patch) | |
| tree | 7102dfdd47ef77116daca5f9a6ed106a0f681d31 /src/cmd/internal/obj | |
| parent | d5b5d6702ad7d64f189c915225b945a2aa471a38 (diff) | |
| download | go-24a43e6a7542c2aefd1e2f16f0daae8100e4bdce.tar.xz | |
cmd/internal/obj: delete all Pconv, replace with Prog.String
Remove the per-achitecture formatter for Prog and replace it with
a global String method. Clean up and regularize the output. Update
tests affected by the format; some tests are made correct now when
they were broken before (and known to be).
Also, related: Change the encoding of the (R1+R2) syntax on ppc64
to be equivalent to (R1)(R2*1), which means it needs no special
handling.
Delete the now unused STRINGSZ constant.
Change-Id: I7f6654d11f80065f3914a3f19353f2f12edfe310
Reviewed-on: https://go-review.googlesource.com/6931
Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/cmd/internal/obj')
| -rw-r--r-- | src/cmd/internal/obj/arm/5.out.go | 3 | ||||
| -rw-r--r-- | src/cmd/internal/obj/arm/list5.go | 61 | ||||
| -rw-r--r-- | src/cmd/internal/obj/arm/obj5.go | 1 | ||||
| -rw-r--r-- | src/cmd/internal/obj/link.go | 12 | ||||
| -rw-r--r-- | src/cmd/internal/obj/ppc64/asm9.go | 41 | ||||
| -rw-r--r-- | src/cmd/internal/obj/ppc64/list9.go | 79 | ||||
| -rw-r--r-- | src/cmd/internal/obj/ppc64/obj9.go | 2 | ||||
| -rw-r--r-- | src/cmd/internal/obj/util.go | 82 | ||||
| -rw-r--r-- | src/cmd/internal/obj/x86/list6.go | 48 | ||||
| -rw-r--r-- | src/cmd/internal/obj/x86/obj6.go | 3 |
10 files changed, 102 insertions, 230 deletions
diff --git a/src/cmd/internal/obj/arm/5.out.go b/src/cmd/internal/obj/arm/5.out.go index 91e96874f0..424dd3d58e 100644 --- a/src/cmd/internal/obj/arm/5.out.go +++ b/src/cmd/internal/obj/arm/5.out.go @@ -32,9 +32,6 @@ package arm import "cmd/internal/obj" -// TODO(ality): remove this workaround. -// It's here because Pconv in liblink/list?.c references %L. - const ( NSNAME = 8 NSYM = 50 diff --git a/src/cmd/internal/obj/arm/list5.go b/src/cmd/internal/obj/arm/list5.go index 321c1f8583..bb2ac20e53 100644 --- a/src/cmd/internal/obj/arm/list5.go +++ b/src/cmd/internal/obj/arm/list5.go @@ -35,67 +35,6 @@ import ( "fmt" ) -const ( - STRINGSZ = 1000 -) - -var extra = []string{ - ".EQ", - ".NE", - ".CS", - ".CC", - ".MI", - ".PL", - ".VS", - ".VC", - ".HI", - ".LS", - ".GE", - ".LT", - ".GT", - ".LE", - "", - ".NV", -} - -var bigP *obj.Prog - -func Pconv(p *obj.Prog) string { - a := int(p.As) - s := int(p.Scond) - sc := extra[(s&C_SCOND)^C_SCOND_XOR] - if s&C_SBIT != 0 { - sc += ".S" - } - if s&C_PBIT != 0 { - sc += ".P" - } - if s&C_WBIT != 0 { - sc += ".W" - } - if s&C_UBIT != 0 { /* ambiguous with FBIT */ - sc += ".U" - } - var str string - if a == obj.ADATA { - str = fmt.Sprintf("%.5d (%v)\t%v\t%v/%d,%v", - p.Pc, p.Line(), obj.Aconv(a), obj.Dconv(p, &p.From), p.From3.Offset, obj.Dconv(p, &p.To)) - } else if p.As == obj.ATEXT { - str = fmt.Sprintf("%.5d (%v)\t%v\t%v,%d,%v", - p.Pc, p.Line(), obj.Aconv(a), obj.Dconv(p, &p.From), p.From3.Offset, obj.Dconv(p, &p.To)) - } else if p.Reg == 0 { - str = fmt.Sprintf("%.5d (%v)\t%v%s\t%v,%v", - p.Pc, p.Line(), obj.Aconv(a), sc, obj.Dconv(p, &p.From), obj.Dconv(p, &p.To)) - } else { - str = fmt.Sprintf("%.5d (%v)\t%v%s\t%v,%v,%v", - p.Pc, p.Line(), obj.Aconv(a), sc, obj.Dconv(p, &p.From), Rconv(int(p.Reg)), obj.Dconv(p, &p.To)) - } - - var fp string - fp += str - return fp -} - func init() { obj.RegisterRegister(obj.RBaseARM, MAXREG, Rconv) obj.RegisterOpcode(obj.ABaseARM, Anames) diff --git a/src/cmd/internal/obj/arm/obj5.go b/src/cmd/internal/obj/arm/obj5.go index ca464b6de6..7c28add64a 100644 --- a/src/cmd/internal/obj/arm/obj5.go +++ b/src/cmd/internal/obj/arm/obj5.go @@ -1045,7 +1045,6 @@ var unaryDst = map[int]bool{ var Linkarm = obj.LinkArch{ ByteOrder: binary.LittleEndian, - Pconv: Pconv, Name: "arm", Thechar: '5', Preprocess: preprocess, diff --git a/src/cmd/internal/obj/link.go b/src/cmd/internal/obj/link.go index a41da83c86..bcec3c2e63 100644 --- a/src/cmd/internal/obj/link.go +++ b/src/cmd/internal/obj/link.go @@ -234,7 +234,6 @@ type Plist struct { } type LinkArch struct { - Pconv func(*Prog) string ByteOrder binary.ByteOrder Name string Thechar int @@ -382,7 +381,16 @@ type Pciter struct { // offset = bit mask of registers in list; R0 is low bit. // // reg, reg -// TYPE_REGREG2, to be removed. +// Register pair for ARM. +// TYPE_REGREG2 +// +// (reg+reg) +// Register pair for PPC64. +// Encoding: +// type = TYPE_MEM +// reg = first register +// index = second register +// scale = 1 // const ( diff --git a/src/cmd/internal/obj/ppc64/asm9.go b/src/cmd/internal/obj/ppc64/asm9.go index 77ffec8dc3..9e227c427d 100644 --- a/src/cmd/internal/obj/ppc64/asm9.go +++ b/src/cmd/internal/obj/ppc64/asm9.go @@ -604,7 +604,7 @@ func aclass(ctxt *obj.Link, a *obj.Addr) int { } return C_LAUTO - case obj.TYPE_NONE: + case obj.NAME_NONE: ctxt.Instoffset = a.Offset if ctxt.Instoffset == 0 { return C_ZOREG @@ -1579,11 +1579,11 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) { r = int(o.param) } v := regoff(ctxt, &p.To) - if p.To.Type == obj.TYPE_MEM && p.Reg != 0 { + if p.To.Type == obj.TYPE_MEM && p.To.Index != 0 { if v != 0 { ctxt.Diag("illegal indexed instruction\n%v", p) } - o1 = AOP_RRR(uint32(opstorex(ctxt, int(p.As))), uint32(p.From.Reg), uint32(p.Reg), uint32(r)) + o1 = AOP_RRR(uint32(opstorex(ctxt, int(p.As))), uint32(p.From.Reg), uint32(p.To.Index), uint32(r)) } else { if int32(int16(v)) != v { log.Fatalf("mishandled instruction %v", p) @@ -1598,11 +1598,11 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) { r = int(o.param) } v := regoff(ctxt, &p.From) - if p.From.Type == obj.TYPE_MEM && p.Reg != 0 { + if p.From.Type == obj.TYPE_MEM && p.From.Index != 0 { if v != 0 { ctxt.Diag("illegal indexed instruction\n%v", p) } - o1 = AOP_RRR(uint32(oploadx(ctxt, int(p.As))), uint32(p.To.Reg), uint32(p.Reg), uint32(r)) + o1 = AOP_RRR(uint32(oploadx(ctxt, int(p.As))), uint32(p.To.Reg), uint32(p.From.Index), uint32(r)) } else { if int32(int16(v)) != v { log.Fatalf("mishandled instruction %v", p) @@ -1617,11 +1617,11 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) { r = int(o.param) } v := regoff(ctxt, &p.From) - if p.From.Type == obj.TYPE_MEM && p.Reg != 0 { + if p.From.Type == obj.TYPE_MEM && p.From.Index != 0 { if v != 0 { ctxt.Diag("illegal indexed instruction\n%v", p) } - o1 = AOP_RRR(uint32(oploadx(ctxt, int(p.As))), uint32(p.To.Reg), uint32(p.Reg), uint32(r)) + o1 = AOP_RRR(uint32(oploadx(ctxt, int(p.As))), uint32(p.To.Reg), uint32(p.From.Index), uint32(r)) } else { o1 = AOP_IRR(uint32(opload(ctxt, int(p.As))), uint32(p.To.Reg), uint32(r), uint32(v)) } @@ -1764,16 +1764,12 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) { } else { v = 20 /* unconditional */ } - r := int(p.Reg) - if r == 0 { - r = 0 - } o1 = AOP_RRR(OP_MTSPR, uint32(p.To.Reg), 0, 0) | (REG_LR&0x1f)<<16 | ((REG_LR>>5)&0x1f)<<11 o2 = OPVCC(19, 16, 0, 0) if p.As == ABL || p.As == ABCL { o2 |= 1 } - o2 = OP_BCR(o2, uint32(v), uint32(r)) + o2 = OP_BCR(o2, uint32(v), uint32(p.To.Index)) case 18: /* br/bl (lr/ctr); bc/bcl bo,bi,(lr/ctr) */ var v int32 @@ -2085,28 +2081,13 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) { o1 = AOP_RRR(uint32(opirr(ctxt, int(p.As))), uint32(p.To.Reg), uint32(p.From.Reg), 0) | (uint32(regoff(ctxt, &p.From3))&0x7F)<<11 case 43: /* unary indexed source: dcbf (b); dcbf (a+b) */ - r := int(p.Reg) - - if r == 0 { - r = 0 - } - o1 = AOP_RRR(uint32(oprrr(ctxt, int(p.As))), 0, uint32(r), uint32(p.From.Reg)) + o1 = AOP_RRR(uint32(oprrr(ctxt, int(p.As))), 0, uint32(p.From.Index), uint32(p.From.Reg)) case 44: /* indexed store */ - r := int(p.Reg) - - if r == 0 { - r = 0 - } - o1 = AOP_RRR(uint32(opstorex(ctxt, int(p.As))), uint32(p.From.Reg), uint32(r), uint32(p.To.Reg)) + o1 = AOP_RRR(uint32(opstorex(ctxt, int(p.As))), uint32(p.From.Reg), uint32(p.To.Index), uint32(p.To.Reg)) case 45: /* indexed load */ - r := int(p.Reg) - - if r == 0 { - r = 0 - } - o1 = AOP_RRR(uint32(oploadx(ctxt, int(p.As))), uint32(p.To.Reg), uint32(r), uint32(p.From.Reg)) + o1 = AOP_RRR(uint32(oploadx(ctxt, int(p.As))), uint32(p.To.Reg), uint32(p.From.Index), uint32(p.From.Reg)) case 46: /* plain op */ o1 = uint32(oprrr(ctxt, int(p.As))) diff --git a/src/cmd/internal/obj/ppc64/list9.go b/src/cmd/internal/obj/ppc64/list9.go index 048928442a..4cdcfbcd27 100644 --- a/src/cmd/internal/obj/ppc64/list9.go +++ b/src/cmd/internal/obj/ppc64/list9.go @@ -34,85 +34,6 @@ import ( "fmt" ) -const ( - STRINGSZ = 1000 -) - -// -// Format conversions -// %A int Opcodes (instruction mnemonics) -// -// %D Addr* Addresses (instruction operands) -// -// %P Prog* Instructions -// -// %R int Registers -// -// %$ char* String constant addresses (for internal use only) -// %^ int C_* classes (for liblink internal use) - -var bigP *obj.Prog - -func Pconv(p *obj.Prog) string { - a := int(p.As) - - str := "" - if a == obj.ADATA { - str = fmt.Sprintf("%.5d (%v)\t%v\t%v/%d,%v", - p.Pc, p.Line(), obj.Aconv(a), obj.Dconv(p, &p.From), p.From3.Offset, obj.Dconv(p, &p.To)) - } else if a == obj.ATEXT || a == obj.AGLOBL { - if p.From3.Offset != 0 { - str = fmt.Sprintf("%.5d (%v)\t%v\t%v,%d,%v", - p.Pc, p.Line(), obj.Aconv(a), obj.Dconv(p, &p.From), p.From3.Offset, obj.Dconv(p, &p.To)) - } else { - str = fmt.Sprintf("%.5d (%v)\t%v\t%v,%v", - p.Pc, p.Line(), obj.Aconv(a), obj.Dconv(p, &p.From), obj.Dconv(p, &p.To)) - } - } else { - if p.Mark&NOSCHED != 0 { - str += fmt.Sprintf("*") - } - if p.Reg == 0 && p.From3.Type == obj.TYPE_NONE { - str += fmt.Sprintf("%.5d (%v)\t%v\t%v,%v", - p.Pc, p.Line(), obj.Aconv(a), obj.Dconv(p, &p.From), obj.Dconv(p, &p.To)) - } else if a != obj.ATEXT && p.From.Type == obj.TYPE_MEM { - off := "" - if p.From.Offset != 0 { - off = fmt.Sprintf("%d", p.From.Offset) - } - str += fmt.Sprintf("%.5d (%v)\t%v\t%s(%v+%v),%v", - p.Pc, p.Line(), obj.Aconv(a), off, Rconv(int(p.From.Reg)), Rconv(int(p.Reg)), obj.Dconv(p, &p.To)) - } else if p.To.Type == obj.TYPE_MEM { - off := "" - if p.From.Offset != 0 { - off = fmt.Sprintf("%d", p.From.Offset) - } - str += fmt.Sprintf("%.5d (%v)\t%v\t%v,%s(%v+%v)", - p.Pc, p.Line(), obj.Aconv(a), obj.Dconv(p, &p.From), off, Rconv(int(p.To.Reg)), Rconv(int(p.Reg))) - } else { - str += fmt.Sprintf("%.5d (%v)\t%v\t%v", - p.Pc, p.Line(), obj.Aconv(a), obj.Dconv(p, &p.From)) - if p.Reg != 0 { - str += fmt.Sprintf(",%v", Rconv(int(p.Reg))) - } - if p.From3.Type != obj.TYPE_NONE { - str += fmt.Sprintf(",%v", obj.Dconv(p, &p.From3)) - } - str += fmt.Sprintf(",%v", obj.Dconv(p, &p.To)) - } - - if p.Spadj != 0 { - var fp string - fp += fmt.Sprintf("%s # spadj=%d", str, p.Spadj) - return fp - } - } - - var fp string - fp += str - return fp -} - func init() { obj.RegisterRegister(obj.RBasePPC64, REG_DCR0+1024, Rconv) obj.RegisterOpcode(obj.ABasePPC64, Anames) diff --git a/src/cmd/internal/obj/ppc64/obj9.go b/src/cmd/internal/obj/ppc64/obj9.go index 75eca37057..027fffa57a 100644 --- a/src/cmd/internal/obj/ppc64/obj9.go +++ b/src/cmd/internal/obj/ppc64/obj9.go @@ -949,7 +949,6 @@ loop: var Linkppc64 = obj.LinkArch{ ByteOrder: binary.BigEndian, - Pconv: Pconv, Name: "ppc64", Thechar: '9', Preprocess: preprocess, @@ -963,7 +962,6 @@ var Linkppc64 = obj.LinkArch{ var Linkppc64le = obj.LinkArch{ ByteOrder: binary.LittleEndian, - Pconv: Pconv, Name: "ppc64le", Thechar: '9', Preprocess: preprocess, diff --git a/src/cmd/internal/obj/util.go b/src/cmd/internal/obj/util.go index d626793475..b2c7df7d56 100644 --- a/src/cmd/internal/obj/util.go +++ b/src/cmd/internal/obj/util.go @@ -6,6 +6,7 @@ package obj import ( "bufio" + "bytes" "fmt" "io" "log" @@ -248,11 +249,90 @@ func (p *Prog) Line() string { return Linklinefmt(p.Ctxt, int(p.Lineno), false, false) } +var armCondCode = []string{ + ".EQ", + ".NE", + ".CS", + ".CC", + ".MI", + ".PL", + ".VS", + ".VC", + ".HI", + ".LS", + ".GE", + ".LT", + ".GT", + ".LE", + "", + ".NV", +} + +/* ARM scond byte */ +const ( + C_SCOND = (1 << 4) - 1 + C_SBIT = 1 << 4 + C_PBIT = 1 << 5 + C_WBIT = 1 << 6 + C_FBIT = 1 << 7 + C_UBIT = 1 << 7 + C_SCOND_XOR = 14 +) + +// CConv formats ARM condition codes. +func CConv(s uint8) string { + if s == 0 { + return "" + } + sc := armCondCode[(s&C_SCOND)^C_SCOND_XOR] + if s&C_SBIT != 0 { + sc += ".S" + } + if s&C_PBIT != 0 { + sc += ".P" + } + if s&C_WBIT != 0 { + sc += ".W" + } + if s&C_UBIT != 0 { /* ambiguous with FBIT */ + sc += ".U" + } + return sc +} + func (p *Prog) String() string { if p.Ctxt == nil { return "<Prog without ctxt>" } - return p.Ctxt.Arch.Pconv(p) + + sc := CConv(p.Scond) + + var buf bytes.Buffer + + fmt.Fprintf(&buf, "%.5d (%v)\t%v%s", p.Pc, p.Line(), Aconv(int(p.As)), sc) + sep := "\t" + if p.From.Type != TYPE_NONE { + fmt.Fprintf(&buf, "%s%v", sep, Dconv(p, &p.From)) + sep = ", " + } + if p.Reg != REG_NONE { + // Should not happen but might as well show it if it does. + fmt.Fprintf(&buf, "%s%v", sep, Rconv(int(p.Reg))) + sep = ", " + } + if p.From3.Type != TYPE_NONE { + if p.From3.Type == TYPE_CONST && (p.As == ADATA || p.As == ATEXT || p.As == AGLOBL) { + // Special case - omit $. + fmt.Fprintf(&buf, "%s%d", sep, p.From3.Offset) + } else { + fmt.Fprintf(&buf, "%s%v", sep, Dconv(p, &p.From3)) + } + sep = ", " + } + if p.To.Type != TYPE_NONE { + fmt.Fprintf(&buf, "%s%v", sep, Dconv(p, &p.To)) + } + return buf.String() } func (ctxt *Link) NewProg() *Prog { diff --git a/src/cmd/internal/obj/x86/list6.go b/src/cmd/internal/obj/x86/list6.go index 89d6c4a1c3..fc79b902a2 100644 --- a/src/cmd/internal/obj/x86/list6.go +++ b/src/cmd/internal/obj/x86/list6.go @@ -31,58 +31,10 @@ package x86 import ( - "bytes" "cmd/internal/obj" "fmt" ) -// -// Format conversions -// %A int Opcodes (instruction mnemonics) -// -// %D Addr* Addresses (instruction operands) -// -// %P Prog* Instructions -// -// %R int Registers -// -// %$ char* String constant addresses (for internal use only) - -const ( - STRINGSZ = 1000 -) - -var bigP *obj.Prog - -func Pconv(p *obj.Prog) string { - var buf bytes.Buffer - - fmt.Fprintf(&buf, "%.5d (%v)\t%v", p.Pc, p.Line(), obj.Aconv(int(p.As))) - sep := "\t" - if p.From.Type != obj.TYPE_NONE { - fmt.Fprintf(&buf, "%s%v", sep, obj.Dconv(p, &p.From)) - sep = ", " - } - if p.Reg != obj.REG_NONE { - // Should not happen but might as well show it if it does. - fmt.Fprintf(&buf, "%s%v", sep, obj.Rconv(int(p.Reg))) - sep = ", " - } - if p.From3.Type != obj.TYPE_NONE { - if p.From3.Type == obj.TYPE_CONST && (p.As == obj.ADATA || p.As == obj.ATEXT || p.As == obj.AGLOBL) { - // Special case - omit $. - fmt.Fprintf(&buf, "%s%d", sep, p.From3.Offset) - } else { - fmt.Fprintf(&buf, "%s%v", sep, obj.Dconv(p, &p.From3)) - } - sep = ", " - } - if p.To.Type != obj.TYPE_NONE { - fmt.Fprintf(&buf, "%s%v", sep, obj.Dconv(p, &p.To)) - } - return buf.String() -} - var Register = []string{ "AL", /* [D_AL] */ "CL", diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go index e5bc3584fd..57a201bd9a 100644 --- a/src/cmd/internal/obj/x86/obj6.go +++ b/src/cmd/internal/obj/x86/obj6.go @@ -1187,7 +1187,6 @@ var unaryDst = map[int]bool{ var Linkamd64 = obj.LinkArch{ ByteOrder: binary.LittleEndian, - Pconv: Pconv, Name: "amd64", Thechar: '6', Preprocess: preprocess, @@ -1202,7 +1201,6 @@ var Linkamd64 = obj.LinkArch{ var Linkamd64p32 = obj.LinkArch{ ByteOrder: binary.LittleEndian, - Pconv: Pconv, Name: "amd64p32", Thechar: '6', Preprocess: preprocess, @@ -1217,7 +1215,6 @@ var Linkamd64p32 = obj.LinkArch{ var Link386 = obj.LinkArch{ ByteOrder: binary.LittleEndian, - Pconv: Pconv, Name: "386", Thechar: '8', Preprocess: preprocess, |
