diff options
Diffstat (limited to 'src/cmd/internal/obj/x86/obj6.go')
| -rw-r--r-- | src/cmd/internal/obj/x86/obj6.go | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/cmd/internal/obj/x86/obj6.go b/src/cmd/internal/obj/x86/obj6.go index 85a4260453..a071762681 100644 --- a/src/cmd/internal/obj/x86/obj6.go +++ b/src/cmd/internal/obj/x86/obj6.go @@ -158,11 +158,11 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) { } } - // Android and Win64 use a tls offset determined at runtime. Rewrite + // Android and Windows use a tls offset determined at runtime. Rewrite // MOVQ TLS, BX // to // MOVQ runtime.tls_g(SB), BX - if (isAndroid || (ctxt.Headtype == objabi.Hwindows && ctxt.Arch.Family == sys.AMD64)) && + if (isAndroid || ctxt.Headtype == objabi.Hwindows) && (p.As == AMOVQ || p.As == AMOVL) && p.From.Type == obj.TYPE_REG && p.From.Reg == REG_TLS && p.To.Type == obj.TYPE_REG && REG_AX <= p.To.Reg && p.To.Reg <= REG_R15 { p.From.Type = obj.TYPE_MEM p.From.Name = obj.NAME_EXTERN @@ -170,17 +170,23 @@ func progedit(ctxt *obj.Link, p *obj.Prog, newprog obj.ProgAlloc) { p.From.Sym = ctxt.Lookup("runtime.tls_g") p.From.Index = REG_NONE if ctxt.Headtype == objabi.Hwindows { - // Win64 requires an additional indirection + // Windows requires an additional indirection // to retrieve the TLS pointer, - // as runtime.tls_g contains the TLS offset from GS. - // add + // as runtime.tls_g contains the TLS offset from GS or FS. + // on AMD64 add // MOVQ 0(BX)(GS*1), BX + // on 386 add + // MOVQ 0(BX)(FS*1), BX4 q := obj.Appendp(p, newprog) q.As = p.As q.From = obj.Addr{} q.From.Type = obj.TYPE_MEM q.From.Reg = p.To.Reg - q.From.Index = REG_GS + if ctxt.Arch.Family == sys.AMD64 { + q.From.Index = REG_GS + } else { + q.From.Index = REG_FS + } q.From.Scale = 1 q.From.Offset = 0 q.To = p.To |
