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)
|
(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.
|
// 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] (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(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(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(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.
|
// 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)])
|
(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
|
return false
|
||||||
}
|
}
|
||||||
func ptrElem(sym Sym, off int64) Sym {
|
func ptrElem(f *Func, sym Sym, off int64) Sym {
|
||||||
lsym := sym.(*obj.LSym)
|
lsym := sym.(*obj.LSym)
|
||||||
if strings.HasPrefix(lsym.Name, "type:*") {
|
if strings.HasPrefix(lsym.Name, "type:*") {
|
||||||
if ti, ok := (*lsym.Extra).(*obj.TypeInfo); ok {
|
if ti, ok := (*lsym.Extra).(*obj.TypeInfo); ok {
|
||||||
t := ti.Type.(*types.Type)
|
t := ti.Type.(*types.Type)
|
||||||
if t.Kind() == types.TPTR {
|
if t.Kind() == types.TPTR {
|
||||||
if off == rttype.PtrType.OffsetOf("Elem") {
|
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) ) _)
|
// match: (Load <t> (OffPtr [off] (Addr {s} sb) ) _)
|
||||||
// cond: t.IsPtr() && isPtrElem(s, off)
|
// cond: t.IsPtr() && isPtrElem(s, off)
|
||||||
// result: (Addr {ptrElem(s, off)} sb)
|
// result: (Addr {ptrElem(b.Func, s, off)} sb)
|
||||||
for {
|
for {
|
||||||
t := v.Type
|
t := v.Type
|
||||||
if v_0.Op != OpOffPtr {
|
if v_0.Op != OpOffPtr {
|
||||||
|
|
@ -15100,13 +15100,13 @@ func rewriteValuegeneric_OpLoad(v *Value) bool {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpAddr)
|
v.reset(OpAddr)
|
||||||
v.Aux = symToAux(ptrElem(s, off))
|
v.Aux = symToAux(ptrElem(b.Func, s, off))
|
||||||
v.AddArg(sb)
|
v.AddArg(sb)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (Load <t> (OffPtr [off] (Convert (Addr {s} sb) _) ) _)
|
// match: (Load <t> (OffPtr [off] (Convert (Addr {s} sb) _) ) _)
|
||||||
// cond: t.IsPtr() && isPtrElem(s, off)
|
// cond: t.IsPtr() && isPtrElem(s, off)
|
||||||
// result: (Addr {ptrElem(s, off)} sb)
|
// result: (Addr {ptrElem(b.Func, s, off)} sb)
|
||||||
for {
|
for {
|
||||||
t := v.Type
|
t := v.Type
|
||||||
if v_0.Op != OpOffPtr {
|
if v_0.Op != OpOffPtr {
|
||||||
|
|
@ -15127,13 +15127,13 @@ func rewriteValuegeneric_OpLoad(v *Value) bool {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpAddr)
|
v.reset(OpAddr)
|
||||||
v.Aux = symToAux(ptrElem(s, off))
|
v.Aux = symToAux(ptrElem(b.Func, s, off))
|
||||||
v.AddArg(sb)
|
v.AddArg(sb)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (Load <t> (OffPtr [off] (ITab (IMake (Addr {s} sb) _))) _)
|
// match: (Load <t> (OffPtr [off] (ITab (IMake (Addr {s} sb) _))) _)
|
||||||
// cond: t.IsPtr() && isPtrElem(s, off)
|
// cond: t.IsPtr() && isPtrElem(s, off)
|
||||||
// result: (Addr {ptrElem(s, off)} sb)
|
// result: (Addr {ptrElem(b.Func, s, off)} sb)
|
||||||
for {
|
for {
|
||||||
t := v.Type
|
t := v.Type
|
||||||
if v_0.Op != OpOffPtr {
|
if v_0.Op != OpOffPtr {
|
||||||
|
|
@ -15158,13 +15158,13 @@ func rewriteValuegeneric_OpLoad(v *Value) bool {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpAddr)
|
v.reset(OpAddr)
|
||||||
v.Aux = symToAux(ptrElem(s, off))
|
v.Aux = symToAux(ptrElem(b.Func, s, off))
|
||||||
v.AddArg(sb)
|
v.AddArg(sb)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// match: (Load <t> (OffPtr [off] (ITab (IMake (Convert (Addr {s} sb) _) _))) _)
|
// match: (Load <t> (OffPtr [off] (ITab (IMake (Convert (Addr {s} sb) _) _))) _)
|
||||||
// cond: t.IsPtr() && isPtrElem(s, off)
|
// cond: t.IsPtr() && isPtrElem(s, off)
|
||||||
// result: (Addr {ptrElem(s, off)} sb)
|
// result: (Addr {ptrElem(b.Func, s, off)} sb)
|
||||||
for {
|
for {
|
||||||
t := v.Type
|
t := v.Type
|
||||||
if v_0.Op != OpOffPtr {
|
if v_0.Op != OpOffPtr {
|
||||||
|
|
@ -15193,7 +15193,7 @@ func rewriteValuegeneric_OpLoad(v *Value) bool {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
v.reset(OpAddr)
|
v.reset(OpAddr)
|
||||||
v.Aux = symToAux(ptrElem(s, off))
|
v.Aux = symToAux(ptrElem(b.Func, s, off))
|
||||||
v.AddArg(sb)
|
v.AddArg(sb)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue