From c0cbe0057519db843a1a4ce2beb97e0ff54ece17 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 28 Dec 2023 00:18:21 +0000 Subject: Set target triple in LLVM IR --- .../org/shedlang/compiler/backends/llvm/LlvmBackend.java | 2 +- .../org/shedlang/compiler/backends/llvm/LlvmTarget.java | 14 ++++++++++---- .../backends/llvm/codegen/PatioToLlvmGlobalContext.java | 13 ++++++++++++- .../backends/llvm/codegen/PatioToLlvmModuleContext.java | 10 ++++++++-- .../compiler/backends/llvm/ir/LlvmIrSerializer.java | 3 +++ .../shedlang/compiler/backends/llvm/ir/ast/LlvmModule.java | 3 ++- 6 files changed, 36 insertions(+), 9 deletions(-) (limited to 'src/main/java/org') 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(); - 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 exceptionTypeNameToTag; private PatioToLlvmGlobalContext( + LlvmTarget target, PMap 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 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 body ) { public LlvmModule addTopLevelEntity(LlvmTopLevelEntity topLevelEntity) { - return new LlvmModule(this.body.plus(topLevelEntity)); + return new LlvmModule(this.targetTriple, this.body.plus(topLevelEntity)); } } -- cgit v1.2.3