Improve signature_parameter_similar_enough for structs

This commit is contained in:
gingerBill
2025-09-30 10:47:31 +01:00
parent 748b4cdc6b
commit 668df4a571

View File

@@ -853,10 +853,40 @@ gb_internal bool signature_parameter_similar_enough(Type *x, Type *y) {
Type *x_base = base_type(x);
Type *y_base = base_type(y);
if (x_base->kind == y_base->kind && x_base->kind == Type_Struct) {
return type_size_of(x_base) == type_size_of(y_base) && type_align_of(x_base) == type_align_of(y_base);
if (x_base->kind == y_base->kind &&
x_base->kind == Type_Struct) {
i64 xs = type_size_of(x_base);
i64 ys = type_size_of(y_base);
i64 xa = type_align_of(x_base);
i64 ya = type_align_of(y_base);
if (x_base->Struct.is_raw_union == y_base->Struct.is_raw_union &&
xs == ys && xa == ya) {
if (xs > 16) {
// @@ABI NOTE(bill): Just allow anything over 16-bytes to be allowed, because on all current ABIs
// it will be passed by point
// NOTE(bill): this must be changed when ABI changes
return true;
}
if (x->Struct.fields.count == y->Struct.fields.count) {
for (isize i = 0; i < x->Struct.fields.count; i++) {
Entity *a = x->Struct.fields[i];
Entity *b = y->Struct.fields[i];
bool similar = signature_parameter_similar_enough(a->type, b->type);
if (!similar) {
// NOTE(bill): If the fields are not similar enough, then stop.
goto end;
}
}
}
// HACK NOTE(bill): Allow this for the time begin until it actually becomes a practical problem
return true;
}
}
end:;
return are_types_identical(x, y);
}