mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-06 15:48:51 +00:00
Fix #field_align issues, by simplifying the LLVM struct type generation
This commit is contained in:
@@ -2121,11 +2121,13 @@ gb_internal LLVMTypeRef lb_type_internal(lbModule *m, Type *type) {
|
|||||||
array_add(&fields, padding_type);
|
array_add(&fields, padding_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
i64 padding_offset = 0;
|
i64 prev_offset = 0;
|
||||||
for (i32 field_index : struct_fields_index_by_increasing_offset(temporary_allocator(), type)) {
|
for (i32 field_index : struct_fields_index_by_increasing_offset(temporary_allocator(), type)) {
|
||||||
Entity *field = type->Struct.fields[field_index];
|
Entity *field = type->Struct.fields[field_index];
|
||||||
i64 padding = type->Struct.offsets[field_index] - padding_offset;
|
i64 offset = type->Struct.offsets[field_index];
|
||||||
|
GB_ASSERT(offset >= prev_offset);
|
||||||
|
|
||||||
|
i64 padding = offset - prev_offset;
|
||||||
if (padding != 0) {
|
if (padding != 0) {
|
||||||
LLVMTypeRef padding_type = lb_type_padding_filler(m, padding, type_align_of(field->type));
|
LLVMTypeRef padding_type = lb_type_padding_filler(m, padding, type_align_of(field->type));
|
||||||
array_add(&fields, padding_type);
|
array_add(&fields, padding_type);
|
||||||
@@ -2142,13 +2144,10 @@ gb_internal LLVMTypeRef lb_type_internal(lbModule *m, Type *type) {
|
|||||||
|
|
||||||
array_add(&fields, lb_type(m, field_type));
|
array_add(&fields, lb_type(m, field_type));
|
||||||
|
|
||||||
if (!type->Struct.is_packed) {
|
prev_offset = offset + type_size_of(field->type);
|
||||||
padding_offset = align_formula(padding_offset, type_align_of(field->type));
|
|
||||||
}
|
|
||||||
padding_offset += type_size_of(field->type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
i64 end_padding = full_type_size-padding_offset;
|
i64 end_padding = full_type_size-prev_offset;
|
||||||
if (end_padding > 0) {
|
if (end_padding > 0) {
|
||||||
array_add(&fields, lb_type_padding_filler(m, end_padding, 1));
|
array_add(&fields, lb_type_padding_filler(m, end_padding, 1));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user