aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_proc.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2023-06-21 12:10:07 +0100
committergingerBill <bill@gingerbill.org>2023-06-21 12:10:07 +0100
commit43ba2c6226dc71754c7aa74ed8ecb150231a9624 (patch)
treec5fb396e2cc26c62da8005cd537e8e33850fabf8 /src/llvm_backend_proc.cpp
parent735181dc0ec11bdd7293bae01cc07450e5dd788b (diff)
Fix constant parameter passing
Diffstat (limited to 'src/llvm_backend_proc.cpp')
-rw-r--r--src/llvm_backend_proc.cpp44
1 files changed, 27 insertions, 17 deletions
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);
}
}