diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-20 16:28:36 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-20 16:28:36 +0000 |
| commit | a0fdc0e6dd56616bb7519969e47518321b7a2685 (patch) | |
| tree | d7e4cdb921e37e48bc1afa537d958ee8bc90dbcb /src/main/java | |
| parent | 9c22159b16d5346721f29f818e3d756c0ecd4647 (diff) | |
Read jmp_buf size instead of hard-coding
Diffstat (limited to 'src/main/java')
3 files changed, 57 insertions, 4 deletions
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<Integer> 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<T> { + public static <T> Lazy<T> of(Supplier<T> supplier) { + return new Lazy<>(supplier); + } + + private final Supplier<T> supplier; + private Optional<T> value; + + private Lazy(Supplier<T> 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(); + } +} |
