aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-28 22:20:00 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-28 22:20:00 +0000
commitbf5db6e008e37cb9049737d7cf49e26934ab5506 (patch)
treebc8a404b8e492736726a45dcc6080b20500a7fd0 /src/main/java
parentd21b1b2b347ff004a099538f65bc07f751b77b92 (diff)
Support use of exception value in LLVM backend
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java23
1 files changed, 22 insertions, 1 deletions
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 9e8ffbef..a5d31993 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
@@ -46,6 +46,15 @@ public class LlvmPatioCodeGen {
false
);
+ private static final LlvmGlobalDefinition EXCEPTION_VALUE_DECLARATION = new LlvmGlobalDefinition(
+ "patio__runtime__exceptions_exception_value",
+ LlvmTypes.INT_64,
+ Optional.empty(),
+ false,
+ false,
+ false
+ );
+
private static final LlvmFunctionDeclaration THROW_DECLARATION = new LlvmFunctionDeclaration(
"patio__runtime__exceptions_throw",
LlvmTypes.pointer(LlvmTypes.VOID),
@@ -67,6 +76,7 @@ public class LlvmPatioCodeGen {
var context = ModuleContext.EMPTY
.addTopLevelEntity(SETJMP_DECLARATION)
.addTopLevelEntity(EXCEPTION_HANDLER_DECLARATION)
+ .addTopLevelEntity(EXCEPTION_VALUE_DECLARATION)
.addTopLevelEntity(THROW_DECLARATION)
.addTopLevelEntity(RETHROW_DECLARATION);
@@ -708,10 +718,21 @@ public class LlvmPatioCodeGen {
var catchBodyEndLabel = catchBodyEndLabelResult.value();
context = catchBodyEndLabelResult.context();
+ var exceptionValueTargetResult = context.addPatioLocalToLlvmLocal(catchClause.target());
+ var exceptionValueTarget = exceptionValueTargetResult.value;
+ context = exceptionValueTargetResult.context;
+
branches.add(new Branch(
catchBodyStartLabel,
catchBodyEndLabel,
- List.of(restorePreviousExceptionHandlerInstruction),
+ List.of(
+ restorePreviousExceptionHandlerInstruction,
+ new LlvmLoad(
+ exceptionValueTarget,
+ LlvmTypes.INT_64,
+ new LlvmVariableGlobal(EXCEPTION_VALUE_DECLARATION.name())
+ )
+ ),
catchClause.body(),
List.of()
));