aboutsummaryrefslogtreecommitdiff
path: root/src/ir_print.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-03-29 00:24:04 -0400
committerAndrew Kelley <superjoe30@gmail.com>2018-04-08 16:04:48 -0400
commitd26905c102f45382a5aa4bf59deda0ccc8c6e50f (patch)
treee684112b364f7b896818c2d64cfb6da2cabc5495 /src/ir_print.cpp
parent7186e92c86982950d0aa7c0c2deef9ef96bc1264 (diff)
downloadzig-d26905c102f45382a5aa4bf59deda0ccc8c6e50f.tar.gz
zig-d26905c102f45382a5aa4bf59deda0ccc8c6e50f.zip
error return traces for the early return case
it would work but LLVM is not correctly spilling the addresses. See #821
Diffstat (limited to 'src/ir_print.cpp')
-rw-r--r--src/ir_print.cpp24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/ir_print.cpp b/src/ir_print.cpp
index b14d49a4ca..432d287bb8 100644
--- a/src/ir_print.cpp
+++ b/src/ir_print.cpp
@@ -1024,7 +1024,16 @@ static void ir_print_export(IrPrint *irp, IrInstructionExport *instruction) {
}
static void ir_print_error_return_trace(IrPrint *irp, IrInstructionErrorReturnTrace *instruction) {
- fprintf(irp->f, "@errorReturnTrace()");
+ fprintf(irp->f, "@errorReturnTrace(");
+ switch (instruction->nullable) {
+ case IrInstructionErrorReturnTrace::Null:
+ fprintf(irp->f, "Null");
+ break;
+ case IrInstructionErrorReturnTrace::NonNull:
+ fprintf(irp->f, "NonNull");
+ break;
+ }
+ fprintf(irp->f, ")");
}
static void ir_print_error_union(IrPrint *irp, IrInstructionErrorUnion *instruction) {
@@ -1179,6 +1188,16 @@ static void ir_print_add_implicit_return_type(IrPrint *irp, IrInstructionAddImpl
fprintf(irp->f, ")");
}
+static void ir_print_merge_err_ret_traces(IrPrint *irp, IrInstructionMergeErrRetTraces *instruction) {
+ fprintf(irp->f, "@mergeErrRetTraces(");
+ ir_print_other_instruction(irp, instruction->coro_promise_ptr);
+ fprintf(irp->f, ",");
+ if (instruction->resolved_field != nullptr) {
+ fprintf(irp->f, "field '%s'", buf_ptr(instruction->resolved_field->name));
+ }
+ fprintf(irp->f, ")");
+}
+
static void ir_print_instruction(IrPrint *irp, IrInstruction *instruction) {
ir_print_prefix(irp, instruction);
switch (instruction->id) {
@@ -1559,6 +1578,9 @@ static void ir_print_instruction(IrPrint *irp, IrInstruction *instruction) {
case IrInstructionIdAddImplicitReturnType:
ir_print_add_implicit_return_type(irp, (IrInstructionAddImplicitReturnType *)instruction);
break;
+ case IrInstructionIdMergeErrRetTraces:
+ ir_print_merge_err_ret_traces(irp, (IrInstructionMergeErrRetTraces *)instruction);
+ break;
}
fprintf(irp->f, "\n");
}