aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2016-11-14 06:53:36 +0100
committerDmitry Vyukov <dvyukov@google.com>2016-11-14 06:53:36 +0100
commitb4dffbd5bed3193aed9fc5f89dc163c22c9514d2 (patch)
treee418af02a14c6f133a422a04d7b62fcc880ce1c3
parentd0146e983c25f3614e06561c0bf34c1d1aa70f33 (diff)
sysparser: support larger struct alignments
No reason to support only 1/2/4/8. Some structs need to be page aligned.
-rw-r--r--sysparser/lexer.go22
1 files changed, 12 insertions, 10 deletions
diff --git a/sysparser/lexer.go b/sysparser/lexer.go
index a3b8f58ed..57a474cf8 100644
--- a/sysparser/lexer.go
+++ b/sysparser/lexer.go
@@ -8,6 +8,7 @@ import (
"io"
"os"
"sort"
+ "strconv"
"strings"
)
@@ -72,17 +73,18 @@ func Parse(in io.Reader) *Description {
failf("unknown union %v attribute: %v", str.Name, attr)
}
} else {
- switch attr {
- case "packed":
+ switch {
+ case attr == "packed":
str.Packed = true
- case "align_1":
- str.Align = 1
- case "align_2":
- str.Align = 2
- case "align_4":
- str.Align = 4
- case "align_8":
- str.Align = 8
+ case strings.HasPrefix(attr, "align_"):
+ a, err := strconv.ParseUint(attr[6:], 10, 64)
+ if err != nil {
+ failf("bad struct %v alignment %v: %v", str.Name, attr, err)
+ }
+ if a&(a-1) != 0 || a == 0 || a > 1<<30 {
+ failf("bad struct %v alignment %v: must be sane power of 2", str.Name, a)
+ }
+ str.Align = int(a)
default:
failf("unknown struct %v attribute: %v", str.Name, attr)
}