aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-29 13:50:18 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-29 13:50:18 +0100
commit20d101c8c90fab89c75de2a7a3953c554e6302ad (patch)
treebd05e75970d033f6bfe9bf3e0dd0f67014e59570 /src/main/java
parentb767d3258dc4521b846c75bf2175d08582ec6b21 (diff)
Extract LlvmCompiler
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java27
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java48
2 files changed, 49 insertions, 26 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java
index 44ff7b77..d0f23f57 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java
@@ -1,7 +1,6 @@
package org.shedlang.compiler.backends.llvm;
import org.shedlang.compiler.backends.Backend;
-import org.shedlang.compiler.backends.llvm.ir.LlvmIrSerializer;
import org.shedlang.compiler.backends.llvm.ir.ast.LlvmBasicBlock;
import org.shedlang.compiler.backends.llvm.ir.ast.LlvmFunctionDefinition;
import org.shedlang.compiler.backends.llvm.ir.ast.LlvmModule;
@@ -19,11 +18,7 @@ import org.shedlang.compiler.stackir.StackIrNamespace;
import org.shedlang.compiler.typechecker.TypeInfo;
import org.shedlang.compiler.types.NamespaceName;
-import java.io.BufferedWriter;
-import java.io.FileWriter;
import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
@@ -162,26 +157,6 @@ public class LlvmBackend implements Backend {
Path workingDirectory,
String name
) throws IOException, InterruptedException {
- var llvmModulePath = workingDirectory.resolve(name + ".ll");
- Files.createDirectories(llvmModulePath.getParent());
- var fileWriter = new FileWriter(llvmModulePath.toFile(), StandardCharsets.UTF_8);
- try (var writer = new BufferedWriter(fileWriter)) {
- LlvmIrSerializer.serializeModule(llvmModule, writer);
- }
-
- var objectPath = workingDirectory.resolve(name + ".o");
- runLlvmCompiler(llvmModulePath, objectPath);
-
- return objectPath;
+ return new LlvmCompiler(workingDirectory).compileLlvmModule(llvmModule, name);
}
-
- private static void runLlvmCompiler(Path llvmModulePath, Path objectPath) throws IOException, InterruptedException {
- runInheritIo(List.of(
- "llc-16", llvmModulePath.toString(),
- "-filetype", "obj",
- "-relocation-model", "pic",
- "-o", objectPath.toString()
- ));
- }
-
}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
new file mode 100644
index 00000000..04e13b39
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java
@@ -0,0 +1,48 @@
+package org.shedlang.compiler.backends.llvm;
+
+import org.shedlang.compiler.backends.llvm.ir.LlvmIrSerializer;
+import org.shedlang.compiler.backends.llvm.ir.ast.LlvmModule;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+
+import static org.shedlang.compiler.backends.ProcessRunner.runInheritIo;
+
+public class LlvmCompiler {
+ private final Path workingDirectory;
+
+ public LlvmCompiler(Path workingDirectory) {
+ this.workingDirectory = workingDirectory;
+ }
+
+ public Path compileLlvmModule(
+ LlvmModule llvmModule,
+ String name
+ ) throws IOException, InterruptedException {
+ var llvmModulePath = workingDirectory.resolve(name + ".ll");
+ Files.createDirectories(llvmModulePath.getParent());
+ var fileWriter = new FileWriter(llvmModulePath.toFile(), StandardCharsets.UTF_8);
+ try (var writer = new BufferedWriter(fileWriter)) {
+ LlvmIrSerializer.serializeModule(llvmModule, writer);
+ }
+
+ var objectPath = workingDirectory.resolve(name + ".o");
+ runLlvmCompiler(llvmModulePath, objectPath);
+
+ return objectPath;
+ }
+
+ private static void runLlvmCompiler(Path llvmModulePath, Path objectPath) throws IOException, InterruptedException {
+ runInheritIo(List.of(
+ "llc-16", llvmModulePath.toString(),
+ "-filetype", "obj",
+ "-relocation-model", "pic",
+ "-o", objectPath.toString()
+ ));
+ }
+}