From 24bb42258a59baeb596b18447c27356abece7f75 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 28 Nov 2023 21:58:26 +0000 Subject: Save and restore previous exception handler when rethrowing --- .../llvm/LlvmCodeGenLocalVariableSpace.java | 1 + .../compiler/backends/llvm/LlvmPatioCodeGen.java | 28 ++++++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java index 2bd93582..c48e0667 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java @@ -32,6 +32,7 @@ public enum LlvmCodeGenLocalVariableSpace { SWITCH_DEFAULT_START("switchDefaultStart"), SWITCH_DEFAULT_END("switchDefaultEnd"), SWITCH_END("switchEnd"), + TRY_PREVIOUS_EXCEPTION_HANDLER("tryPreviousExceptionHandler"), TRY_BODY_START("tryBodyStart"), TRY_BODY_END("tryBodyEnd"), TRY_CATCH_START("tryCatchStart"), diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java index 2f1ce44b..aa209fb4 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java @@ -688,22 +688,31 @@ public class LlvmPatioCodeGen { JMP_BUF_DATA )); - var setjmpValueResult = context.allocateLocalName(LlvmCodeGenLocalVariableSpace.SETJMP_VALUE); - var setjmpValue = setjmpValueResult.value; - context = setjmpValueResult.context; + var previousExceptionHandlerResult = context.allocateLocalName(LlvmCodeGenLocalVariableSpace.TRY_PREVIOUS_EXCEPTION_HANDLER); + var previousExceptionHandler = previousExceptionHandlerResult.value; + context = previousExceptionHandlerResult.context; - context = context.addInstruction(SETJMP_DECLARATION.call( - Optional.of(setjmpValue), - List.of(jmpBuf) + context = context.addInstruction(new LlvmLoad( + previousExceptionHandler, + LlvmTypes.pointer(LlvmTypes.VOID), + new LlvmVariableGlobal(EXCEPTION_HANDLER_DECLARATION.name()) )); - // TODO: save and restore previous exception handler context = context.addInstruction(new LlvmStore( LlvmTypes.pointer(LlvmTypes.VOID), jmpBuf, new LlvmVariableGlobal(EXCEPTION_HANDLER_DECLARATION.name()) )); + var setjmpValueResult = context.allocateLocalName(LlvmCodeGenLocalVariableSpace.SETJMP_VALUE); + var setjmpValue = setjmpValueResult.value; + context = setjmpValueResult.context; + + context = context.addInstruction(SETJMP_DECLARATION.call( + Optional.of(setjmpValue), + List.of(jmpBuf) + )); + context = context.addTerminatorInstruction(new LlvmSwitch( LlvmTypes.INT_32, setjmpValue, @@ -712,6 +721,11 @@ public class LlvmPatioCodeGen { )); context = context.startBasicBlock(rethrowStartLabel); + context = context.addInstruction(new LlvmStore( + LlvmTypes.pointer(LlvmTypes.VOID), + previousExceptionHandler, + new LlvmVariableGlobal(EXCEPTION_HANDLER_DECLARATION.name()) + )); context = context.addInstruction(RETHROW_DECLARATION.call( Optional.empty(), List.of(setjmpValue) -- cgit v1.2.3