diff options
| author | Ginger Bill <bill@gingerbill.org> | 2017-06-20 12:38:05 +0100 |
|---|---|---|
| committer | Ginger Bill <bill@gingerbill.org> | 2017-06-20 12:38:05 +0100 |
| commit | 5957d7f7bee7e5fac4035d47ecaaaad022adbfb8 (patch) | |
| tree | f8f38496e6691d4d5ea4317d7b7ae3811ab7e4c0 /src/ir_print.cpp | |
| parent | 35c102137f9a097584bf1af39e9809064293a0a3 (diff) | |
Implicit Parameter Passing based `context` system (replacing Thread Local Storage (TLS) approach)
Diffstat (limited to 'src/ir_print.cpp')
| -rw-r--r-- | src/ir_print.cpp | 38 |
1 files changed, 30 insertions, 8 deletions
diff --git a/src/ir_print.cpp b/src/ir_print.cpp index c39fc6acf..a3af21b6d 100644 --- a/src/ir_print.cpp +++ b/src/ir_print.cpp @@ -199,6 +199,12 @@ void ir_print_proc_type_without_pointer(irFileBuffer *f, irModule *m, Type *t) { ir_print_type(f, m, t->Proc.abi_compat_params[i]); } } + if (t->Proc.calling_convention == ProcCC_Odin) { + if (param_count > 0) { + ir_fprintf(f, ", "); + } + ir_print_type(f, m, t_context_ptr); + } ir_fprintf(f, ")"); } @@ -737,10 +743,11 @@ void ir_print_value(irFileBuffer *f, irModule *m, irValue *value, Type *type_hin void ir_print_calling_convention(irFileBuffer *f, irModule *m, ProcCallingConvention cc) { switch (cc) { - case ProcCC_Odin: ir_fprintf(f, ""); break; - case ProcCC_C: ir_fprintf(f, "ccc "); break; - case ProcCC_Std: ir_fprintf(f, "cc 64 "); break; - case ProcCC_Fast: ir_fprintf(f, "cc 65 "); break; + case ProcCC_Odin: ir_fprintf(f, ""); break; + case ProcCC_Contextless: ir_fprintf(f, ""); break; + case ProcCC_C: ir_fprintf(f, "ccc "); break; + case ProcCC_Std: ir_fprintf(f, "cc 64 "); break; + case ProcCC_Fast: ir_fprintf(f, "cc 65 "); break; default: GB_PANIC("unknown calling convention: %d", cc); } } @@ -1261,8 +1268,6 @@ void ir_print_instr(irFileBuffer *f, irModule *m, irValue *value) { if (call->arg_count > 0) { - Type *proc_type = base_type(ir_type(call->value)); - GB_ASSERT(proc_type->kind == Type_Proc); TypeTuple *params = &proc_type->Proc.params->Tuple; if (proc_type->Proc.c_vararg) { isize i = 0; @@ -1293,7 +1298,9 @@ void ir_print_instr(irFileBuffer *f, irModule *m, irValue *value) { ir_print_value(f, m, arg, t); } } else { - for (isize i = 0; i < call->arg_count; i++) { + GB_ASSERT(call->arg_count == params->variable_count); + isize param_count = params->variable_count; + for (isize i = 0; i < param_count; i++) { Entity *e = params->variables[i]; GB_ASSERT(e != NULL); irValue *arg = call->args[i]; @@ -1310,6 +1317,14 @@ void ir_print_instr(irFileBuffer *f, irModule *m, irValue *value) { } } } + if (proc_type->Proc.calling_convention == ProcCC_Odin) { + if (proc_type->Proc.param_count > 0) { + ir_fprintf(f, ", "); + } + ir_print_type(f, m, t_context_ptr); + ir_fprintf(f, " noalias nonnull"); + ir_print_value(f, m, call->context_ptr, t_context_ptr); + } ir_fprintf(f, ")\n"); } break; @@ -1538,7 +1553,7 @@ void ir_print_proc(irFileBuffer *f, irModule *m, irProcedure *proc) { if (param_count > 0) { TypeTuple *params = &proc_type->params->Tuple; - for (isize i = 0; i < params->variable_count; i++) { + for (isize i = 0; i < param_count; i++) { Entity *e = params->variables[i]; Type *original_type = e->type; Type *abi_type = proc_type->abi_compat_params[i]; @@ -1564,6 +1579,13 @@ void ir_print_proc(irFileBuffer *f, irModule *m, irProcedure *proc) { } } } + if (proc_type->calling_convention == ProcCC_Odin) { + if (param_count > 0) { + ir_fprintf(f, ", "); + } + ir_print_type(f, m, t_context_ptr); + ir_fprintf(f, " noalias nonnull %%__.context_ptr"); + } ir_fprintf(f, ") "); |