if sz != int64(int32(sz)) {
base.Fatalf("stack object too big: %v of type %v, size %d", v, t, sz)
}
- lsym, ptrBytes := reflectdata.GCSym(t)
+ lsym, ptrBytes := reflectdata.GCSym(t, false)
off = objw.Uint32(x, off, uint32(sz))
off = objw.Uint32(x, off, uint32(ptrBytes))
off = objw.SymPtrOff(x, off, lsym)
// GC information is always a bitmask, never a gc program.
// GCSym may be called in concurrent backend, so it does not emit the symbol
// content.
-func GCSym(t *types.Type) (lsym *obj.LSym, ptrdata int64) {
+func GCSym(t *types.Type, onDemandAllowed bool) (lsym *obj.LSym, ptrdata int64) {
// Record that we need to emit the GC symbol.
gcsymmu.Lock()
if _, ok := gcsymset[t]; !ok {
}
gcsymmu.Unlock()
- lsym, _, ptrdata = dgcsym(t, false, false)
+ lsym, _, ptrdata = dgcsym(t, false, onDemandAllowed)
return
}
for _, f := range rttype.Type.Fields() {
if f.Offset == off && copyCompatibleType(v.Type, f.Type) {
switch f.Sym.Name {
- case "Size_", "PtrBytes", "Hash", "Kind_":
+ case "Size_", "PtrBytes", "Hash", "Kind_", "GCData":
return true
default:
// fmt.Println("unknown field", f.Sym.Name)
v.reset(OpConst8)
v.AuxInt = int64(reflectdata.ABIKindOfType(t))
return v
+ case "GCData":
+ gcdata, _ := reflectdata.GCSym(t, true)
+ v.reset(OpAddr)
+ v.Aux = symToAux(gcdata)
+ v.AddArg(sb)
+ return v
default:
base.Fatalf("unknown field %s for fixedLoad of %s at offset %d", f.Sym.Name, lsym.Name, off)
}