aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-28 21:58:26 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-28 21:58:26 +0000
commit24bb42258a59baeb596b18447c27356abece7f75 (patch)
tree81f5c8a91252390a3f225e9ca7f671d733d70216 /src/main/java
parent53079bcb98247079ebf03c83b491b17fc2e46eba (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.java1
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java28
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)