aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLaytan <laytanlaats@hotmail.com>2024-04-25 00:19:48 +0200
committerLaytan Laats <laytanlaats@hotmail.com>2024-05-07 16:52:46 +0200
commitd93cc18dacf7800972cab91053fc1ed3c68dd34b (patch)
tree0b57fc3031a8a204efaace1762b49d4bb9cbf87c /src
parentecddf3b7f10b02028bf41674c9414b9307f8dae9 (diff)
fix packed gep loads with wrong alignment
Diffstat (limited to 'src')
-rw-r--r--src/check_type.cpp2
-rw-r--r--src/types.cpp4
2 files changed, 6 insertions, 0 deletions
diff --git a/src/check_type.cpp b/src/check_type.cpp
index c119ce6b5..9653a980b 100644
--- a/src/check_type.cpp
+++ b/src/check_type.cpp
@@ -135,6 +135,8 @@ gb_internal void check_struct_fields(CheckerContext *ctx, Ast *node, Slice<Entit
if (is_type_polymorphic(type)) {
struct_type->Struct.is_polymorphic = true;
type = nullptr;
+ } else if(struct_type->Struct.is_packed) {
+ type->flags |= TypeFlag_Packed;
}
}
if (type == nullptr) {
diff --git a/src/types.cpp b/src/types.cpp
index 3ec05059f..55d083a9a 100644
--- a/src/types.cpp
+++ b/src/types.cpp
@@ -321,6 +321,7 @@ enum TypeFlag : u32 {
TypeFlag_Polymorphic = 1<<1,
TypeFlag_PolySpecialized = 1<<2,
TypeFlag_InProcessOfCheckingPolymorphic = 1<<3,
+ TypeFlag_Packed = 1<<4,
};
struct Type {
@@ -3671,6 +3672,9 @@ gb_internal i64 type_align_of(Type *t) {
if (t == nullptr) {
return 1;
}
+ if (t->flags & TypeFlag_Packed) {
+ return 1;
+ }
if (t->kind != Type_Named && t->cached_align > 0) {
return t->cached_align.load();
}