aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-12-22 21:10:22 +0000
committerMichael Williamson <mike@zwobble.org>2024-12-22 21:10:22 +0000
commitc4cddcf037a57078452fe282b8527bffb4edde4e (patch)
treecba619e4897444ca3ec73800ce073534e7df29f6 /src/main/java
parentec1382f68d1132071b357c2aa3b89bc8a2017d67 (diff)
Use jmp_buf size for LLVM target
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java23
1 files changed, 15 insertions, 8 deletions
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<Integer> JMP_BUF_SIZE = Lazy.of(() -> readJmpBufSize());
+ private static final ConcurrentMap<LlvmTarget, Integer> 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);