From a0fdc0e6dd56616bb7519969e47518321b7a2685 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 20 Dec 2023 16:28:36 +0000 Subject: Read jmp_buf size instead of hard-coding --- .../backends/llvm/codegen/LlvmPatioCodeGen.java | 25 +++++++++++++++++---- .../llvm/codegen/errors/SizeofJmpBufError.java | 10 +++++++++ src/main/java/org/shedlang/compiler/util/Lazy.java | 26 ++++++++++++++++++++++ 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/codegen/errors/SizeofJmpBufError.java create mode 100644 src/main/java/org/shedlang/compiler/util/Lazy.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/LlvmPatioCodeGen.java b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/LlvmPatioCodeGen.java index c82f0a05..a680f3b7 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/LlvmPatioCodeGen.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/LlvmPatioCodeGen.java @@ -3,18 +3,23 @@ package org.shedlang.compiler.backends.llvm.codegen; import org.pcollections.PVector; import org.pcollections.TreePVector; import org.shedlang.compiler.backends.llvm.LlvmCodeGenLocalVariableSpace; +import org.shedlang.compiler.backends.llvm.codegen.errors.SizeofJmpBufError; import org.shedlang.compiler.backends.llvm.ir.ast.*; import org.shedlang.compiler.backends.llvm.ir.ast.instructions.*; import org.shedlang.compiler.backends.llvm.ir.ast.operands.*; import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType; import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes; +import org.shedlang.compiler.filesystem.ShedCompilerFiles; import org.shedlang.compiler.patio.ast.*; import org.shedlang.compiler.patio.ast.instructions.*; import org.shedlang.compiler.patio.ast.operands.*; import org.shedlang.compiler.patio.ast.types.*; +import org.shedlang.compiler.util.Lazy; import org.shedlang.compiler.util.Lists; import org.shedlang.compiler.util.P; +import java.io.IOException; +import java.nio.file.Files; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -34,9 +39,21 @@ public class LlvmPatioCodeGen { private static final LlvmType EXCEPTION_TAG_TYPE = LlvmTypes.INT_32; private static final LlvmType EXCEPTION_VALUE_TYPE = LlvmTypes.INT_64; - private static LlvmType jmpBufData() { - // TODO: find size of jmp_buf properly - return LlvmTypes.array(200, LlvmTypes.INT_8); + private static final Lazy JMP_BUF_SIZE = Lazy.of(() -> readJmpBufSize()); + + private static int readJmpBufSize() { + try { + var sizeofJmpBufString = Files.readString( + ShedCompilerFiles.getRoot().resolve("runtime/target/amd64/sizeof_jmp_buf.txt") + ); + return Integer.parseInt(sizeofJmpBufString.strip()); + } catch (IOException e) { + throw new SizeofJmpBufError(); + } + } + + private static LlvmType jmpBufType() { + return LlvmTypes.array(JMP_BUF_SIZE.get(), LlvmTypes.INT_8); } private static final LlvmFunctionDeclaration SETJMP_DECLARATION = new LlvmFunctionDeclaration( @@ -671,7 +688,7 @@ public class LlvmPatioCodeGen { context = context.addInstruction(new LlvmAlloca( jmpBuf, - jmpBufData() + jmpBufType() )); var previousExceptionHandlerResult = context.allocateLocalName(LlvmCodeGenLocalVariableSpace.TRY_PREVIOUS_EXCEPTION_HANDLER); diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/errors/SizeofJmpBufError.java b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/errors/SizeofJmpBufError.java new file mode 100644 index 00000000..5594bc71 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/errors/SizeofJmpBufError.java @@ -0,0 +1,10 @@ +package org.shedlang.compiler.backends.llvm.codegen.errors; + +import org.shedlang.compiler.errors.InternalCompilerError; +import org.shedlang.compiler.sources.Sources; + +public class SizeofJmpBufError extends InternalCompilerError { + public SizeofJmpBufError() { + super("Could not find size of jmp_buf", Sources.NULL); + } +} diff --git a/src/main/java/org/shedlang/compiler/util/Lazy.java b/src/main/java/org/shedlang/compiler/util/Lazy.java new file mode 100644 index 00000000..951f56bd --- /dev/null +++ b/src/main/java/org/shedlang/compiler/util/Lazy.java @@ -0,0 +1,26 @@ +package org.shedlang.compiler.util; + +import java.util.Optional; +import java.util.function.Supplier; + +public class Lazy { + public static Lazy of(Supplier supplier) { + return new Lazy<>(supplier); + } + + private final Supplier supplier; + private Optional value; + + private Lazy(Supplier supplier) { + this.supplier = supplier; + this.value = Optional.empty(); + } + + public T get() { + if (this.value.isEmpty()) { + this.value = Optional.of(this.supplier.get()); + } + + return this.value.get(); + } +} -- cgit v1.2.3