]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: mark abi.PtrType.Elem sym as used
authorJake Bailey <jacob.b.bailey@gmail.com>
Fri, 5 Sep 2025 19:59:33 +0000 (12:59 -0700)
committerGopher Robot <gobot@golang.org>
Fri, 5 Sep 2025 20:52:20 +0000 (13:52 -0700)
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>
src/cmd/compile/internal/ssa/_gen/generic.rules
src/cmd/compile/internal/ssa/rewrite.go
src/cmd/compile/internal/ssa/rewritegeneric.go

index c5e2507a14fd682fcf5a505e29e5fe4d0d715b4f..6255045c6f50d5e609bc928c8ad65b27d063dad7 100644 (file)
 (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)])
index 8f331c283a66e0cab1d24d2329c494685b9eace9..a4242c2141d8f9cb8f5a02d8f4906c7c34cb1ba5 100644 (file)
@@ -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
                                }
                        }
                }
index a0a4960397d809cb39ea958f9f988aa7eb8b2507..e776ea5301bb6e6306a5274dc36ff440dbb55f87 100644 (file)
@@ -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
        }