aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile
diff options
context:
space:
mode:
authorJake Bailey <jacob.b.bailey@gmail.com>2025-09-05 12:59:33 -0700
committerGopher Robot <gobot@golang.org>2025-09-05 13:52:20 -0700
commitd767064170aa3469404d25608d9ff9fa48962337 (patch)
tree0781b6dc7103c38b1d1ad0ded80d47aab94b0152 /src/cmd/compile
parent0b1eed09a34f5a1e0a5c237bc9771eb036b35319 (diff)
downloadgo-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/cmd/compile')
-rw-r--r--src/cmd/compile/internal/ssa/_gen/generic.rules8
-rw-r--r--src/cmd/compile/internal/ssa/rewrite.go6
-rw-r--r--src/cmd/compile/internal/ssa/rewritegeneric.go16
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
}