diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-28 21:58:26 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-28 21:58:26 +0000 |
| commit | 24bb42258a59baeb596b18447c27356abece7f75 (patch) | |
| tree | 81f5c8a91252390a3f225e9ca7f671d733d70216 /src/main/java | |
| parent | 53079bcb98247079ebf03c83b491b17fc2e46eba (diff) | |
Save and restore previous exception handler when rethrowing
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/LlvmCodeGenLocalVariableSpace.java | 1 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java | 28 |
2 files changed, 22 insertions, 7 deletions
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) |
