diff options
| author | gingerBill <bill@gingerbill.org> | 2019-10-10 20:52:07 +0100 |
|---|---|---|
| committer | gingerBill <bill@gingerbill.org> | 2019-10-10 20:52:07 +0100 |
| commit | abfa8945661f24006e4f8506c1ec2861569228ec (patch) | |
| tree | 3012c0c67b514f0b8b4eb34aa9fbb76feaf92e60 /src | |
| parent | 5b52fed268b3544bea562f4263d447b96ebacd3a (diff) | |
Fix general IR parameter case
Diffstat (limited to 'src')
| -rw-r--r-- | src/check_type.cpp | 16 | ||||
| -rw-r--r-- | src/ir.cpp | 5 |
2 files changed, 13 insertions, 8 deletions
diff --git a/src/check_type.cpp b/src/check_type.cpp index fe5825c47..89ee15666 100644 --- a/src/check_type.cpp +++ b/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; diff --git a/src/ir.cpp b/src/ir.cpp index 16a017407..017a12025 100644 --- a/src/ir.cpp +++ b/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); } } |