summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2022-08-10 14:11:58 -0300
committermrb0nk500 <b0nk@b0nk.xyz>2022-08-10 14:13:00 -0300
commit83c37a9e9de61247f6e5deb618e090cf6b9df952 (patch)
tree1004692c0b472f883b979c9f144c95f7770ecdee
parent5a4486abfe37c0969b888d2c6fc37b0c7e1eaafb (diff)
rt_struct: Account for packed structs in `create_rts()`
-rw-r--r--rt_struct.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/rt_struct.c b/rt_struct.c
index b4840ac..c309883 100644
--- a/rt_struct.c
+++ b/rt_struct.c
@@ -50,8 +50,6 @@ int create_rts(rts_type *type) {
} else {
size_t offset = 0;
size_t max_align = 0;
- size_t remainder = 0;
- size_t padding = 0;
const int num_members = member_count(type);
rts_member **members = type->members;
@@ -68,18 +66,23 @@ int create_rts(rts_type *type) {
const size_t align = member_type->alignment;
max_align = max(max_align, align);
if (type->tag == TAG_STRUCT) {
- remainder = offset % align;
- padding = (remainder) ? align - remainder : 0;
- offset += padding;
+ if (!type->is_packed) {
+ const size_t remainder = offset % align;
+ const size_t padding = (remainder) ? align - remainder : 0;
+ offset += padding;
+ }
type->offsets[i] = offset;
offset += member_size(members[i]);
}
}
}
- type->alignment = max_align;
- remainder = offset % max_align;
- padding = (remainder) ? max_align - remainder : 0;
- type->size = offset + padding;
+ if (!type->is_packed) {
+ const size_t remainder = offset % max_align;
+ const size_t padding = (remainder) ? max_align - remainder : 0;
+ offset += padding;
+ }
+ type->alignment = (!type->is_packed) ? max_align : 0;
+ type->size = offset;
return 0;
}
}