aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pkg/compiler/gen.go13
-rw-r--r--pkg/compiler/types.go17
-rw-r--r--sys/test/test/align32
-rw-r--r--tools/syz-declextract/testdata/types.c3
-rw-r--r--tools/syz-declextract/testdata/types.c.json12
-rw-r--r--tools/syz-declextract/testdata/types.c.txt6
6 files changed, 33 insertions, 20 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
}
}
diff --git a/sys/test/test/align3 b/sys/test/test/align3
index 7a6331c99..00ba25576 100644
--- a/sys/test/test/align3
+++ b/sys/test/test/align3
@@ -1,4 +1,4 @@
# 32 has 4-byte alignment for int64 and everything goes havoc.
# requires: -arch=32 -bigendian
-syz_compare(&AUTO="00000000000000000199999999999999990300000000000000009999999999999999000000000000", AUTO, &AUTO=@align3={{0x0}, 0x1, {{0x2}}, 0x3, [{{0x4}}, {{0x5}}]}, AUTO)
+syz_compare(&AUTO="000000000000000001000000000000009999999999999999030000000000000000000000000000009999999999999999", AUTO, &AUTO=@align3={{0x0}, 0x1, {{0x2}}, 0x3, [{{0x4}}, {{0x5}}]}, AUTO)
diff --git a/tools/syz-declextract/testdata/types.c b/tools/syz-declextract/testdata/types.c
index 014318d42..7a98394c1 100644
--- a/tools/syz-declextract/testdata/types.c
+++ b/tools/syz-declextract/testdata/types.c
@@ -46,8 +46,7 @@ struct various {
};
struct recursive {
- // This is not handled properly yet.
- // struct various various;
+ struct various various;
};
SYSCALL_DEFINE1(types_syscall, struct anon_struct* p, struct empty_struct* y,
diff --git a/tools/syz-declextract/testdata/types.c.json b/tools/syz-declextract/testdata/types.c.json
index 99d0adc2b..6c479dffb 100644
--- a/tools/syz-declextract/testdata/types.c.json
+++ b/tools/syz-declextract/testdata/types.c.json
@@ -758,7 +758,17 @@
},
{
"name": "recursive",
- "align": 1
+ "byte_size": 64,
+ "align": 32,
+ "fields": [
+ {
+ "name": "various",
+ "counted_by": -1,
+ "type": {
+ "struct": "various"
+ }
+ }
+ ]
},
{
"name": "various",
diff --git a/tools/syz-declextract/testdata/types.c.txt b/tools/syz-declextract/testdata/types.c.txt
index ea95b4bb5..085aee017 100644
--- a/tools/syz-declextract/testdata/types.c.txt
+++ b/tools/syz-declextract/testdata/types.c.txt
@@ -97,9 +97,13 @@ packed_t$auto {
y int32
} [packed, align[32]]
+recursive$auto {
+ various various$auto
+}
+
various$auto {
recursive ptr[inout, various$auto, opt]
- next ptr[inout, auto_aligner[1], opt]
+ next ptr[inout, recursive$auto, opt]
packed packed_t$auto
}