From bf5db6e008e37cb9049737d7cf49e26934ab5506 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 28 Nov 2023 22:20:00 +0000 Subject: Support use of exception value in LLVM backend --- .../compiler/backends/llvm/LlvmPatioCodeGen.java | 23 +++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) (limited to 'src/main/java') 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() )); -- cgit v1.2.3