From c4cddcf037a57078452fe282b8527bffb4edde4e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 22 Dec 2024 21:10:22 +0000 Subject: Use jmp_buf size for LLVM target --- .../backends/llvm/codegen/PatioToLlvm.java | 23 ++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java index 75d66773..d8ef66af 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java @@ -16,7 +16,6 @@ import org.shedlang.compiler.patio.instructions.*; import org.shedlang.compiler.patio.operands.*; import org.shedlang.compiler.patio.types.*; import org.shedlang.compiler.patio.values.*; -import org.shedlang.compiler.util.Lazy; import org.shedlang.compiler.util.Lists; import org.shedlang.compiler.util.P; @@ -25,6 +24,8 @@ import java.nio.file.Files; import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import java.util.stream.StreamSupport; public class PatioToLlvm { @@ -34,13 +35,15 @@ public class PatioToLlvm { return target.patioIntType(); } - private static final Lazy JMP_BUF_SIZE = Lazy.of(() -> readJmpBufSize()); + private static final ConcurrentMap JMP_BUF_SIZE = new ConcurrentHashMap<>(); - private static int readJmpBufSize() { + private static int readJmpBufSize(LlvmTarget target) { try { var sizeofJmpBufString = Files.readString( - // TODO: use jmp_buf size for target - ShedCompilerFiles.getRoot().resolve("runtime/target/amd64/sizeof_jmp_buf.txt") + ShedCompilerFiles.getRoot() + .resolve("runtime/target") + .resolve(target.targetName()) + .resolve("sizeof_jmp_buf.txt") ); return Integer.parseInt(sizeofJmpBufString.strip()); } catch (IOException e) { @@ -48,8 +51,12 @@ public class PatioToLlvm { } } - private static LlvmType jmpBufType() { - return LlvmTypes.array(JMP_BUF_SIZE.get(), LlvmTypes.INT_8); + private static LlvmType jmpBufType(LlvmTarget target) { + if (!JMP_BUF_SIZE.containsKey(target)) { + JMP_BUF_SIZE.put(target, readJmpBufSize(target)); + } + + return LlvmTypes.array(JMP_BUF_SIZE.get(target), LlvmTypes.INT_8); } private static LlvmFunctionDeclaration setjmpDeclaration(LlvmTarget target) { @@ -695,7 +702,7 @@ public class PatioToLlvm { context = context.addInstruction(new LlvmAlloca( jmpBuf, - jmpBufType() + jmpBufType(context.target()) )); var previousExceptionHandlerResult = context.allocateLocalName(LlvmCodeGenLocalVariableSpace.TRY_PREVIOUS_EXCEPTION_HANDLER); -- cgit v1.2.3