Browse Source

fix packed gep loads with wrong alignment

Laytan 1 year ago
parent
commit
d93cc18dac
2 changed files with 6 additions and 0 deletions
  1. 2 0
      src/check_type.cpp
  2. 4 0
      src/types.cpp

+ 2 - 0
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) {

+ 4 - 0
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();
 	}