From 3ca39dfc4dd8a2dda5b3a9b8c29e295839490af3 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Thu, 29 Sep 2016 13:28:03 +0200 Subject: sys: add padding to structs again Struct padding was accidentially lost after: 852e3d2eae98a913b7ec91822ba4dc61059a6955 Restore it. Now with tests. Fixes #78 --- sys/align.go | 50 +++++++++++++++++--------------------------------- 1 file changed, 17 insertions(+), 33 deletions(-) (limited to 'sys/align.go') diff --git a/sys/align.go b/sys/align.go index 4c91c28be..6e8563da4 100644 --- a/sys/align.go +++ b/sys/align.go @@ -3,51 +3,37 @@ package sys -import ( - "fmt" -) - func initAlign() { - var rec func(t Type) Type - rec = func(t Type) Type { + var rec func(t Type) + rec = func(t Type) { switch t1 := t.(type) { case PtrType: - t1.Type = rec(t1.Type) - t = t1 + rec(t1.Type) case ArrayType: - t1.Type = rec(t1.Type) - t = t1 + rec(t1.Type) case *StructType: - for i, f := range t1.Fields { - t1.Fields[i] = rec(f) + if !t1.padded { + t1.padded = true + for _, f := range t1.Fields { + rec(f) + } + addAlignment(t1) } - t = addAlignment(t1) case *UnionType: - opts := make(map[string]bool) - for i, opt := range t1.Options { - if opts[opt.Name()] { - panic(fmt.Sprintf("duplicate option %v in union %v", opt.Name(), t.Name())) - } - opts[opt.Name()] = true - t1.Options[i] = rec(opt) + for _, opt := range t1.Options { + rec(opt) } } - return t } - for _, c := range Calls { - for i, t := range c.Args { - c.Args[i] = rec(t) - } - if c.Ret != nil { - c.Ret = rec(c.Ret) - } + + for _, s := range Structs { + rec(s) } } -func addAlignment(t *StructType) Type { +func addAlignment(t *StructType) { if t.packed { - t.padded = true - return t + return } var fields []Type var off, align uintptr @@ -77,8 +63,6 @@ func addAlignment(t *StructType) Type { fields = append(fields, makePad(pad)) } t.Fields = fields - t.padded = true - return t } func makePad(sz uintptr) Type { -- cgit mrf-deployment