aboutsummaryrefslogtreecommitdiff
path: root/src/ir_print.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-01-12 13:43:45 +0000
committergingerBill <bill@gingerbill.org>2020-01-12 13:43:45 +0000
commitba85e432e77eec502a00a0bfc3c4b8b30dfb8f32 (patch)
tree8cb87349a5a5719eb9cb14f76e4f1832c11b575e /src/ir_print.cpp
parentcfba29002a60a96633e94ebd0cd5899e960d2dc0 (diff)
Fix Proc Type ABI printing on System V
Diffstat (limited to 'src/ir_print.cpp')
-rw-r--r--src/ir_print.cpp63
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, ' ');