From 20d101c8c90fab89c75de2a7a3953c554e6302ad Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 29 Jul 2023 13:50:18 +0100 Subject: Extract LlvmCompiler --- .../compiler/backends/llvm/LlvmBackend.java | 27 +----------- .../compiler/backends/llvm/LlvmCompiler.java | 48 ++++++++++++++++++++++ 2 files changed, 49 insertions(+), 26 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java (limited to 'src/main/java') 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() + )); + } +} -- cgit v1.2.3