diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2016-09-29 13:28:03 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2016-09-29 13:30:08 +0200 |
| commit | 3ca39dfc4dd8a2dda5b3a9b8c29e295839490af3 (patch) | |
| tree | d3f4161d07c22e4a08eb0d3edfd61b485ef10579 /sys/align.go | |
| parent | bf21057e7c36c72c1b46aa71bea8dc48509d4c40 (diff) | |
sys: add padding to structs again
Struct padding was accidentially lost after:
852e3d2eae98a913b7ec91822ba4dc61059a6955
Restore it. Now with tests.
Fixes #78
Diffstat (limited to 'sys/align.go')
| -rw-r--r-- | sys/align.go | 50 |
1 files changed, 17 insertions, 33 deletions
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 { |
