diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-17 23:20:00 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-17 23:20:00 +0100 |
| commit | 7aebd6993b58a0fcb5ee716e835812cfd817c347 (patch) | |
| tree | a519d2f07fa0f1db318e93239f519e27610480fe /src/main/java | |
| parent | ddf005024d396dd4194447bdc0cbe6ef03d43df0 (diff) | |
Compile in target directory
Diffstat (limited to 'src/main/java')
4 files changed, 39 insertions, 24 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 cff18557..2c854299 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java @@ -21,8 +21,9 @@ public class LlvmBackend implements Backend { TypeInfo typeInfo ) throws IOException { for (var namespace : namespaces.entrySet()) { + var namespaceName = namespace.getKey(); var llvmModule = LlvmCompiler.compileNamespace( - namespace.getKey(), + namespaceName, namespace.getValue(), typeInfo ); @@ -30,26 +31,21 @@ public class LlvmBackend implements Backend { // TODO: write directly to file var builder = new StringBuilder(); LlvmIrSerializer.serializeModule(llvmModule, builder); - var temporaryDirectory = Files.createTempDirectory("shed-"); - try { - // TODO: proper name - var llvmModulePath = temporaryDirectory.resolve("module.ll"); - var objectPath = temporaryDirectory.resolve("module.o"); - Files.writeString( - llvmModulePath, - builder.toString(), - StandardCharsets.UTF_8 - ); - System.out.println(builder.toString()); - run(List.of( - "llc-16", llvmModulePath.toString(), - "-filetype", "obj", - "-relocation-model", "pic", - "-o", objectPath.toString() - )); - } finally { - // TODO: delete - } + + var llvmModulePath = config.targetDir().resolve(String.join("_", namespaceName.parts()) + ".ll"); + var objectPath = config.targetDir().resolve(String.join("_", namespaceName.parts()) + ".o"); + Files.createDirectories(llvmModulePath.getParent()); + Files.writeString( + llvmModulePath, + builder.toString(), + StandardCharsets.UTF_8 + ); + run(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 index a087b75e..f5d677f4 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java @@ -1,5 +1,6 @@ package org.shedlang.compiler.backends.llvm; +import org.shedlang.compiler.ast.typed.FreeVariables; 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.*; @@ -49,6 +50,19 @@ public class LlvmCompiler { "shed__runtime__alloc", LlvmTypes.pointer(LlvmTypes.INT_8), List.of(new LlvmParam(LlvmTypes.INT_64, "size")) + )) + .addTopLevelEntity(new LlvmGlobalDefinition( + "shed__runtime__print_closure", + new LlvmCompilerClosures.Types(Optional.of(FreeVariables.empty())).closureStruct(), + Optional.empty(), + false, + false, + false + )) + .addLocal("print", new LlvmOperandPtrToInt( + new LlvmCompilerClosures.Types(Optional.of(FreeVariables.empty())).closurePointer(), + new LlvmVariableGlobal("shed__runtime__print_closure"), + LlvmCompilerTypes.VALUE_TYPE )); } diff --git a/src/main/java/org/shedlang/compiler/cli/ShedCli.java b/src/main/java/org/shedlang/compiler/cli/ShedCli.java index c2106768..0e36cf13 100644 --- a/src/main/java/org/shedlang/compiler/cli/ShedCli.java +++ b/src/main/java/org/shedlang/compiler/cli/ShedCli.java @@ -48,7 +48,6 @@ public class ShedCli { compileSubParser.setDefault("command", Command.COMPILE); compileSubParser.addArgument("source").required(true); compileSubParser.addArgument("--backend").choices("llvm").required(true); - compileSubParser.addArgument("-o", "--output").dest("output").required(true); var generateInstructionsSubParser = subparsers.addParser("generate-instructions"); generateInstructionsSubParser.setDefault("command", Command.GENERATE_INSTRUCTIONS); diff --git a/src/main/java/org/shedlang/compiler/config/ProjectConfig.java b/src/main/java/org/shedlang/compiler/config/ProjectConfig.java index faa12c0b..1db4b87d 100644 --- a/src/main/java/org/shedlang/compiler/config/ProjectConfig.java +++ b/src/main/java/org/shedlang/compiler/config/ProjectConfig.java @@ -15,12 +15,14 @@ public class ProjectConfig { throw result.errors().get(0); } - return new ProjectConfig(result); + return new ProjectConfig(projectPath, result); } + private final Path root; private final TomlTable config; - public ProjectConfig(TomlTable config) { + public ProjectConfig(Path root, TomlTable config) { + this.root = root; this.config = config; } @@ -30,4 +32,8 @@ public class ProjectConfig { // TODO: extract namespace name parsing return new NamespaceName(Arrays.asList(string.split("/"))); } + + public Path targetDir() { + return root.resolve("target"); + } } |
