aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-28 00:18:21 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-28 00:18:21 +0000
commitc0cbe0057519db843a1a4ce2beb97e0ff54ece17 (patch)
tree3546a2cea39141325e490790b5e4c1854aecbe06 /src/main/java
parent74f5dfda370d1ca9b45556328e2cab6b6ab4070a (diff)
Set target triple in LLVM IR
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java2
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmTarget.java14
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmGlobalContext.java13
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmModuleContext.java10
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java3
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmModule.java3
6 files changed, 36 insertions, 9 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 7404c8b1..c15d431c 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java
@@ -60,7 +60,7 @@ public class LlvmBackend implements Backend {
var llvmCompiler = LlvmCompiler.forTarget(this.target);
var objectFilePaths = new ArrayList<Path>();
- var globalContext = PatioToLlvmGlobalContext.EMPTY;
+ var globalContext = PatioToLlvmGlobalContext.empty(this.target);
for (var namespace : namespaces) {
var patioCompilationUnit = ShidToPatio.generateNamespace(
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmTarget.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmTarget.java
index ee0ddb18..cf2d09ad 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmTarget.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmTarget.java
@@ -1,16 +1,22 @@
package org.shedlang.compiler.backends.llvm;
public enum LlvmTarget {
- AMD64("amd64"),
- I686("i686");
+ AMD64("amd64", "x86_64-unknown-linux-gnu"),
+ I686("i686", "i686-unknown-linux-gnu");
private final String targetName;
+ private final String targetTriple;
- LlvmTarget(String targetName) {
+ LlvmTarget(String targetName, String targetTriple) {
this.targetName = targetName;
+ this.targetTriple = targetTriple;
}
public String targetName() {
- return targetName;
+ return this.targetName;
+ }
+
+ public String targetTriple() {
+ return this.targetTriple;
}
}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmGlobalContext.java b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmGlobalContext.java
index 79557c73..4077ce6e 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmGlobalContext.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmGlobalContext.java
@@ -1,22 +1,33 @@
package org.shedlang.compiler.backends.llvm.codegen;
import org.pcollections.PMap;
+import org.shedlang.compiler.backends.llvm.LlvmTarget;
import org.shedlang.compiler.util.P;
public class PatioToLlvmGlobalContext {
- public static final PatioToLlvmGlobalContext EMPTY = new PatioToLlvmGlobalContext(P.map());
+ public static PatioToLlvmGlobalContext empty(LlvmTarget target) {
+ return new PatioToLlvmGlobalContext(target, P.map());
+ }
+ private final LlvmTarget target;
private final PMap<String, Integer> exceptionTypeNameToTag;
private PatioToLlvmGlobalContext(
+ LlvmTarget target,
PMap<String, Integer> exceptionTypeNameToTag
) {
+ this.target = target;
this.exceptionTypeNameToTag = exceptionTypeNameToTag;
}
+ public LlvmTarget target() {
+ return this.target;
+ }
+
PatioToLlvmGlobalContext allocateExceptionTag(String exceptionTypeName) {
var tag = this.exceptionTypeNameToTag.size() + 1;
return new PatioToLlvmGlobalContext(
+ this.target,
this.exceptionTypeNameToTag.plus(exceptionTypeName, tag)
);
}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmModuleContext.java b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmModuleContext.java
index c5fa7d08..538d66b9 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmModuleContext.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmModuleContext.java
@@ -2,13 +2,16 @@ package org.shedlang.compiler.backends.llvm.codegen;
import org.pcollections.PMap;
import org.pcollections.PVector;
+import org.shedlang.compiler.backends.llvm.LlvmTarget;
import org.shedlang.compiler.backends.llvm.ir.ast.LlvmModule;
import org.shedlang.compiler.backends.llvm.ir.ast.LlvmTopLevelEntity;
import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType;
import org.shedlang.compiler.util.P;
class PatioToLlvmModuleContext {
- static final PatioToLlvmModuleContext EMPTY = of(PatioToLlvmGlobalContext.EMPTY);
+ static PatioToLlvmModuleContext empty(LlvmTarget target) {
+ return of(PatioToLlvmGlobalContext.empty(target));
+ }
static PatioToLlvmModuleContext of(PatioToLlvmGlobalContext globalContext) {
return new PatioToLlvmModuleContext(globalContext, P.map(), P.vector());
@@ -29,7 +32,10 @@ class PatioToLlvmModuleContext {
}
PatioToLlvmGlobalContext.Result<LlvmModule> toModule() {
- return this.globalContext.toResult(new LlvmModule(topLevelEntities));
+ return this.globalContext.toResult(new LlvmModule(
+ this.globalContext.target().targetTriple(),
+ this.topLevelEntities
+ ));
}
PatioToLlvmModuleContext addFunctionNameToReturnType(String functionName, LlvmType returnType) {
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java
index d3672574..a74287be 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java
@@ -174,6 +174,9 @@ public class LlvmIrSerializer {
}
public static void serializeModule(LlvmModule module, Appendable writer) throws IOException {
+ writer.append("target triple = \"");
+ writer.append(module.targetTriple());
+ writer.append("\"\n");
for (var topLevelEntity : module.body()) {
serializeTopLevelEntity(topLevelEntity, writer);
}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmModule.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmModule.java
index 0a899aa3..2bcddb8f 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmModule.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmModule.java
@@ -3,9 +3,10 @@ package org.shedlang.compiler.backends.llvm.ir.ast;
import org.pcollections.PVector;
public record LlvmModule(
+ String targetTriple,
PVector<LlvmTopLevelEntity> body
) {
public LlvmModule addTopLevelEntity(LlvmTopLevelEntity topLevelEntity) {
- return new LlvmModule(this.body.plus(topLevelEntity));
+ return new LlvmModule(this.targetTriple, this.body.plus(topLevelEntity));
}
}