diff --git a/src/cmd/compile/internal/reflectdata/reflect.go b/src/cmd/compile/internal/reflectdata/reflect.go index c561d527a7d..2849d4ee40f 100644 --- a/src/cmd/compile/internal/reflectdata/reflect.go +++ b/src/cmd/compile/internal/reflectdata/reflect.go @@ -414,6 +414,10 @@ var kinds = []abi.Kind{ types.TUNSAFEPTR: abi.UnsafePointer, } +func ABIKindOfType(t *types.Type) abi.Kind { + return kinds[t.Kind()] +} + var ( memhashvarlen *obj.LSym memequalvarlen *obj.LSym @@ -512,8 +516,7 @@ func dcommontype(c rttype.Cursor, t *types.Type) { c.Field("Align_").WriteUint8(uint8(t.Alignment())) c.Field("FieldAlign_").WriteUint8(uint8(t.Alignment())) - kind := kinds[t.Kind()] - c.Field("Kind_").WriteUint8(uint8(kind)) + c.Field("Kind_").WriteUint8(uint8(ABIKindOfType(t))) c.Field("Equal").WritePtr(eqfunc) c.Field("GCData").WritePtr(gcsym) diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index bc66c91a35d..576f25a497d 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -2005,7 +2005,7 @@ func isFixedLoad(v *Value, sym Sym, off int64) bool { for _, f := range rttype.Type.Fields() { if f.Offset == off && copyCompatibleType(v.Type, f.Type) { switch f.Sym.Name { - case "Hash": + case "Size_", "PtrBytes", "Hash", "Kind_": return true default: // fmt.Println("unknown field", f.Sym.Name) @@ -2061,13 +2061,30 @@ func rewriteFixedLoad(v *Value, sym Sym, sb *Value, off int64) *Value { t := (*lsym.Extra).(*obj.TypeInfo).Type.(*types.Type) + ptrSizedOpConst := OpConst64 + if f.Config.PtrSize == 4 { + ptrSizedOpConst = OpConst32 + } + for _, f := range rttype.Type.Fields() { if f.Offset == off && copyCompatibleType(v.Type, f.Type) { switch f.Sym.Name { + case "Size_": + v.reset(ptrSizedOpConst) + v.AuxInt = int64(t.Size()) + return v + case "PtrBytes": + v.reset(ptrSizedOpConst) + v.AuxInt = int64(types.PtrDataSize(t)) + return v case "Hash": v.reset(OpConst32) v.AuxInt = int64(types.TypeHash(t)) return v + case "Kind_": + v.reset(OpConst8) + v.AuxInt = int64(reflectdata.ABIKindOfType(t)) + return v default: base.Fatalf("unknown field %s for fixedLoad of %s at offset %d", f.Sym.Name, lsym.Name, off) }