mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: mark abi.PtrType.Elem sym as used
CL 700336 let the compiler see into the abi.PtrType.Elem field, but forgot the MarkTypeSymUsedInInterface to ensure that the symbol is marked as referenced. I am not sure how to write a test for this, but I noticed this when working on further optimizations where I "fixed" this issue and confusingly failed toolstash -cmp, with diffs like: @@ -70582,6 +70582,7 @@ reflect.groupAndSlotOf<1> STEXT size=696 args=0x20 locals=0x1e0 funcid=0x0 align rel 3+0 t=R_USEIFACE type:*reflect.rtype<0>+0 rel 3+0 t=R_USEIFACE type:*reflect.rtype<0>+0 rel 3+0 t=R_USEIFACE type:*uint64<0>+0 + rel 3+0 t=R_USEIFACE type:uint64<0>+0 rel 71+0 t=R_CALLIND +0 rel 92+4 t=R_PCREL go:itab.*reflect.rtype,reflect.Type<0>+0 rel 114+4 t=R_CALL reflect.(*rtype).ptrTo<1>+0 Updates #75203 Change-Id: Ib8de8a32aeb8a7ea6fcf5d728a2e4944ef227ab2 Reviewed-on: https://go-review.googlesource.com/c/go/+/701296 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Auto-Submit: Keith Randall <khr@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Michael Pratt <mpratt@google.com> Reviewed-by: Keith Randall <khr@google.com>
This commit is contained in:
parent
0b1eed09a3
commit
d767064170
3 changed files with 16 additions and 14 deletions
|
|
@ -2778,10 +2778,10 @@
|
|||
(Load <typ.Uintptr> (ITab (IMake (Convert (Addr {s} sb) _) _)) _) && isFixedSym(s, 0) => (Addr {fixedSym(b.Func, s, 0)} sb)
|
||||
|
||||
// Loading constant values from abi.PtrType.Elem.
|
||||
(Load <t> (OffPtr [off] (Addr {s} sb) ) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(s, off)} sb)
|
||||
(Load <t> (OffPtr [off] (Convert (Addr {s} sb) _) ) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(s, off)} sb)
|
||||
(Load <t> (OffPtr [off] (ITab (IMake (Addr {s} sb) _))) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(s, off)} sb)
|
||||
(Load <t> (OffPtr [off] (ITab (IMake (Convert (Addr {s} sb) _) _))) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(s, off)} sb)
|
||||
(Load <t> (OffPtr [off] (Addr {s} sb) ) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(b.Func, s, off)} sb)
|
||||
(Load <t> (OffPtr [off] (Convert (Addr {s} sb) _) ) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(b.Func, s, off)} sb)
|
||||
(Load <t> (OffPtr [off] (ITab (IMake (Addr {s} sb) _))) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(b.Func, s, off)} sb)
|
||||
(Load <t> (OffPtr [off] (ITab (IMake (Convert (Addr {s} sb) _) _))) _) && t.IsPtr() && isPtrElem(s, off) => (Addr {ptrElem(b.Func, s, off)} sb)
|
||||
|
||||
// Loading constant values from runtime._type.hash.
|
||||
(Load <t> (OffPtr [off] (Addr {sym} _) ) _) && t.IsInteger() && t.Size() == 4 && isFixed32(config, sym, off) => (Const32 [fixed32(config, sym, off)])
|
||||
|
|
|
|||
|
|
@ -2029,14 +2029,16 @@ func isPtrElem(sym Sym, off int64) bool {
|
|||
}
|
||||
return false
|
||||
}
|
||||
func ptrElem(sym Sym, off int64) Sym {
|
||||
func ptrElem(f *Func, sym Sym, off int64) Sym {
|
||||
lsym := sym.(*obj.LSym)
|
||||
if strings.HasPrefix(lsym.Name, "type:*") {
|
||||
if ti, ok := (*lsym.Extra).(*obj.TypeInfo); ok {
|
||||
t := ti.Type.(*types.Type)
|
||||
if t.Kind() == types.TPTR {
|
||||
if off == rttype.PtrType.OffsetOf("Elem") {
|
||||
return reflectdata.TypeLinksym(t.Elem())
|
||||
elemSym := reflectdata.TypeLinksym(t.Elem())
|
||||
reflectdata.MarkTypeSymUsedInInterface(elemSym, f.fe.Func().Linksym())
|
||||
return elemSym
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15083,7 +15083,7 @@ func rewriteValuegeneric_OpLoad(v *Value) bool {
|
|||
}
|
||||
// match: (Load <t> (OffPtr [off] (Addr {s} sb) ) _)
|
||||
// cond: t.IsPtr() && isPtrElem(s, off)
|
||||
// result: (Addr {ptrElem(s, off)} sb)
|
||||
// result: (Addr {ptrElem(b.Func, s, off)} sb)
|
||||
for {
|
||||
t := v.Type
|
||||
if v_0.Op != OpOffPtr {
|
||||
|
|
@ -15100,13 +15100,13 @@ func rewriteValuegeneric_OpLoad(v *Value) bool {
|
|||
break
|
||||
}
|
||||
v.reset(OpAddr)
|
||||
v.Aux = symToAux(ptrElem(s, off))
|
||||
v.Aux = symToAux(ptrElem(b.Func, s, off))
|
||||
v.AddArg(sb)
|
||||
return true
|
||||
}
|
||||
// match: (Load <t> (OffPtr [off] (Convert (Addr {s} sb) _) ) _)
|
||||
// cond: t.IsPtr() && isPtrElem(s, off)
|
||||
// result: (Addr {ptrElem(s, off)} sb)
|
||||
// result: (Addr {ptrElem(b.Func, s, off)} sb)
|
||||
for {
|
||||
t := v.Type
|
||||
if v_0.Op != OpOffPtr {
|
||||
|
|
@ -15127,13 +15127,13 @@ func rewriteValuegeneric_OpLoad(v *Value) bool {
|
|||
break
|
||||
}
|
||||
v.reset(OpAddr)
|
||||
v.Aux = symToAux(ptrElem(s, off))
|
||||
v.Aux = symToAux(ptrElem(b.Func, s, off))
|
||||
v.AddArg(sb)
|
||||
return true
|
||||
}
|
||||
// match: (Load <t> (OffPtr [off] (ITab (IMake (Addr {s} sb) _))) _)
|
||||
// cond: t.IsPtr() && isPtrElem(s, off)
|
||||
// result: (Addr {ptrElem(s, off)} sb)
|
||||
// result: (Addr {ptrElem(b.Func, s, off)} sb)
|
||||
for {
|
||||
t := v.Type
|
||||
if v_0.Op != OpOffPtr {
|
||||
|
|
@ -15158,13 +15158,13 @@ func rewriteValuegeneric_OpLoad(v *Value) bool {
|
|||
break
|
||||
}
|
||||
v.reset(OpAddr)
|
||||
v.Aux = symToAux(ptrElem(s, off))
|
||||
v.Aux = symToAux(ptrElem(b.Func, s, off))
|
||||
v.AddArg(sb)
|
||||
return true
|
||||
}
|
||||
// match: (Load <t> (OffPtr [off] (ITab (IMake (Convert (Addr {s} sb) _) _))) _)
|
||||
// cond: t.IsPtr() && isPtrElem(s, off)
|
||||
// result: (Addr {ptrElem(s, off)} sb)
|
||||
// result: (Addr {ptrElem(b.Func, s, off)} sb)
|
||||
for {
|
||||
t := v.Type
|
||||
if v_0.Op != OpOffPtr {
|
||||
|
|
@ -15193,7 +15193,7 @@ func rewriteValuegeneric_OpLoad(v *Value) bool {
|
|||
break
|
||||
}
|
||||
v.reset(OpAddr)
|
||||
v.Aux = symToAux(ptrElem(s, off))
|
||||
v.Aux = symToAux(ptrElem(b.Func, s, off))
|
||||
v.AddArg(sb)
|
||||
return true
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue