aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-20 16:28:36 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-20 16:28:36 +0000
commita0fdc0e6dd56616bb7519969e47518321b7a2685 (patch)
treed7e4cdb921e37e48bc1afa537d958ee8bc90dbcb /src/main/java
parent9c22159b16d5346721f29f818e3d756c0ecd4647 (diff)
Read jmp_buf size instead of hard-coding
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/codegen/LlvmPatioCodeGen.java25
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/codegen/errors/SizeofJmpBufError.java10
-rw-r--r--src/main/java/org/shedlang/compiler/util/Lazy.java26
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();
+ }
+}