From 712744ef367045f21c017137ad1856dca8814e7b Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 14 Mar 2019 23:41:48 +0000 Subject: Fix `ir_copy_value_to_ptr` usage in `ir_emit_call` #350 --- src/ir.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'src/ir.cpp') diff --git a/src/ir.cpp b/src/ir.cpp index 0d5e3fc36..0d9a165cf 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -2875,12 +2875,12 @@ irValue *ir_copy_value_to_ptr(irProcedure *proc, irValue *val, Type *new_type, i if (alignment < type_alignment) { alignment = type_alignment; } + GB_ASSERT_MSG(are_types_identical(new_type, ir_type(val)), "%s %s", type_to_string(new_type), type_to_string(ir_type(val))); + irValue *ptr = ir_add_local_generated(proc, new_type, false); ptr->Instr.Local.alignment = alignment; ir_emit_store(proc, ptr, val); - if (val) val->uses += 1; - return ptr; } @@ -2972,12 +2972,18 @@ irValue *ir_emit_call(irProcedure *p, irValue *value, Array args, Pro Type *original_type = e->type; Type *new_type = pt->Proc.abi_compat_params[i]; - if (original_type != new_type) { + if (!are_types_identical(original_type, new_type)) { + Type *arg_type = ir_type(args[i]); + if (is_type_pointer(new_type)) { if (e->flags&EntityFlag_Value) { args[i] = ir_address_from_load_or_generate_local(p, args[i]); } else { - args[i] = ir_copy_value_to_ptr(p, args[i], original_type, 16); + if (is_type_pointer(arg_type)) { + args[i] = ir_copy_value_to_ptr(p, ir_emit_load(p, args[i]), original_type, 16); + } else { + args[i] = ir_copy_value_to_ptr(p, args[i], original_type, 16); + } } } else if (is_type_integer(new_type)) { args[i] = ir_emit_transmute(p, args[i], new_type); -- cgit v1.2.3 From 3d86fc2f2f4577c5eb708f7519d7f908a1d9d5bc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 15 Mar 2019 15:41:06 +0000 Subject: Minor adjustments --- src/ir.cpp | 4 ++-- src/main.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'src/ir.cpp') diff --git a/src/ir.cpp b/src/ir.cpp index 0d9a165cf..6d44282be 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -2975,12 +2975,12 @@ irValue *ir_emit_call(irProcedure *p, irValue *value, Array args, Pro if (!are_types_identical(original_type, new_type)) { Type *arg_type = ir_type(args[i]); - if (is_type_pointer(new_type)) { + if (is_type_pointer(new_type) && !is_type_pointer(original_type)) { if (e->flags&EntityFlag_Value) { args[i] = ir_address_from_load_or_generate_local(p, args[i]); } else { if (is_type_pointer(arg_type)) { - args[i] = ir_copy_value_to_ptr(p, ir_emit_load(p, args[i]), original_type, 16); + // args[i] = ir_copy_value_to_ptr(p, ir_emit_load(p, args[i]), original_type, 16); } else { args[i] = ir_copy_value_to_ptr(p, args[i], original_type, 16); } diff --git a/src/main.cpp b/src/main.cpp index 83397fa48..b73d9585f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -299,7 +299,7 @@ bool parse_build_flags(Array args) { add_flag(&build_flags, BuildFlag_NoCRT, str_lit("no-crt"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_UseLLD, str_lit("lld"), BuildFlagParam_None); add_flag(&build_flags, BuildFlag_Vet, str_lit("vet"), BuildFlagParam_None); - add_flag(&build_flags, BuildFlag_IgnoreUnknownAttributes, str_lit("-ignore-unknown-attributes"), BuildFlagParam_None); + add_flag(&build_flags, BuildFlag_IgnoreUnknownAttributes, str_lit("ignore-unknown-attributes"), BuildFlagParam_None); #if defined(GB_SYSTEM_WINDOWS) add_flag(&build_flags, BuildFlag_ResourceFile, str_lit("resource"), BuildFlagParam_String); -- cgit v1.2.3 From 885c5dc8b75dd88d376627195a5468d12264bcc5 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 15 Mar 2019 16:39:49 +0000 Subject: Fix issue with `deferred_*` attributes --- src/checker.cpp | 8 ++++---- src/ir.cpp | 14 ++++++-------- 2 files changed, 10 insertions(+), 12 deletions(-) (limited to 'src/ir.cpp') diff --git a/src/checker.cpp b/src/checker.cpp index 0253bc86b..8e8afc621 100644 --- a/src/checker.cpp +++ b/src/checker.cpp @@ -2005,7 +2005,7 @@ DECL_ATTRIBUTE_PROC(proc_decl_attribute) { if (value != nullptr) { Operand o = {}; check_expr(c, &o, value); - Entity *e = entity_of_ident(o.expr); + Entity *e = entity_of_node(o.expr); if (e != nullptr && e->kind == Entity_Procedure) { warning(elem, "'%.*s' is deprecated, please use one of the following instead: 'deferred_none', 'deferred_in', 'deferred_out'", LIT(name)); if (ac->deferred_procedure.entity != nullptr) { @@ -2022,7 +2022,7 @@ DECL_ATTRIBUTE_PROC(proc_decl_attribute) { if (value != nullptr) { Operand o = {}; check_expr(c, &o, value); - Entity *e = entity_of_ident(o.expr); + Entity *e = entity_of_node(o.expr); if (e != nullptr && e->kind == Entity_Procedure) { ac->deferred_procedure.kind = DeferredProcedure_none; ac->deferred_procedure.entity = e; @@ -2035,7 +2035,7 @@ DECL_ATTRIBUTE_PROC(proc_decl_attribute) { if (value != nullptr) { Operand o = {}; check_expr(c, &o, value); - Entity *e = entity_of_ident(o.expr); + Entity *e = entity_of_node(o.expr); if (e != nullptr && e->kind == Entity_Procedure) { if (ac->deferred_procedure.entity != nullptr) { error(elem, "Previous usage of a 'deferred_*' attribute"); @@ -2051,7 +2051,7 @@ DECL_ATTRIBUTE_PROC(proc_decl_attribute) { if (value != nullptr) { Operand o = {}; check_expr(c, &o, value); - Entity *e = entity_of_ident(o.expr); + Entity *e = entity_of_node(o.expr); if (e != nullptr && e->kind == Entity_Procedure) { if (ac->deferred_procedure.entity != nullptr) { error(elem, "Previous usage of a 'deferred_*' attribute"); diff --git a/src/ir.cpp b/src/ir.cpp index 6d44282be..6631711b5 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -2972,18 +2972,16 @@ irValue *ir_emit_call(irProcedure *p, irValue *value, Array args, Pro Type *original_type = e->type; Type *new_type = pt->Proc.abi_compat_params[i]; - if (!are_types_identical(original_type, new_type)) { - Type *arg_type = ir_type(args[i]); + Type *arg_type = ir_type(args[i]); + if (are_types_identical(arg_type, new_type)) { + // NOTE(bill): Done + } else if (!are_types_identical(original_type, new_type)) { if (is_type_pointer(new_type) && !is_type_pointer(original_type)) { if (e->flags&EntityFlag_Value) { args[i] = ir_address_from_load_or_generate_local(p, args[i]); - } else { - if (is_type_pointer(arg_type)) { - // args[i] = ir_copy_value_to_ptr(p, ir_emit_load(p, args[i]), original_type, 16); - } else { - args[i] = ir_copy_value_to_ptr(p, args[i], original_type, 16); - } + } else if (!is_type_pointer(arg_type)) { + args[i] = ir_copy_value_to_ptr(p, args[i], original_type, 16); } } else if (is_type_integer(new_type)) { args[i] = ir_emit_transmute(p, args[i], new_type); -- cgit v1.2.3