aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2019-10-10 20:52:07 +0100
committergingerBill <bill@gingerbill.org>2019-10-10 20:52:07 +0100
commitabfa8945661f24006e4f8506c1ec2861569228ec (patch)
tree3012c0c67b514f0b8b4eb34aa9fbb76feaf92e60 /src
parent5b52fed268b3544bea562f4263d447b96ebacd3a (diff)
Fix general IR parameter case
Diffstat (limited to 'src')
-rw-r--r--src/check_type.cpp16
-rw-r--r--src/ir.cpp5
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);
}
}