diff options
Diffstat (limited to 'src/ir_print.cpp')
| -rw-r--r-- | src/ir_print.cpp | 63 |
1 files changed, 49 insertions, 14 deletions
diff --git a/src/ir_print.cpp b/src/ir_print.cpp index f3840fce8..2baf1c2a0 100644 --- a/src/ir_print.cpp +++ b/src/ir_print.cpp @@ -354,7 +354,22 @@ void ir_print_proc_type_without_pointer(irFileBuffer *f, irModule *m, Type *t) { if (i+1 == param_count && t->Proc.c_vararg) { ir_write_string(f, str_lit("...")); } else { - ir_print_type(f, m, t->Proc.abi_compat_params[i]); + Type *et = t->Proc.abi_compat_params[i]; + if (is_type_tuple(et)) { + for_array(j, et->Tuple.variables) { + if (j > 0) ir_write_str_lit(f, ", "); + + ir_print_type(f, m, et->Tuple.variables[j]->type); + if (e->flags&EntityFlag_NoAlias) { + ir_write_str_lit(f, " noalias"); + } + ir_write_byte(f, ' '); + param_index++; + } + continue; + } else { + ir_print_type(f, m, et); + } } param_index++; @@ -2111,30 +2126,50 @@ void ir_print_instr(irFileBuffer *f, irModule *m, irValue *value) { TypeTuple *params = &proc_type->Proc.params->Tuple; if (proc_type->Proc.c_vararg) { isize i = 0; + isize arg_index = 0; for (; i < params->variables.count-1; i++) { Entity *e = params->variables[i]; GB_ASSERT(e != nullptr); - if (e->kind != Entity_Variable) continue; + if (e->kind != Entity_Variable) { + arg_index++; + continue; + } if (param_index > 0) ir_write_str_lit(f, ", "); Type *t = proc_type->Proc.abi_compat_params[i]; - ir_print_type(f, m, t); - if (e->flags&EntityFlag_NoAlias) { - ir_write_str_lit(f, " noalias"); - } - if (e->flags&EntityFlag_ImplicitReference) { - ir_write_str_lit(f, " nonnull dereferenceable"); + if (is_type_tuple(t)) { + for_array(j, t->Tuple.variables) { + if (j > 0) ir_write_str_lit(f, ", "); + + irValue *arg = call->args[arg_index++]; + + ir_print_type(f, m, t->Tuple.variables[j]->type); + if (e->flags&EntityFlag_NoAlias) { + ir_write_str_lit(f, " noalias"); + } + ir_write_byte(f, ' '); + ir_print_value(f, m, arg, t); + param_index++; + } + } else { + ir_print_type(f, m, t); + if (e->flags&EntityFlag_NoAlias) { + ir_write_str_lit(f, " noalias"); + } + if (e->flags&EntityFlag_ImplicitReference) { + ir_write_str_lit(f, " nonnull dereferenceable"); + } + ir_write_byte(f, ' '); + irValue *arg = call->args[arg_index++]; + ir_print_value(f, m, arg, t); + param_index++; } - ir_write_byte(f, ' '); - irValue *arg = call->args[i]; - ir_print_value(f, m, arg, t); - param_index++; } - for (; i < call->args.count; i++) { + while (arg_index < call->args.count) { if (param_index > 0) ir_write_str_lit(f, ", "); - irValue *arg = call->args[i]; + irValue *arg = call->args[arg_index]; Type *t = ir_type(arg); ir_print_type(f, m, t); ir_write_byte(f, ' '); |