diff options
| author | Jake Bailey <jacob.b.bailey@gmail.com> | 2025-09-05 12:59:33 -0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-09-05 13:52:20 -0700 |
| commit | d767064170aa3469404d25608d9ff9fa48962337 (patch) | |
| tree | 0781b6dc7103c38b1d1ad0ded80d47aab94b0152 /src | |
| parent | 0b1eed09a34f5a1e0a5c237bc9771eb036b35319 (diff) | |
| download | go-d767064170aa3469404d25608d9ff9fa48962337.tar.xz | |
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>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/compile/internal/ssa/_gen/generic.rules | 8 | ||||
| -rw-r--r-- | src/cmd/compile/internal/ssa/rewrite.go | 6 | ||||
| -rw-r--r-- | src/cmd/compile/internal/ssa/rewritegeneric.go | 16 |
3 files changed, 16 insertions, 14 deletions
diff --git a/src/cmd/compile/internal/ssa/_gen/generic.rules b/src/cmd/compile/internal/ssa/_gen/generic.rules index c5e2507a14..6255045c6f 100644 --- a/src/cmd/compile/internal/ssa/_gen/generic.rules +++ b/src/cmd/compile/internal/ssa/_gen/generic.rules @@ -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)]) diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index 8f331c283a..a4242c2141 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -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 } } } diff --git a/src/cmd/compile/internal/ssa/rewritegeneric.go b/src/cmd/compile/internal/ssa/rewritegeneric.go index a0a4960397..e776ea5301 100644 --- a/src/cmd/compile/internal/ssa/rewritegeneric.go +++ b/src/cmd/compile/internal/ssa/rewritegeneric.go @@ -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 } |
