aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-17 23:20:00 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-17 23:20:00 +0100
commit7aebd6993b58a0fcb5ee716e835812cfd817c347 (patch)
treea519d2f07fa0f1db318e93239f519e27610480fe /src/main/java
parentddf005024d396dd4194447bdc0cbe6ef03d43df0 (diff)
Compile in target directory
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java38
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompiler.java14
-rw-r--r--src/main/java/org/shedlang/compiler/cli/ShedCli.java1
-rw-r--r--src/main/java/org/shedlang/compiler/config/ProjectConfig.java10
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");
+ }
}