Skip to content

Commit

Permalink
Fix structure alignment
Browse files Browse the repository at this point in the history
  • Loading branch information
yammerjp committed Jul 8, 2020
1 parent f4d6996 commit ae1d68f
Showing 1 changed file with 12 additions and 4 deletions.
16 changes: 12 additions & 4 deletions src/parse/read_type.c
Expand Up @@ -187,19 +187,27 @@ Type *read_new_type_struct(Token **rest, Token *token) {
int offset = 0;
int member_size_max = 0;
while (!equal(token, "}")) {
tail->next = read_member(&token, token, offset);
tail = tail->next;
Member *mem = read_member(&token, token, offset);
Type *base = mem->type;
while (base->kind == TYPE_ARRAY)
base = base->base;
int size = base->size;
offset += ((size - (offset % size))%size); // alignment of structure memory layout for System V ABI
mem->offset = offset;

tail = tail->next = mem;

int size = tail->type->size;
if (size > member_size_max)
member_size_max = size;
offset += ((size - (offset % size))%size) + size; // alignment of structure memory layout for System V ABI
offset += mem->type->size; // alignment of structure memory layout for System V ABI
}
token = token->next;

offset += (member_size_max - (offset%member_size_max))%member_size_max; // alignment of structure memory layout for System V ABI

Type *type = new_type_struct(offset, head.next);


if (name) {
// named struct tag
StructTag *stag = find_stag(name, namelen);
Expand Down

0 comments on commit ae1d68f

Please sign in to comment.