diff options
Diffstat (limited to 'pkg')
| -rw-r--r-- | pkg/compiler/gen.go | 13 | ||||
| -rw-r--r-- | pkg/compiler/types.go | 17 |
2 files changed, 15 insertions, 15 deletions
diff --git a/pkg/compiler/gen.go b/pkg/compiler/gen.go index 81e8f83bc..688dd7013 100644 --- a/pkg/compiler/gen.go +++ b/pkg/compiler/gen.go @@ -264,9 +264,13 @@ func (comp *compiler) layoutArray(t *prog.ArrayType) { if t.Kind == prog.ArrayRangeLen && t.RangeBegin == t.RangeEnd && !t.Elem.Varlen() { t.TypeSize = t.RangeBegin * t.Elem.Size() } + t.TypeAlign = t.Elem.Alignment() } func (comp *compiler) layoutUnion(t *prog.UnionType) { + for _, fld := range t.Fields { + t.TypeAlign = max(t.TypeAlign, fld.Alignment()) + } t.TypeSize = 0 structNode := comp.structs[t.TypeName] if structNode == conditionalFieldWrapper { @@ -303,6 +307,15 @@ func (comp *compiler) layoutStruct(t *prog.StructType) { attrs := comp.parseIntAttrs(structAttrs, structNode, structNode.Attrs) t.AlignAttr = attrs[attrAlign] comp.layoutStructFields(t, varlen, attrs[attrPacked] != 0) + if align := attrs[attrAlign]; align != 0 { + t.TypeAlign = align + } else if attrs[attrPacked] != 0 { + t.TypeAlign = 1 + } else { + for _, f := range t.Fields { + t.TypeAlign = max(t.TypeAlign, f.Alignment()) + } + } t.TypeSize = 0 if !varlen { var size uint64 diff --git a/pkg/compiler/types.go b/pkg/compiler/types.go index ae0864725..e022efafe 100644 --- a/pkg/compiler/types.go +++ b/pkg/compiler/types.go @@ -358,8 +358,7 @@ var typeArray = &typeDesc{ NoZ: true, } } - // TypeSize is assigned later in layoutArray. - base.TypeAlign = elemType.Alignment() + // TypeSize/TypeAlign are assigned later in layoutArray. return &prog.ArrayType{ TypeCommon: base.TypeCommon, Elem: elemType, @@ -1006,9 +1005,6 @@ func init() { switch typ1 := typ.(type) { case *prog.UnionType: typ1.Fields = fields - for _, f := range fields { - typ1.TypeAlign = max(typ1.TypeAlign, f.Type.Alignment()) - } case *prog.StructType: typ1.Fields = fields for i, field := range fields { @@ -1019,17 +1015,8 @@ func init() { if overlayField >= 0 { typ1.OverlayField = overlayField } - attrs := comp.parseIntAttrs(structAttrs, s, s.Attrs) - if align := attrs[attrAlign]; align != 0 { - typ1.TypeAlign = align - } else if attrs[attrPacked] != 0 { - typ1.TypeAlign = 1 - } else { - for _, f := range fields { - typ1.TypeAlign = max(typ1.TypeAlign, f.Type.Alignment()) - } - } } + // TypeSize/TypeAlign are assigned later in layoutStruct. return typ } } |
