From: Josh Bleecher Snyder Date: Sun, 26 Mar 2017 14:46:30 +0000 (-0700) Subject: cmd/internal/obj/x86: make ctxt.Cursym local X-Git-Tag: go1.9beta1~969 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=166160b44664e75ffc6e51cd795956fd586196e4;p=gostls13.git cmd/internal/obj/x86: make ctxt.Cursym local Thread it through as an argument instead of using a global. Passes toolstash-check -all. Updates #15756 Change-Id: Ia8c6ce09b43dbb2e6c7d889ded8dbaeb5366048d Reviewed-on: https://go-review.googlesource.com/38667 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick --- diff --git a/src/cmd/internal/obj/x86/asm6.go b/src/cmd/internal/obj/x86/asm6.go index f048957663..013c150fa7 100644 --- a/src/cmd/internal/obj/x86/asm6.go +++ b/src/cmd/internal/obj/x86/asm6.go @@ -1763,8 +1763,6 @@ func spadjop(ctxt *obj.Link, p *obj.Prog, l, q obj.As) obj.As { } func span6(ctxt *obj.Link, s *obj.LSym) { - ctxt.Cursym = s - if s.P != nil { return } @@ -1775,7 +1773,7 @@ func span6(ctxt *obj.Link, s *obj.LSym) { var asmbuf AsmBuf - for p := ctxt.Cursym.Text; p != nil; p = p.Link { + for p := s.Text; p != nil; p = p.Link { if p.To.Type == obj.TYPE_BRANCH { if p.Pcond == nil { p.Pcond = p @@ -1915,7 +1913,7 @@ func span6(ctxt *obj.Link, s *obj.LSym) { p.Rel = nil p.Pc = int64(c) - asmbuf.asmins(ctxt, p) + asmbuf.asmins(ctxt, s, p) m := asmbuf.Len() if int(p.Isize) != m { p.Isize = uint8(m) @@ -2755,7 +2753,7 @@ bad: return } -func (asmbuf *AsmBuf) relput4(ctxt *obj.Link, p *obj.Prog, a *obj.Addr) { +func (asmbuf *AsmBuf) relput4(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, a *obj.Addr) { var rel obj.Reloc v := vaddr(ctxt, p, a, &rel) @@ -2763,7 +2761,7 @@ func (asmbuf *AsmBuf) relput4(ctxt *obj.Link, p *obj.Prog, a *obj.Addr) { if rel.Siz != 4 { ctxt.Diag("bad reloc") } - r := obj.Addrel(ctxt.Cursym) + r := obj.Addrel(cursym) *r = rel r.Off = int32(p.Pc + int64(asmbuf.Len())) } @@ -2771,23 +2769,6 @@ func (asmbuf *AsmBuf) relput4(ctxt *obj.Link, p *obj.Prog, a *obj.Addr) { asmbuf.PutInt32(int32(v)) } -/* -static void -relput8(Prog *p, Addr *a) -{ - vlong v; - Reloc rel, *r; - - v = vaddr(ctxt, p, a, &rel); - if(rel.siz != 0) { - r = addrel(ctxt->cursym); - *r = rel; - r->siz = 8; - r->off = p->pc + ctxt->andptr - ctxt->and; - } - put8(ctxt, v); -} -*/ func vaddr(ctxt *obj.Link, p *obj.Prog, a *obj.Addr, r *obj.Reloc) int64 { if r != nil { *r = obj.Reloc{} @@ -2839,7 +2820,7 @@ func vaddr(ctxt *obj.Link, p *obj.Prog, a *obj.Addr, r *obj.Reloc) int64 { return a.Offset } -func (asmbuf *AsmBuf) asmandsz(ctxt *obj.Link, p *obj.Prog, a *obj.Addr, r int, rex int, m64 int) { +func (asmbuf *AsmBuf) asmandsz(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, a *obj.Addr, r int, rex int, m64 int) { var base int var rel obj.Reloc @@ -3027,7 +3008,7 @@ putrelv: goto bad } - r := obj.Addrel(ctxt.Cursym) + r := obj.Addrel(cursym) *r = rel r.Off = int32(p.Pc + int64(asmbuf.Len())) } @@ -3040,12 +3021,12 @@ bad: return } -func (asmbuf *AsmBuf) asmand(ctxt *obj.Link, p *obj.Prog, a *obj.Addr, ra *obj.Addr) { - asmbuf.asmandsz(ctxt, p, a, reg[ra.Reg], regrex[ra.Reg], 0) +func (asmbuf *AsmBuf) asmand(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, a *obj.Addr, ra *obj.Addr) { + asmbuf.asmandsz(ctxt, cursym, p, a, reg[ra.Reg], regrex[ra.Reg], 0) } -func (asmbuf *AsmBuf) asmando(ctxt *obj.Link, p *obj.Prog, a *obj.Addr, o int) { - asmbuf.asmandsz(ctxt, p, a, o, 0, 0) +func (asmbuf *AsmBuf) asmando(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, a *obj.Addr, o int) { + asmbuf.asmandsz(ctxt, cursym, p, a, o, 0, 0) } func bytereg(a *obj.Addr, t *uint8) { @@ -3321,7 +3302,7 @@ func (asmbuf *AsmBuf) asmvex(ctxt *obj.Link, rm, v, r *obj.Addr, vex, opcode uin asmbuf.Put1(opcode) } -func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { +func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog) { o := opindex[p.As&obj.AMask] if o == nil { @@ -3519,7 +3500,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { } asmbuf.Put1(byte(op)) } - asmbuf.asmand(ctxt, p, &p.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &p.From, &p.To) case Zmb_r: bytereg(&p.From, &p.Ft) @@ -3527,24 +3508,24 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { case Zm_r: asmbuf.Put1(byte(op)) - asmbuf.asmand(ctxt, p, &p.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &p.From, &p.To) case Zm2_r: asmbuf.Put2(byte(op), o.op[z+1]) - asmbuf.asmand(ctxt, p, &p.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &p.From, &p.To) case Zm_r_xm: asmbuf.mediaop(ctxt, o, op, int(yt.zoffset), z) - asmbuf.asmand(ctxt, p, &p.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &p.From, &p.To) case Zm_r_xm_nr: ctxt.Rexflag = 0 asmbuf.mediaop(ctxt, o, op, int(yt.zoffset), z) - asmbuf.asmand(ctxt, p, &p.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &p.From, &p.To) case Zm_r_i_xm: asmbuf.mediaop(ctxt, o, op, int(yt.zoffset), z) - asmbuf.asmand(ctxt, p, &p.From, p.From3) + asmbuf.asmand(ctxt, cursym, p, &p.From, p.From3) asmbuf.Put1(byte(p.To.Offset)) case Zibm_r, Zibr_m: @@ -3558,9 +3539,9 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { asmbuf.Put1(byte(op)) } if yt.zcase == Zibr_m { - asmbuf.asmand(ctxt, p, &p.To, p.From3) + asmbuf.asmand(ctxt, cursym, p, &p.To, p.From3) } else { - asmbuf.asmand(ctxt, p, p.From3, &p.To) + asmbuf.asmand(ctxt, cursym, p, p.From3, &p.To) } asmbuf.Put1(byte(p.From.Offset)) @@ -3570,20 +3551,20 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { ctxt.Diag("asmins: Zaut sb type ADDR") } p.From.Type = obj.TYPE_MEM - asmbuf.asmand(ctxt, p, &p.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &p.From, &p.To) p.From.Type = obj.TYPE_ADDR case Zm_o: asmbuf.Put1(byte(op)) - asmbuf.asmando(ctxt, p, &p.From, int(o.op[z+1])) + asmbuf.asmando(ctxt, cursym, p, &p.From, int(o.op[z+1])) case Zr_m: asmbuf.Put1(byte(op)) - asmbuf.asmand(ctxt, p, &p.To, &p.From) + asmbuf.asmand(ctxt, cursym, p, &p.To, &p.From) case Zvex_rm_v_r: asmbuf.asmvex(ctxt, &p.From, p.From3, &p.To, o.op[z], o.op[z+1]) - asmbuf.asmand(ctxt, p, &p.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &p.From, &p.To) case Zvex_i_r_v: asmbuf.asmvex(ctxt, p.From3, &p.To, nil, o.op[z], o.op[z+1]) @@ -3598,37 +3579,37 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { case Zvex_i_rm_v_r: asmbuf.asmvex(ctxt, &p.From, p.From3, &p.To, o.op[z], o.op[z+1]) - asmbuf.asmand(ctxt, p, &p.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &p.From, &p.To) asmbuf.Put1(byte(p.From3.Offset)) case Zvex_i_rm_r: asmbuf.asmvex(ctxt, p.From3, nil, &p.To, o.op[z], o.op[z+1]) - asmbuf.asmand(ctxt, p, p.From3, &p.To) + asmbuf.asmand(ctxt, cursym, p, p.From3, &p.To) asmbuf.Put1(byte(p.From.Offset)) case Zvex_v_rm_r: asmbuf.asmvex(ctxt, p.From3, &p.From, &p.To, o.op[z], o.op[z+1]) - asmbuf.asmand(ctxt, p, p.From3, &p.To) + asmbuf.asmand(ctxt, cursym, p, p.From3, &p.To) case Zvex_r_v_rm: asmbuf.asmvex(ctxt, &p.To, p.From3, &p.From, o.op[z], o.op[z+1]) - asmbuf.asmand(ctxt, p, &p.To, &p.From) + asmbuf.asmand(ctxt, cursym, p, &p.To, &p.From) case Zr_m_xm: asmbuf.mediaop(ctxt, o, op, int(yt.zoffset), z) - asmbuf.asmand(ctxt, p, &p.To, &p.From) + asmbuf.asmand(ctxt, cursym, p, &p.To, &p.From) case Zr_m_xm_nr: ctxt.Rexflag = 0 asmbuf.mediaop(ctxt, o, op, int(yt.zoffset), z) - asmbuf.asmand(ctxt, p, &p.To, &p.From) + asmbuf.asmand(ctxt, cursym, p, &p.To, &p.From) case Zo_m: asmbuf.Put1(byte(op)) - asmbuf.asmando(ctxt, p, &p.To, int(o.op[z+1])) + asmbuf.asmando(ctxt, cursym, p, &p.To, int(o.op[z+1])) case Zcallindreg: - r = obj.Addrel(ctxt.Cursym) + r = obj.Addrel(cursym) r.Off = int32(p.Pc) r.Type = obj.R_CALLIND r.Siz = 0 @@ -3636,21 +3617,21 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { case Zo_m64: asmbuf.Put1(byte(op)) - asmbuf.asmandsz(ctxt, p, &p.To, int(o.op[z+1]), 0, 1) + asmbuf.asmandsz(ctxt, cursym, p, &p.To, int(o.op[z+1]), 0, 1) case Zm_ibo: asmbuf.Put1(byte(op)) - asmbuf.asmando(ctxt, p, &p.From, int(o.op[z+1])) + asmbuf.asmando(ctxt, cursym, p, &p.From, int(o.op[z+1])) asmbuf.Put1(byte(vaddr(ctxt, p, &p.To, nil))) case Zibo_m: asmbuf.Put1(byte(op)) - asmbuf.asmando(ctxt, p, &p.To, int(o.op[z+1])) + asmbuf.asmando(ctxt, cursym, p, &p.To, int(o.op[z+1])) asmbuf.Put1(byte(vaddr(ctxt, p, &p.From, nil))) case Zibo_m_xm: z = asmbuf.mediaop(ctxt, o, op, int(yt.zoffset), z) - asmbuf.asmando(ctxt, p, &p.To, int(o.op[z+1])) + asmbuf.asmando(ctxt, cursym, p, &p.To, int(o.op[z+1])) asmbuf.Put1(byte(vaddr(ctxt, p, &p.From, nil))) case Z_ib, Zib_: @@ -3676,7 +3657,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { v = vaddr(ctxt, p, &p.From, nil) asmbuf.PutInt16(int16(v)) } else { - asmbuf.relput4(ctxt, p, &p.From) + asmbuf.relput4(ctxt, cursym, p, &p.From) } case Zo_iw: @@ -3697,7 +3678,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { ctxt.Rexflag |= regrex[p.To.Reg] & Rxb asmbuf.Put1(byte(0xb8 + reg[p.To.Reg])) if rel.Type != 0 { - r = obj.Addrel(ctxt.Cursym) + r = obj.Addrel(cursym) *r = rel r.Off = int32(p.Pc + int64(asmbuf.Len())) } @@ -3708,7 +3689,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { //p->mark |= 0100; //print("sign: %llux %v\n", v, p); asmbuf.Put1(0xc7) - asmbuf.asmando(ctxt, p, &p.To, 0) + asmbuf.asmando(ctxt, cursym, p, &p.To, 0) asmbuf.PutInt32(int32(v)) // need all 8 } else { @@ -3716,7 +3697,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { ctxt.Rexflag |= regrex[p.To.Reg] & Rxb asmbuf.Put1(byte(op + reg[p.To.Reg])) if rel.Type != 0 { - r = obj.Addrel(ctxt.Cursym) + r = obj.Addrel(cursym) *r = rel r.Off = int32(p.Pc + int64(asmbuf.Len())) } @@ -3726,7 +3707,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { case Zib_rr: asmbuf.Put1(byte(op)) - asmbuf.asmand(ctxt, p, &p.To, &p.To) + asmbuf.asmand(ctxt, cursym, p, &p.To, &p.To) asmbuf.Put1(byte(vaddr(ctxt, p, &p.From, nil))) case Z_il, Zil_: @@ -3740,34 +3721,34 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { v = vaddr(ctxt, p, a, nil) asmbuf.PutInt16(int16(v)) } else { - asmbuf.relput4(ctxt, p, a) + asmbuf.relput4(ctxt, cursym, p, a) } case Zm_ilo, Zilo_m: asmbuf.Put1(byte(op)) if yt.zcase == Zilo_m { a = &p.From - asmbuf.asmando(ctxt, p, &p.To, int(o.op[z+1])) + asmbuf.asmando(ctxt, cursym, p, &p.To, int(o.op[z+1])) } else { a = &p.To - asmbuf.asmando(ctxt, p, &p.From, int(o.op[z+1])) + asmbuf.asmando(ctxt, cursym, p, &p.From, int(o.op[z+1])) } if o.prefix == Pe { v = vaddr(ctxt, p, a, nil) asmbuf.PutInt16(int16(v)) } else { - asmbuf.relput4(ctxt, p, a) + asmbuf.relput4(ctxt, cursym, p, a) } case Zil_rr: asmbuf.Put1(byte(op)) - asmbuf.asmand(ctxt, p, &p.To, &p.To) + asmbuf.asmand(ctxt, cursym, p, &p.To, &p.To) if o.prefix == Pe { v = vaddr(ctxt, p, &p.From, nil) asmbuf.PutInt16(int16(v)) } else { - asmbuf.relput4(ctxt, p, &p.From) + asmbuf.relput4(ctxt, cursym, p, &p.From) } case Z_rp: @@ -3781,7 +3762,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { case Zclr: ctxt.Rexflag &^= Pw asmbuf.Put1(byte(op)) - asmbuf.asmand(ctxt, p, &p.To, &p.To) + asmbuf.asmand(ctxt, cursym, p, &p.To, &p.To) case Zcallcon, Zjmpcon: if yt.zcase == Zcallcon { @@ -3789,7 +3770,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { } else { asmbuf.Put1(o.op[z+1]) } - r = obj.Addrel(ctxt.Cursym) + r = obj.Addrel(cursym) r.Off = int32(p.Pc + int64(asmbuf.Len())) r.Type = obj.R_PCREL r.Siz = 4 @@ -3798,7 +3779,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { case Zcallind: asmbuf.Put2(byte(op), o.op[z+1]) - r = obj.Addrel(ctxt.Cursym) + r = obj.Addrel(cursym) r.Off = int32(p.Pc + int64(asmbuf.Len())) if p.Mode == 64 { r.Type = obj.R_PCREL @@ -3831,7 +3812,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { asmbuf.Put(bpduff1) } asmbuf.Put1(byte(op)) - r = obj.Addrel(ctxt.Cursym) + r = obj.Addrel(cursym) r.Off = int32(p.Pc + int64(asmbuf.Len())) r.Sym = p.To.Sym r.Add = p.To.Offset @@ -3857,7 +3838,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { } asmbuf.Put1(o.op[z+1]) - r = obj.Addrel(ctxt.Cursym) + r = obj.Addrel(cursym) r.Off = int32(p.Pc + int64(asmbuf.Len())) r.Sym = p.To.Sym r.Type = obj.R_PCREL @@ -3947,7 +3928,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { v = vaddr(ctxt, p, &p.From, &rel) if rel.Siz != 0 { rel.Siz = uint8(op) - r = obj.Addrel(ctxt.Cursym) + r = obj.Addrel(cursym) *r = rel r.Off = int32(p.Pc + int64(asmbuf.Len())) } @@ -3985,20 +3966,20 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { case 1: /* r,m */ asmbuf.Put1(t[0]) - asmbuf.asmando(ctxt, p, &p.To, int(t[1])) + asmbuf.asmando(ctxt, cursym, p, &p.To, int(t[1])) case 2: /* m,r */ asmbuf.Put1(t[0]) - asmbuf.asmando(ctxt, p, &p.From, int(t[1])) + asmbuf.asmando(ctxt, cursym, p, &p.From, int(t[1])) case 3: /* r,m - 2op */ asmbuf.Put2(t[0], t[1]) - asmbuf.asmando(ctxt, p, &p.To, int(t[2])) + asmbuf.asmando(ctxt, cursym, p, &p.To, int(t[2])) ctxt.Rexflag |= regrex[p.From.Reg] & (Rxr | 0x40) case 4: /* m,r - 2op */ asmbuf.Put2(t[0], t[1]) - asmbuf.asmando(ctxt, p, &p.From, int(t[2])) + asmbuf.asmando(ctxt, cursym, p, &p.From, int(t[2])) ctxt.Rexflag |= regrex[p.To.Reg] & (Rxr | 0x40) case 5: /* load full pointer, trash heap */ @@ -4025,7 +4006,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { asmbuf.Put2(0x0f, 0xb5) } - asmbuf.asmand(ctxt, p, &p.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &p.From, &p.To) case 6: /* double shift */ if t[0] == Pw { @@ -4045,7 +4026,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { case obj.TYPE_CONST: asmbuf.Put2(0x0f, t[0]) - asmbuf.asmandsz(ctxt, p, &p.To, reg[p.From3.Reg], regrex[p.From3.Reg], 0) + asmbuf.asmandsz(ctxt, cursym, p, &p.To, reg[p.From3.Reg], regrex[p.From3.Reg], 0) asmbuf.Put1(byte(p.From.Offset)) case obj.TYPE_REG: @@ -4055,7 +4036,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { case REG_CL, REG_CX: asmbuf.Put2(0x0f, t[1]) - asmbuf.asmandsz(ctxt, p, &p.To, reg[p.From3.Reg], regrex[p.From3.Reg], 0) + asmbuf.asmandsz(ctxt, cursym, p, &p.To, reg[p.From3.Reg], regrex[p.From3.Reg], 0) } } @@ -4093,7 +4074,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { // instruction. dst := p.To.Reg asmbuf.Put1(0xe8) - r = obj.Addrel(ctxt.Cursym) + r = obj.Addrel(cursym) r.Off = int32(p.Pc + int64(asmbuf.Len())) r.Type = obj.R_CALL r.Siz = 4 @@ -4101,7 +4082,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { asmbuf.PutInt32(0) asmbuf.Put2(0x8B, byte(2<<6|reg[dst]|(reg[dst]<<3))) - r = obj.Addrel(ctxt.Cursym) + r = obj.Addrel(cursym) r.Off = int32(p.Pc + int64(asmbuf.Len())) r.Type = obj.R_TLS_IE r.Siz = 4 @@ -4118,7 +4099,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { pp.From.Scale = 0 asmbuf.Put2(0x65, // GS 0x8B) - asmbuf.asmand(ctxt, p, &pp.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &pp.From, &p.To) } case obj.Hplan9: if ctxt.Plan9privates == nil { @@ -4131,7 +4112,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { pp.From.Offset = 0 pp.From.Index = REG_NONE asmbuf.Put1(0x8B) - asmbuf.asmand(ctxt, p, &pp.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &pp.From, &p.To) case obj.Hwindows, obj.Hwindowsgui: // Windows TLS base is always 0x14(FS). @@ -4144,7 +4125,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { pp.From.Scale = 0 asmbuf.Put2(0x64, // FS 0x8B) - asmbuf.asmand(ctxt, p, &pp.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &pp.From, &p.To) } break } @@ -4169,7 +4150,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { ctxt.Rexflag = Pw | (regrex[p.To.Reg] & Rxr) asmbuf.Put2(0x8B, byte(0x05|(reg[p.To.Reg]<<3))) - r = obj.Addrel(ctxt.Cursym) + r = obj.Addrel(cursym) r.Off = int32(p.Pc + int64(asmbuf.Len())) r.Type = obj.R_TLS_IE r.Siz = 4 @@ -4188,7 +4169,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { pp.From.Index = REG_NONE ctxt.Rexflag |= Pw asmbuf.Put1(0x8B) - asmbuf.asmand(ctxt, p, &pp.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &pp.From, &p.To) case obj.Hsolaris: // TODO(rsc): Delete Hsolaris from list. Should not use this code. See progedit in obj6.c. // TLS base is 0(FS). @@ -4203,7 +4184,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { ctxt.Rexflag |= Pw asmbuf.Put2(0x64, // FS 0x8B) - asmbuf.asmand(ctxt, p, &pp.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &pp.From, &p.To) case obj.Hwindows, obj.Hwindowsgui: // Windows TLS base is always 0x28(GS). @@ -4218,7 +4199,7 @@ func (asmbuf *AsmBuf) doasm(ctxt *obj.Link, p *obj.Prog) { ctxt.Rexflag |= Pw asmbuf.Put2(0x65, // GS 0x8B) - asmbuf.asmand(ctxt, p, &pp.From, &p.To) + asmbuf.asmand(ctxt, cursym, p, &pp.From, &p.To) } } return @@ -4249,15 +4230,15 @@ bad: breg := byteswapreg(ctxt, &p.To) if breg != REG_AX { asmbuf.Put1(0x87) // xchg lhs,bx - asmbuf.asmando(ctxt, p, &p.From, reg[breg]) + asmbuf.asmando(ctxt, cursym, p, &p.From, reg[breg]) subreg(&pp, z, breg) - asmbuf.doasm(ctxt, &pp) + asmbuf.doasm(ctxt, cursym, &pp) asmbuf.Put1(0x87) // xchg lhs,bx - asmbuf.asmando(ctxt, p, &p.From, reg[breg]) + asmbuf.asmando(ctxt, cursym, p, &p.From, reg[breg]) } else { asmbuf.Put1(byte(0x90 + reg[z])) // xchg lsh,ax subreg(&pp, z, REG_AX) - asmbuf.doasm(ctxt, &pp) + asmbuf.doasm(ctxt, cursym, &pp) asmbuf.Put1(byte(0x90 + reg[z])) // xchg lsh,ax } return @@ -4267,15 +4248,15 @@ bad: // We certainly don't want to exchange // with AX if the op is MUL or DIV. asmbuf.Put1(0x87) // xchg lhs,bx - asmbuf.asmando(ctxt, p, &p.From, reg[REG_BX]) + asmbuf.asmando(ctxt, cursym, p, &p.From, reg[REG_BX]) subreg(&pp, z, REG_BX) - asmbuf.doasm(ctxt, &pp) + asmbuf.doasm(ctxt, cursym, &pp) asmbuf.Put1(0x87) // xchg lhs,bx - asmbuf.asmando(ctxt, p, &p.From, reg[REG_BX]) + asmbuf.asmando(ctxt, cursym, p, &p.From, reg[REG_BX]) } else { asmbuf.Put1(byte(0x90 + reg[z])) // xchg lsh,ax subreg(&pp, z, REG_AX) - asmbuf.doasm(ctxt, &pp) + asmbuf.doasm(ctxt, cursym, &pp) asmbuf.Put1(byte(0x90 + reg[z])) // xchg lsh,ax } return @@ -4289,15 +4270,15 @@ bad: breg := byteswapreg(ctxt, &p.From) if breg != REG_AX { asmbuf.Put1(0x87) //xchg rhs,bx - asmbuf.asmando(ctxt, p, &p.To, reg[breg]) + asmbuf.asmando(ctxt, cursym, p, &p.To, reg[breg]) subreg(&pp, z, breg) - asmbuf.doasm(ctxt, &pp) + asmbuf.doasm(ctxt, cursym, &pp) asmbuf.Put1(0x87) // xchg rhs,bx - asmbuf.asmando(ctxt, p, &p.To, reg[breg]) + asmbuf.asmando(ctxt, cursym, p, &p.To, reg[breg]) } else { asmbuf.Put1(byte(0x90 + reg[z])) // xchg rsh,ax subreg(&pp, z, REG_AX) - asmbuf.doasm(ctxt, &pp) + asmbuf.doasm(ctxt, cursym, &pp) asmbuf.Put1(byte(0x90 + reg[z])) // xchg rsh,ax } return @@ -4305,15 +4286,15 @@ bad: if isax(&p.From) { asmbuf.Put1(0x87) // xchg rhs,bx - asmbuf.asmando(ctxt, p, &p.To, reg[REG_BX]) + asmbuf.asmando(ctxt, cursym, p, &p.To, reg[REG_BX]) subreg(&pp, z, REG_BX) - asmbuf.doasm(ctxt, &pp) + asmbuf.doasm(ctxt, cursym, &pp) asmbuf.Put1(0x87) // xchg rhs,bx - asmbuf.asmando(ctxt, p, &p.To, reg[REG_BX]) + asmbuf.asmando(ctxt, cursym, p, &p.To, reg[REG_BX]) } else { asmbuf.Put1(byte(0x90 + reg[z])) // xchg rsh,ax subreg(&pp, z, REG_AX) - asmbuf.doasm(ctxt, &pp) + asmbuf.doasm(ctxt, cursym, &pp) asmbuf.Put1(byte(0x90 + reg[z])) // xchg rsh,ax } return @@ -4457,7 +4438,7 @@ func (asmbuf *AsmBuf) nacltrunc(ctxt *obj.Link, reg int) { asmbuf.Put2(0x89, byte(3<<6|reg<<3|reg)) } -func (asmbuf *AsmBuf) asmins(ctxt *obj.Link, p *obj.Prog) { +func (asmbuf *AsmBuf) asmins(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog) { asmbuf.Reset() if ctxt.Headtype == obj.Hnacl && p.Mode == 32 { @@ -4561,7 +4542,7 @@ func (asmbuf *AsmBuf) asmins(ctxt *obj.Link, p *obj.Prog) { ctxt.Rexflag = 0 ctxt.Vexflag = 0 mark := asmbuf.Len() - asmbuf.doasm(ctxt, p) + asmbuf.doasm(ctxt, cursym, p) if ctxt.Rexflag != 0 && ctxt.Vexflag == 0 { /* * as befits the whole approach of the architecture, @@ -4585,8 +4566,8 @@ func (asmbuf *AsmBuf) asmins(ctxt *obj.Link, p *obj.Prog) { } n := asmbuf.Len() - for i := len(ctxt.Cursym.R) - 1; i >= 0; i-- { - r := &ctxt.Cursym.R[i] + for i := len(cursym.R) - 1; i >= 0; i-- { + r := &cursym.R[i] if int64(r.Off) < p.Pc { break } diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go index 84fe9d7df1..5b82100981 100644 --- a/src/cmd/internal/obj/x86/obj6.go +++ b/src/cmd/internal/obj/x86/obj6.go @@ -605,8 +605,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { ctxt.Plan9privates = obj.Linklookup(ctxt, "_privates", 0) } - ctxt.Cursym = cursym - if cursym.Text == nil || cursym.Text.Link == nil { return } @@ -687,7 +685,7 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym) { } if cursym.Text.From3Offset()&obj.NOSPLIT == 0 { - p = stacksplit(ctxt, p, autoffset, int32(textarg)) // emit split check + p = stacksplit(ctxt, cursym, p, autoffset, int32(textarg)) // emit split check } if autoffset != 0 { @@ -1021,7 +1019,7 @@ func load_g_cx(ctxt *obj.Link, p *obj.Prog) *obj.Prog { // Appends to (does not overwrite) p. // Assumes g is in CX. // Returns last new instruction. -func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32, textarg int32) *obj.Prog { +func stacksplit(ctxt *obj.Link, cursym *obj.LSym, p *obj.Prog, framesize int32, textarg int32) *obj.Prog { cmp := ACMPQ lea := ALEAQ mov := AMOVQ @@ -1045,7 +1043,7 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32, textarg int32) *ob p.From.Reg = REG_SP indir_cx(ctxt, p, &p.To) p.To.Offset = 2 * int64(ctxt.Arch.PtrSize) // G.stackguard0 - if ctxt.Cursym.CFunc() { + if cursym.CFunc() { p.To.Offset = 3 * int64(ctxt.Arch.PtrSize) // G.stackguard1 } } else if framesize <= obj.StackBig { @@ -1067,7 +1065,7 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32, textarg int32) *ob p.From.Reg = REG_AX indir_cx(ctxt, p, &p.To) p.To.Offset = 2 * int64(ctxt.Arch.PtrSize) // G.stackguard0 - if ctxt.Cursym.CFunc() { + if cursym.CFunc() { p.To.Offset = 3 * int64(ctxt.Arch.PtrSize) // G.stackguard1 } } else { @@ -1091,7 +1089,7 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32, textarg int32) *ob p.As = mov indir_cx(ctxt, p, &p.From) p.From.Offset = 2 * int64(ctxt.Arch.PtrSize) // G.stackguard0 - if ctxt.Cursym.CFunc() { + if cursym.CFunc() { p.From.Offset = 3 * int64(ctxt.Arch.PtrSize) // G.stackguard1 } p.To.Type = obj.TYPE_REG @@ -1141,7 +1139,7 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32, textarg int32) *ob jls.To.Type = obj.TYPE_BRANCH var last *obj.Prog - for last = ctxt.Cursym.Text; last.Link != nil; last = last.Link { + for last = cursym.Text; last.Link != nil; last = last.Link { } // Now we are at the end of the function, but logically @@ -1152,8 +1150,8 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32, textarg int32) *ob spfix.Spadj = -framesize pcdata := obj.Appendp(ctxt, spfix) - pcdata.Pos = ctxt.Cursym.Text.Pos - pcdata.Mode = ctxt.Cursym.Text.Mode + pcdata.Pos = cursym.Text.Pos + pcdata.Mode = cursym.Text.Mode pcdata.As = obj.APCDATA pcdata.From.Type = obj.TYPE_CONST pcdata.From.Offset = obj.PCDATA_StackMapIndex @@ -1161,16 +1159,16 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32, textarg int32) *ob pcdata.To.Offset = -1 // pcdata starts at -1 at function entry call := obj.Appendp(ctxt, pcdata) - call.Pos = ctxt.Cursym.Text.Pos - call.Mode = ctxt.Cursym.Text.Mode + call.Pos = cursym.Text.Pos + call.Mode = cursym.Text.Mode call.As = obj.ACALL call.To.Type = obj.TYPE_BRANCH call.To.Name = obj.NAME_EXTERN morestack := "runtime.morestack" switch { - case ctxt.Cursym.CFunc(): + case cursym.CFunc(): morestack = "runtime.morestackc" - case ctxt.Cursym.Text.From3Offset()&obj.NEEDCTXT == 0: + case cursym.Text.From3Offset()&obj.NEEDCTXT == 0: morestack = "runtime.morestack_noctxt" } call.To.Sym = obj.Linklookup(ctxt, morestack, 0) @@ -1187,7 +1185,7 @@ func stacksplit(ctxt *obj.Link, p *obj.Prog, framesize int32, textarg int32) *ob jmp := obj.Appendp(ctxt, callend) jmp.As = obj.AJMP jmp.To.Type = obj.TYPE_BRANCH - jmp.Pcond = ctxt.Cursym.Text.Link + jmp.Pcond = cursym.Text.Link jmp.Spadj = +framesize jls.Pcond = call