From 43ba2c6226dc71754c7aa74ed8ecb150231a9624 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Wed, 21 Jun 2023 12:10:07 +0100 Subject: Fix constant parameter passing --- src/llvm_backend_proc.cpp | 44 +++++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 17 deletions(-) (limited to 'src/llvm_backend_proc.cpp') diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp index fc58d584e..0beaf376b 100644 --- a/src/llvm_backend_proc.cpp +++ b/src/llvm_backend_proc.cpp @@ -3168,10 +3168,13 @@ gb_internal lbValue lb_build_call_expr_internal_with_arg_split_args(lbProcedure if (e->kind == Entity_TypeName) { array_add(&args, lb_const_nil(p->module, e->type)); continue; - } else if (e->kind != Entity_Variable) { + } else if (e->kind == Entity_Constant) { + array_add(&args, lb_const_value(p->module, e->type, e->Constant.value)); continue; } + GB_ASSERT(e->kind == Entity_Variable); + if (pt->variadic && pt->variadic_index == i) { lbValue variadic_args = lb_const_nil(p->module, e->type); auto variadic = slice(split_args->positional, pt->variadic_index, split_args->positional.count); @@ -3238,23 +3241,30 @@ gb_internal lbValue lb_build_call_expr_internal_with_arg_split_args(lbProcedure TokenPos pos = ast_token(ce->proc).pos; - for_array(i, args) { - Entity *e = pt->params->Tuple.variables[i]; - lbValue arg = args[i]; - if (arg.value == nullptr) { - switch (e->kind) { - case Entity_TypeName: - args[i] = lb_const_nil(p->module, e->type); - break; - case Entity_Variable: - args[i] = lb_handle_param_value(p, e->type, e->Variable.param_value, pos); - break; - case Entity_Constant: - args[i] = lb_handle_param_value(p, e->type, e->Constant.param_value, pos); - break; + + if (pt->params != nullptr) { + for_array(arg_index, pt->params->Tuple.variables) { + Entity *e = pt->params->Tuple.variables[arg_index]; + + lbValue arg = args[arg_index]; + if (arg.value == nullptr) { + switch (e->kind) { + case Entity_TypeName: + args[arg_index] = lb_const_nil(p->module, e->type); + break; + case Entity_Variable: + args[arg_index] = lb_handle_param_value(p, e->type, e->Variable.param_value, pos); + break; + + case Entity_Constant: + args[arg_index] = lb_const_value(p->module, e->type, e->Constant.value); + break; + default: + GB_PANIC("Unknown entity kind %.*s\n", LIT(entity_strings[e->kind])); + } + } else { + args[arg_index] = lb_emit_conv(p, arg, e->type); } - } else { - args[i] = lb_emit_conv(p, arg, e->type); } } -- cgit v1.2.3