aboutsummaryrefslogtreecommitdiffstats
path: root/sys/align.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2016-09-29 13:28:03 +0200
committerDmitry Vyukov <dvyukov@google.com>2016-09-29 13:30:08 +0200
commit3ca39dfc4dd8a2dda5b3a9b8c29e295839490af3 (patch)
treed3f4161d07c22e4a08eb0d3edfd61b485ef10579 /sys/align.go
parentbf21057e7c36c72c1b46aa71bea8dc48509d4c40 (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.go50
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 {