aboutsummaryrefslogtreecommitdiff
path: root/src/ir_print.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2017-06-20 12:38:05 +0100
committerGinger Bill <bill@gingerbill.org>2017-06-20 12:38:05 +0100
commit5957d7f7bee7e5fac4035d47ecaaaad022adbfb8 (patch)
treef8f38496e6691d4d5ea4317d7b7ae3811ab7e4c0 /src/ir_print.cpp
parent35c102137f9a097584bf1af39e9809064293a0a3 (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.cpp38
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, ") ");