(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)])
}
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
}
}
}
}
// 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 {
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 {
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 {
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 {
break
}
v.reset(OpAddr)
- v.Aux = symToAux(ptrElem(s, off))
+ v.Aux = symToAux(ptrElem(b.Func, s, off))
v.AddArg(sb)
return true
}