diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-28 22:20:00 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-28 22:20:00 +0000 |
| commit | bf5db6e008e37cb9049737d7cf49e26934ab5506 (patch) | |
| tree | bc8a404b8e492736726a45dcc6080b20500a7fd0 /src/main/java | |
| parent | d21b1b2b347ff004a099538f65bc07f751b77b92 (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.java | 23 |
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() )); |
