aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_general.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-03-30 13:06:51 +0000
committergingerBill <bill@gingerbill.org>2024-03-30 13:06:51 +0000
commit9271372fefdd932fee2d18312828bcaf8c7aac94 (patch)
tree88b24bf6eee79dafa15be0b8169e725e0e244db5 /src/llvm_backend_general.cpp
parent4edcaa6124eac5e73359ff98239be6f447a42f47 (diff)
Fix `#field_align` issues, by simplifying the LLVM struct type generation
Diffstat (limited to 'src/llvm_backend_general.cpp')
-rw-r--r--src/llvm_backend_general.cpp17
1 files changed, 8 insertions, 9 deletions
diff --git a/src/llvm_backend_general.cpp b/src/llvm_backend_general.cpp
index 3c6a51bdc..a77e2ad15 100644
--- a/src/llvm_backend_general.cpp
+++ b/src/llvm_backend_general.cpp
@@ -2121,16 +2121,18 @@ gb_internal LLVMTypeRef lb_type_internal(lbModule *m, Type *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)) {
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) {
LLVMTypeRef padding_type = lb_type_padding_filler(m, padding, type_align_of(field->type));
array_add(&fields, padding_type);
}
-
+
field_remapping[field_index] = cast(i32)fields.count;
Type *field_type = field->type;
@@ -2141,14 +2143,11 @@ gb_internal LLVMTypeRef lb_type_internal(lbModule *m, Type *type) {
}
array_add(&fields, lb_type(m, field_type));
-
- if (!type->Struct.is_packed) {
- padding_offset = align_formula(padding_offset, type_align_of(field->type));
- }
- padding_offset += type_size_of(field->type);
+
+ prev_offset = 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) {
array_add(&fields, lb_type_padding_filler(m, end_padding, 1));
}