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:
Jake Bailey 2025-09-05 12:59:33 -07:00 committed by Gopher Robot
parent 0b1eed09a3
commit d767064170
3 changed files with 16 additions and 14 deletions

View file

@ -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)])

View file

@ -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
} }
} }
} }

View file

@ -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
} }