diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2020-05-01 17:19:27 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2020-05-02 12:16:06 +0200 |
| commit | 58da4c35b15200b7279f18ea15bc8644618aae78 (patch) | |
| tree | 412d59572c980c4eb582d6d0e187eb6ec32345c9 /prog/any.go | |
| parent | bc734e7ada413654f1b7d948b2a857260a52dd9c (diff) | |
prog: introduce Field type
Remvoe FieldName from Type and add a separate Field type
that holds field name. Use Field for struct fields, union options
and syscalls arguments, only these really have names.
Reduces size of sys/linux/gen/amd64.go from 5665583 to 5201321 (-8.2%).
Allows to not create new type for squashed any pointer.
But main advantages will follow, e.g. removing StructDesc,
using TypeRef in Arg, etc.
Update #1580
Diffstat (limited to 'prog/any.go')
| -rw-r--r-- | prog/any.go | 70 |
1 files changed, 25 insertions, 45 deletions
diff --git a/prog/any.go b/prog/any.go index 6e90698b9..1ce444ce2 100644 --- a/prog/any.go +++ b/prog/any.go @@ -36,13 +36,10 @@ type anyTypes struct { // resoct fmt[oct, ANYRES64] // ] [varlen] func initAnyTypes(target *Target) { - target.any.union = &UnionType{ - FldName: "ANYUNION", - } + target.any.union = &UnionType{} target.any.array = &ArrayType{ TypeCommon: TypeCommon{ TypeName: "ANYARRAY", - FldName: "ANYARRAY", IsVarlen: true, }, Elem: target.any.union, @@ -50,7 +47,6 @@ func initAnyTypes(target *Target) { target.any.ptrPtr = &PtrType{ TypeCommon: TypeCommon{ TypeName: "ANYPTR", - FldName: "ANYPTR", TypeSize: target.PtrSize, IsOptional: true, }, @@ -60,7 +56,6 @@ func initAnyTypes(target *Target) { target.any.ptr64 = &PtrType{ TypeCommon: TypeCommon{ TypeName: "ANYPTR64", - FldName: "ANYPTR64", TypeSize: 8, IsOptional: true, }, @@ -70,7 +65,6 @@ func initAnyTypes(target *Target) { target.any.blob = &BufferType{ TypeCommon: TypeCommon{ TypeName: "ANYBLOB", - FldName: "ANYBLOB", IsVarlen: true, }, } @@ -78,7 +72,6 @@ func initAnyTypes(target *Target) { return &ResourceType{ TypeCommon: TypeCommon{ TypeName: name, - FldName: name, TypeSize: size, IsOptional: true, }, @@ -99,37 +92,27 @@ func initAnyTypes(target *Target) { target.any.union.StructDesc = &StructDesc{ TypeCommon: TypeCommon{ TypeName: "ANYUNION", - FldName: "ANYUNION", IsVarlen: true, }, - Fields: []Type{ - target.any.blob, - target.any.res16, - target.any.res32, - target.any.res64, - target.any.resdec, - target.any.reshex, - target.any.resoct, + Fields: []Field{ + {Name: "ANYBLOB", Type: target.any.blob}, + {Name: "ANYRES16", Type: target.any.res16}, + {Name: "ANYRES32", Type: target.any.res32}, + {Name: "ANYRES64", Type: target.any.res64}, + {Name: "ANYRESDEC", Type: target.any.resdec}, + {Name: "ANYRESHEX", Type: target.any.reshex}, + {Name: "ANYRESOCT", Type: target.any.resoct}, }, } } -func (target *Target) makeAnyPtrType(size uint64, field string) *PtrType { - // We need to make a copy because type holds field name, - // and field names are used as len target. - var typ PtrType +func (target *Target) getAnyPtrType(size uint64) *PtrType { if size == target.PtrSize { - typ = *target.any.ptrPtr + return target.any.ptrPtr } else if size == 8 { - typ = *target.any.ptr64 - } else { - panic(fmt.Sprintf("bad pointer size %v", size)) - } - typ.TypeSize = size - if field != "" { - typ.FldName = field + return target.any.ptr64 } - return &typ + panic(fmt.Sprintf("bad pointer size %v", size)) } func (target *Target) isAnyPtr(typ Type) bool { @@ -204,7 +187,7 @@ func (target *Target) ArgContainsAny(arg0 Arg) (res bool) { return } -func (target *Target) squashPtr(arg *PointerArg, preserveField bool) { +func (target *Target) squashPtr(arg *PointerArg) { if arg.Res == nil || arg.VmaSize != 0 { panic("bad ptr arg") } @@ -212,11 +195,7 @@ func (target *Target) squashPtr(arg *PointerArg, preserveField bool) { size0 := res0.Size() var elems []Arg target.squashPtrImpl(arg.Res, &elems) - field := "" - if preserveField { - field = arg.Type().FieldName() - } - arg.typ = target.makeAnyPtrType(arg.Type().Size(), field) + arg.typ = target.getAnyPtrType(arg.Type().Size()) arg.Res = MakeGroupArg(arg.typ.(*PtrType).Elem, DirIn, elems) if size := arg.Res.Size(); size != size0 { panic(fmt.Sprintf("squash changed size %v->%v for %v", size0, size, res0.Type())) @@ -287,29 +266,30 @@ func (target *Target) squashConst(arg *ConstArg, elems *[]Arg) { } func (target *Target) squashResult(arg *ResultArg, elems *[]Arg) { + index := -1 switch arg.Type().Format() { case FormatNative, FormatBigEndian: switch arg.Size() { case 2: - arg.typ = target.any.res16 + arg.typ, index = target.any.res16, 1 case 4: - arg.typ = target.any.res32 + arg.typ, index = target.any.res32, 2 case 8: - arg.typ = target.any.res64 + arg.typ, index = target.any.res64, 3 default: panic("bad size") } case FormatStrDec: - arg.typ = target.any.resdec + arg.typ, index = target.any.resdec, 4 case FormatStrHex: - arg.typ = target.any.reshex + arg.typ, index = target.any.reshex, 5 case FormatStrOct: - arg.typ = target.any.resoct + arg.typ, index = target.any.resoct, 6 default: panic("bad") } arg.dir = DirIn - *elems = append(*elems, MakeUnionArg(target.any.union, DirIn, arg)) + *elems = append(*elems, MakeUnionArg(target.any.union, DirIn, arg, index)) } func (target *Target) squashGroup(arg *GroupArg, elems *[]Arg) { @@ -386,13 +366,13 @@ func (target *Target) squashedValue(arg *ConstArg) (uint64, BinaryFormat) { func (target *Target) ensureDataElem(elems *[]Arg) *DataArg { if len(*elems) == 0 { res := MakeDataArg(target.any.blob, DirIn, nil) - *elems = append(*elems, MakeUnionArg(target.any.union, DirIn, res)) + *elems = append(*elems, MakeUnionArg(target.any.union, DirIn, res, 0)) return res } res, ok := (*elems)[len(*elems)-1].(*UnionArg).Option.(*DataArg) if !ok { res = MakeDataArg(target.any.blob, DirIn, nil) - *elems = append(*elems, MakeUnionArg(target.any.union, DirIn, res)) + *elems = append(*elems, MakeUnionArg(target.any.union, DirIn, res, 0)) } return res } |
