Browse Source

Fix general IR parameter case

gingerBill 5 years ago
parent
commit
abfa894566
2 changed files with 13 additions and 8 deletions
  1. 9 7
      src/check_type.cpp
  2. 4 1
      src/ir.cpp

+ 9 - 7
src/check_type.cpp

@@ -2108,14 +2108,16 @@ Type *type_to_abi_compat_param_type(gbAllocator a, Type *original_type, ProcCall
 			if (8*size > 16) {
 				new_type = alloc_type_pointer(original_type);
 			} else if (build_context.ODIN_ARCH == "amd64") {
-				// NOTE(bill): System V AMD64 ABI
-				if (bt->Struct.is_raw_union) {
-					// TODO(bill): Handle raw union correctly for
-					break;
-				}
+				if (is_type_struct(bt)) {
+					// NOTE(bill): System V AMD64 ABI
+					if (bt->Struct.is_raw_union) {
+						// TODO(bill): Handle raw union correctly for
+						break;
+					}
 
-				new_type = handle_struct_system_v_amd64_abi_type(bt);
-				return new_type;
+					new_type = handle_struct_system_v_amd64_abi_type(bt);
+					return new_type;
+				}
 			}
 
 			break;

+ 4 - 1
src/ir.cpp

@@ -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 *arg_type = ir_type(args[i]);
 		if (are_types_identical(arg_type, new_type)) {
-			array_add(&processed_args, args[i]);
 			// NOTE(bill): Done
+			array_add(&processed_args, args[i]);
 		} else if (!are_types_identical(original_type, new_type)) {
 			if (is_type_pointer(new_type) && !is_type_pointer(original_type)) {
 				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);
 				}
 			}
+		} else {
+			irValue *x = ir_emit_conv(p, args[i], new_type);
+			array_add(&processed_args, x);
 		}
 	}