Commit cf2b32e7 authored by Josh Bleecher Snyder's avatar Josh Bleecher Snyder

cmd/internal/obj: eliminate Prog.Mode

Follow-up to CL 38446.

Passes toolstash-check -all.

Change-Id: I04cadc058cbaa5f396136502c574e5a395a33276
Reviewed-on: https://go-review.googlesource.com/38669
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 4f122e82
...@@ -832,7 +832,6 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32) *obj.Prog { ...@@ -832,7 +832,6 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32) *obj.Prog {
pcdata := obj.Appendp(ctxt, spfix) pcdata := obj.Appendp(ctxt, spfix)
pcdata.Pos = ctxt.Cursym.Text.Pos pcdata.Pos = ctxt.Cursym.Text.Pos
pcdata.Mode = ctxt.Cursym.Text.Mode
pcdata.As = obj.APCDATA pcdata.As = obj.APCDATA
pcdata.From.Type = obj.TYPE_CONST pcdata.From.Type = obj.TYPE_CONST
pcdata.From.Offset = obj.PCDATA_StackMapIndex pcdata.From.Offset = obj.PCDATA_StackMapIndex
......
...@@ -169,7 +169,6 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32) *obj.Prog { ...@@ -169,7 +169,6 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32) *obj.Prog {
pcdata := obj.Appendp(ctxt, spfix) pcdata := obj.Appendp(ctxt, spfix)
pcdata.Pos = ctxt.Cursym.Text.Pos pcdata.Pos = ctxt.Cursym.Text.Pos
pcdata.Mode = ctxt.Cursym.Text.Mode
pcdata.As = obj.APCDATA pcdata.As = obj.APCDATA
pcdata.From.Type = obj.TYPE_CONST pcdata.From.Type = obj.TYPE_CONST
pcdata.From.Offset = obj.PCDATA_StackMapIndex pcdata.From.Offset = obj.PCDATA_StackMapIndex
......
...@@ -87,6 +87,5 @@ func Appendp(ctxt *Link, q *Prog) *Prog { ...@@ -87,6 +87,5 @@ func Appendp(ctxt *Link, q *Prog) *Prog {
p.Link = q.Link p.Link = q.Link
q.Link = p q.Link = p
p.Pos = q.Pos p.Pos = q.Pos
p.Mode = q.Mode
return p return p
} }
...@@ -250,7 +250,6 @@ type Prog struct { ...@@ -250,7 +250,6 @@ type Prog struct {
Ft uint8 // for x86 back end: type index of Prog.From Ft uint8 // for x86 back end: type index of Prog.From
Tt uint8 // for x86 back end: type index of Prog.To Tt uint8 // for x86 back end: type index of Prog.To
Isize uint8 // for x86 back end: size of the instruction in bytes Isize uint8 // for x86 back end: size of the instruction in bytes
Mode int8 // for x86 back end: 32- or 64-bit mode
} }
// From3Type returns From3.Type, or TYPE_NONE when From3 is nil. // From3Type returns From3.Type, or TYPE_NONE when From3 is nil.
......
...@@ -676,7 +676,6 @@ func stacksplitPost(ctxt *obj.Link, p *obj.Prog, pPre *obj.Prog, pPreempt *obj.P ...@@ -676,7 +676,6 @@ func stacksplitPost(ctxt *obj.Link, p *obj.Prog, pPre *obj.Prog, pPreempt *obj.P
pcdata := obj.Appendp(ctxt, spfix) pcdata := obj.Appendp(ctxt, spfix)
pcdata.Pos = ctxt.Cursym.Text.Pos pcdata.Pos = ctxt.Cursym.Text.Pos
pcdata.Mode = ctxt.Cursym.Text.Mode
pcdata.As = obj.APCDATA pcdata.As = obj.APCDATA
pcdata.From.Type = obj.TYPE_CONST pcdata.From.Type = obj.TYPE_CONST
pcdata.From.Offset = obj.PCDATA_StackMapIndex pcdata.From.Offset = obj.PCDATA_StackMapIndex
......
This diff is collapsed.
...@@ -49,7 +49,7 @@ func CanUse1InsnTLS(ctxt *obj.Link) bool { ...@@ -49,7 +49,7 @@ func CanUse1InsnTLS(ctxt *obj.Link) bool {
return true return true
} }
if ctxt.Arch.RegSize == 4 { if ctxt.Arch.Family == sys.I386 {
switch ctxt.Headtype { switch ctxt.Headtype {
case obj.Hlinux, case obj.Hlinux,
obj.Hnacl, obj.Hnacl,
...@@ -73,9 +73,6 @@ func CanUse1InsnTLS(ctxt *obj.Link) bool { ...@@ -73,9 +73,6 @@ func CanUse1InsnTLS(ctxt *obj.Link) bool {
} }
func progedit(ctxt *obj.Link, p *obj.Prog) { func progedit(ctxt *obj.Link, p *obj.Prog) {
// TODO(josharian): eliminate Prog.Mode
p.Mode = int8(ctxt.Arch.RegSize * 8)
// Thread-local storage references use the TLS pseudo-register. // Thread-local storage references use the TLS pseudo-register.
// As a register, TLS refers to the thread-local storage base, and it // As a register, TLS refers to the thread-local storage base, and it
// can only be loaded into another register: // can only be loaded into another register:
...@@ -166,7 +163,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) { ...@@ -166,7 +163,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) {
} }
// TODO: Remove. // TODO: Remove.
if (ctxt.Headtype == obj.Hwindows || ctxt.Headtype == obj.Hwindowsgui) && p.Mode == 64 || ctxt.Headtype == obj.Hplan9 { if (ctxt.Headtype == obj.Hwindows || ctxt.Headtype == obj.Hwindowsgui) && ctxt.Arch.Family == sys.AMD64 || ctxt.Headtype == obj.Hplan9 {
if p.From.Scale == 1 && p.From.Index == REG_TLS { if p.From.Scale == 1 && p.From.Index == REG_TLS {
p.From.Scale = 2 p.From.Scale = 2
} }
...@@ -204,7 +201,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) { ...@@ -204,7 +201,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) {
} }
} }
if ctxt.Headtype == obj.Hnacl && p.Mode == 64 { if ctxt.Headtype == obj.Hnacl && ctxt.Arch.Family == sys.AMD64 {
if p.From3 != nil { if p.From3 != nil {
nacladdr(ctxt, p, p.From3) nacladdr(ctxt, p, p.From3)
} }
...@@ -300,7 +297,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) { ...@@ -300,7 +297,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) {
rewriteToUseGot(ctxt, p) rewriteToUseGot(ctxt, p)
} }
if ctxt.Flag_shared && p.Mode == 32 { if ctxt.Flag_shared && ctxt.Arch.Family == sys.I386 {
rewriteToPcrel(ctxt, p) rewriteToPcrel(ctxt, p)
} }
} }
...@@ -309,7 +306,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) { ...@@ -309,7 +306,7 @@ func progedit(ctxt *obj.Link, p *obj.Prog) {
func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog) { func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog) {
var add, lea, mov obj.As var add, lea, mov obj.As
var reg int16 var reg int16
if p.Mode == 64 { if ctxt.Arch.Family == sys.AMD64 {
add = AADDQ add = AADDQ
lea = ALEAQ lea = ALEAQ
mov = AMOVQ mov = AMOVQ
...@@ -377,7 +374,7 @@ func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog) { ...@@ -377,7 +374,7 @@ func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog) {
pAs := p.As pAs := p.As
var dest obj.Addr var dest obj.Addr
if p.To.Type != obj.TYPE_REG || pAs != mov { if p.To.Type != obj.TYPE_REG || pAs != mov {
if p.Mode == 64 { if ctxt.Arch.Family == sys.AMD64 {
ctxt.Diag("do not know how to handle LEA-type insn to non-register in %v with -dynlink", p) ctxt.Diag("do not know how to handle LEA-type insn to non-register in %v with -dynlink", p)
} }
cmplxdest = true cmplxdest = true
...@@ -430,7 +427,7 @@ func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog) { ...@@ -430,7 +427,7 @@ func rewriteToUseGot(ctxt *obj.Link, p *obj.Prog) {
// to a PLT, so make sure the GOT pointer is loaded into BX. // to a PLT, so make sure the GOT pointer is loaded into BX.
// RegTo2 is set on the replacement call insn to stop it being // RegTo2 is set on the replacement call insn to stop it being
// processed when it is in turn passed to progedit. // processed when it is in turn passed to progedit.
if p.Mode == 64 || (p.To.Sym != nil && p.To.Sym.Local()) || p.RegTo2 != 0 { if ctxt.Arch.Family == sys.AMD64 || (p.To.Sym != nil && p.To.Sym.Local()) || p.RegTo2 != 0 {
return return
} }
p1 := obj.Appendp(ctxt, p) p1 := obj.Appendp(ctxt, p)
...@@ -624,7 +621,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { ...@@ -624,7 +621,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
} }
var bpsize int var bpsize int
if p.Mode == 64 && ctxt.Framepointer_enabled && if ctxt.Arch.Family == sys.AMD64 && ctxt.Framepointer_enabled &&
p.From3.Offset&obj.NOFRAME == 0 && // (1) below p.From3.Offset&obj.NOFRAME == 0 && // (1) below
!(autoffset == 0 && p.From3.Offset&obj.NOSPLIT != 0) && // (2) below !(autoffset == 0 && p.From3.Offset&obj.NOSPLIT != 0) && // (2) below
!(autoffset == 0 && !hasCall) { // (3) below !(autoffset == 0 && !hasCall) { // (3) below
...@@ -648,12 +645,12 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { ...@@ -648,12 +645,12 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
cursym.Locals = int32(p.To.Offset) cursym.Locals = int32(p.To.Offset)
// TODO(rsc): Remove. // TODO(rsc): Remove.
if p.Mode == 32 && cursym.Locals < 0 { if ctxt.Arch.Family == sys.I386 && cursym.Locals < 0 {
cursym.Locals = 0 cursym.Locals = 0
} }
// TODO(rsc): Remove 'p.Mode == 64 &&'. // TODO(rsc): Remove 'ctxt.Arch.Family == sys.AMD64 &&'.
if p.Mode == 64 && autoffset < obj.StackSmall && p.From3Offset()&obj.NOSPLIT == 0 { if ctxt.Arch.Family == sys.AMD64 && autoffset < obj.StackSmall && p.From3Offset()&obj.NOSPLIT == 0 {
leaf := true leaf := true
LeafSearch: LeafSearch:
for q := p; q != nil; q = q.Link { for q := p; q != nil; q = q.Link {
...@@ -757,14 +754,14 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { ...@@ -757,14 +754,14 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
p.From.Offset = 4 * int64(ctxt.Arch.PtrSize) // g_panic p.From.Offset = 4 * int64(ctxt.Arch.PtrSize) // g_panic
p.To.Type = obj.TYPE_REG p.To.Type = obj.TYPE_REG
p.To.Reg = REG_BX p.To.Reg = REG_BX
if ctxt.Headtype == obj.Hnacl && p.Mode == 64 { if ctxt.Headtype == obj.Hnacl && ctxt.Arch.Family == sys.AMD64 {
p.As = AMOVL p.As = AMOVL
p.From.Type = obj.TYPE_MEM p.From.Type = obj.TYPE_MEM
p.From.Reg = REG_R15 p.From.Reg = REG_R15
p.From.Scale = 1 p.From.Scale = 1
p.From.Index = REG_CX p.From.Index = REG_CX
} }
if p.Mode == 32 { if ctxt.Arch.Family == sys.I386 {
p.As = AMOVL p.As = AMOVL
} }
...@@ -775,7 +772,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { ...@@ -775,7 +772,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
p.From.Reg = REG_BX p.From.Reg = REG_BX
p.To.Type = obj.TYPE_REG p.To.Type = obj.TYPE_REG
p.To.Reg = REG_BX p.To.Reg = REG_BX
if ctxt.Headtype == obj.Hnacl || p.Mode == 32 { if ctxt.Headtype == obj.Hnacl || ctxt.Arch.Family == sys.I386 {
p.As = ATESTL p.As = ATESTL
} }
...@@ -802,7 +799,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { ...@@ -802,7 +799,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
p.From.Offset = int64(autoffset) + int64(ctxt.Arch.RegSize) p.From.Offset = int64(autoffset) + int64(ctxt.Arch.RegSize)
p.To.Type = obj.TYPE_REG p.To.Type = obj.TYPE_REG
p.To.Reg = REG_DI p.To.Reg = REG_DI
if ctxt.Headtype == obj.Hnacl || p.Mode == 32 { if ctxt.Headtype == obj.Hnacl || ctxt.Arch.Family == sys.I386 {
p.As = ALEAL p.As = ALEAL
} }
...@@ -817,14 +814,14 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { ...@@ -817,14 +814,14 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
p.From.Offset = 0 // Panic.argp p.From.Offset = 0 // Panic.argp
p.To.Type = obj.TYPE_REG p.To.Type = obj.TYPE_REG
p.To.Reg = REG_DI p.To.Reg = REG_DI
if ctxt.Headtype == obj.Hnacl && p.Mode == 64 { if ctxt.Headtype == obj.Hnacl && ctxt.Arch.Family == sys.AMD64 {
p.As = ACMPL p.As = ACMPL
p.From.Type = obj.TYPE_MEM p.From.Type = obj.TYPE_MEM
p.From.Reg = REG_R15 p.From.Reg = REG_R15
p.From.Scale = 1 p.From.Scale = 1
p.From.Index = REG_BX p.From.Index = REG_BX
} }
if p.Mode == 32 { if ctxt.Arch.Family == sys.I386 {
p.As = ACMPL p.As = ACMPL
} }
...@@ -842,14 +839,14 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { ...@@ -842,14 +839,14 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
p.To.Type = obj.TYPE_MEM p.To.Type = obj.TYPE_MEM
p.To.Reg = REG_BX p.To.Reg = REG_BX
p.To.Offset = 0 // Panic.argp p.To.Offset = 0 // Panic.argp
if ctxt.Headtype == obj.Hnacl && p.Mode == 64 { if ctxt.Headtype == obj.Hnacl && ctxt.Arch.Family == sys.AMD64 {
p.As = AMOVL p.As = AMOVL
p.To.Type = obj.TYPE_MEM p.To.Type = obj.TYPE_MEM
p.To.Reg = REG_R15 p.To.Reg = REG_R15
p.To.Scale = 1 p.To.Scale = 1
p.To.Index = REG_BX p.To.Index = REG_BX
} }
if p.Mode == 32 { if ctxt.Arch.Family == sys.I386 {
p.As = AMOVL p.As = AMOVL
} }
...@@ -864,7 +861,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { ...@@ -864,7 +861,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) {
} }
for ; p != nil; p = p.Link { for ; p != nil; p = p.Link {
pcsize := int(p.Mode) / 8 pcsize := ctxt.Arch.RegSize
switch p.From.Name { switch p.From.Name {
case obj.NAME_AUTO: case obj.NAME_AUTO:
p.From.Offset += int64(deltasp) - int64(bpsize) p.From.Offset += int64(deltasp) - int64(bpsize)
...@@ -974,7 +971,7 @@ func isZeroArgRuntimeCall(s *obj.LSym) bool { ...@@ -974,7 +971,7 @@ func isZeroArgRuntimeCall(s *obj.LSym) bool {
} }
func indir_cx(ctxt *obj.Link, p *obj.Prog, a *obj.Addr) { func indir_cx(ctxt *obj.Link, p *obj.Prog, a *obj.Addr) {
if ctxt.Headtype == obj.Hnacl && p.Mode == 64 { if ctxt.Headtype == obj.Hnacl && ctxt.Arch.Family == sys.AMD64 {
a.Type = obj.TYPE_MEM a.Type = obj.TYPE_MEM
a.Reg = REG_R15 a.Reg = REG_R15
a.Index = REG_CX a.Index = REG_CX
...@@ -1025,7 +1022,7 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, framesize int32, ...@@ -1025,7 +1022,7 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, framesize int32,
mov := AMOVQ mov := AMOVQ
sub := ASUBQ sub := ASUBQ
if ctxt.Headtype == obj.Hnacl || p.Mode == 32 { if ctxt.Headtype == obj.Hnacl || ctxt.Arch.Family == sys.I386 {
cmp = ACMPL cmp = ACMPL
lea = ALEAL lea = ALEAL
mov = AMOVL mov = AMOVL
...@@ -1101,7 +1098,7 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, framesize int32, ...@@ -1101,7 +1098,7 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, framesize int32,
p.From.Reg = REG_SI p.From.Reg = REG_SI
p.To.Type = obj.TYPE_CONST p.To.Type = obj.TYPE_CONST
p.To.Offset = obj.StackPreempt p.To.Offset = obj.StackPreempt
if p.Mode == 32 { if ctxt.Arch.Family == sys.I386 {
p.To.Offset = int64(uint32(obj.StackPreempt & (1<<32 - 1))) p.To.Offset = int64(uint32(obj.StackPreempt & (1<<32 - 1)))
} }
...@@ -1151,7 +1148,6 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, framesize int32, ...@@ -1151,7 +1148,6 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, framesize int32,
pcdata := obj.Appendp(ctxt, spfix) pcdata := obj.Appendp(ctxt, spfix)
pcdata.Pos = cursym.Text.Pos pcdata.Pos = cursym.Text.Pos
pcdata.Mode = cursym.Text.Mode
pcdata.As = obj.APCDATA pcdata.As = obj.APCDATA
pcdata.From.Type = obj.TYPE_CONST pcdata.From.Type = obj.TYPE_CONST
pcdata.From.Offset = obj.PCDATA_StackMapIndex pcdata.From.Offset = obj.PCDATA_StackMapIndex
...@@ -1160,7 +1156,6 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, framesize int32, ...@@ -1160,7 +1156,6 @@ func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, framesize int32,
call := obj.Appendp(ctxt, pcdata) call := obj.Appendp(ctxt, pcdata)
call.Pos = cursym.Text.Pos call.Pos = cursym.Text.Pos
call.Mode = cursym.Text.Mode
call.As = obj.ACALL call.As = obj.ACALL
call.To.Type = obj.TYPE_BRANCH call.To.Type = obj.TYPE_BRANCH
call.To.Name = obj.NAME_EXTERN call.To.Name = obj.NAME_EXTERN
......
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