Fix general IR parameter case

This commit is contained in:
gingerBill
2019-10-10 20:52:07 +01:00
parent 5b52fed268
commit abfa894566
2 changed files with 13 additions and 8 deletions
+2
View File
@@ -2108,6 +2108,7 @@ Type *type_to_abi_compat_param_type(gbAllocator a, Type *original_type, ProcCall
if (8*size > 16) { if (8*size > 16) {
new_type = alloc_type_pointer(original_type); new_type = alloc_type_pointer(original_type);
} else if (build_context.ODIN_ARCH == "amd64") { } else if (build_context.ODIN_ARCH == "amd64") {
if (is_type_struct(bt)) {
// NOTE(bill): System V AMD64 ABI // NOTE(bill): System V AMD64 ABI
if (bt->Struct.is_raw_union) { if (bt->Struct.is_raw_union) {
// TODO(bill): Handle raw union correctly for // TODO(bill): Handle raw union correctly for
@@ -2117,6 +2118,7 @@ Type *type_to_abi_compat_param_type(gbAllocator a, Type *original_type, ProcCall
new_type = handle_struct_system_v_amd64_abi_type(bt); new_type = handle_struct_system_v_amd64_abi_type(bt);
return new_type; return new_type;
} }
}
break; break;
} }
+4 -1
View File
@@ -3061,8 +3061,8 @@ irValue *ir_emit_call(irProcedure *p, irValue *value, Array<irValue *> const &ar
Type *new_type = pt->Proc.abi_compat_params[i]; Type *new_type = pt->Proc.abi_compat_params[i];
Type *arg_type = ir_type(args[i]); Type *arg_type = ir_type(args[i]);
if (are_types_identical(arg_type, new_type)) { if (are_types_identical(arg_type, new_type)) {
array_add(&processed_args, args[i]);
// NOTE(bill): Done // NOTE(bill): Done
array_add(&processed_args, args[i]);
} else if (!are_types_identical(original_type, new_type)) { } else if (!are_types_identical(original_type, new_type)) {
if (is_type_pointer(new_type) && !is_type_pointer(original_type)) { if (is_type_pointer(new_type) && !is_type_pointer(original_type)) {
if (e->flags&EntityFlag_ImplicitReference) { if (e->flags&EntityFlag_ImplicitReference) {
@@ -3085,6 +3085,9 @@ irValue *ir_emit_call(irProcedure *p, irValue *value, Array<irValue *> const &ar
array_add(&processed_args, xx); array_add(&processed_args, xx);
} }
} }
} else {
irValue *x = ir_emit_conv(p, args[i], new_type);
array_add(&processed_args, x);
} }
} }