From 8831821e326a14e57d08ed9b1c8da1e5e3f7cf9a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 12 Apr 2026 10:17:13 +0100 Subject: Make targets independent of specific backends --- .../shedlang/compiler/backends/BackendFactory.java | 2 + .../org/shedlang/compiler/backends/Backends.java | 1 + .../backends/PatioNativeCHeadersBackend.java | 1 + .../compiler/backends/PatioTextBackend.java | 1 + .../org/shedlang/compiler/backends/ShedTarget.java | 41 --------- .../compiler/backends/ShidTextBackend.java | 1 + .../backends/cranelift/CraneliftBackend.java | 10 +- .../cranelift/CraneliftBackendFactory.java | 8 +- .../compiler/backends/llvm/LlvmBackend.java | 11 ++- .../compiler/backends/llvm/LlvmBackendFactory.java | 9 +- .../compiler/backends/llvm/LlvmTarget.java | 52 ----------- .../backends/llvm/codegen/PatioToLlvm.java | 38 ++++---- .../llvm/codegen/PatioToLlvmFunctionContext.java | 4 +- .../llvm/codegen/PatioToLlvmGlobalContext.java | 10 +- .../llvm/codegen/PatioToLlvmModuleContext.java | 6 +- .../compiler/backends/targets/NativeTarget.java | 52 +++++++++++ .../compiler/backends/targets/ShedTarget.java | 41 +++++++++ .../compiler/backends/targets/WasmTarget.java | 102 +++++++++++++++++++++ .../compiler/backends/wasm/PatioToWasm.java | 1 + .../compiler/backends/wasm/WasmBackend.java | 1 + .../compiler/backends/wasm/WasmBackendFactory.java | 3 +- .../compiler/backends/wasm/WasmTarget.java | 102 --------------------- .../java/org/shedlang/compiler/cli/ShedCli.java | 2 +- .../compiler/cli/UnsupportedTargetError.java | 2 +- 24 files changed, 256 insertions(+), 245 deletions(-) delete mode 100644 src/main/java/org/shedlang/compiler/backends/ShedTarget.java delete mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/LlvmTarget.java create mode 100644 src/main/java/org/shedlang/compiler/backends/targets/NativeTarget.java create mode 100644 src/main/java/org/shedlang/compiler/backends/targets/ShedTarget.java create mode 100644 src/main/java/org/shedlang/compiler/backends/targets/WasmTarget.java delete mode 100644 src/main/java/org/shedlang/compiler/backends/wasm/WasmTarget.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/BackendFactory.java b/src/main/java/org/shedlang/compiler/backends/BackendFactory.java index 66b0bc9d..6c5482fd 100644 --- a/src/main/java/org/shedlang/compiler/backends/BackendFactory.java +++ b/src/main/java/org/shedlang/compiler/backends/BackendFactory.java @@ -1,5 +1,7 @@ package org.shedlang.compiler.backends; +import org.shedlang.compiler.backends.targets.ShedTarget; + import java.util.Optional; public interface BackendFactory { diff --git a/src/main/java/org/shedlang/compiler/backends/Backends.java b/src/main/java/org/shedlang/compiler/backends/Backends.java index 333f73ad..2c6da38a 100644 --- a/src/main/java/org/shedlang/compiler/backends/Backends.java +++ b/src/main/java/org/shedlang/compiler/backends/Backends.java @@ -2,6 +2,7 @@ package org.shedlang.compiler.backends; import org.shedlang.compiler.backends.cranelift.CraneliftBackendFactory; import org.shedlang.compiler.backends.llvm.LlvmBackendFactory; +import org.shedlang.compiler.backends.targets.ShedTarget; import org.shedlang.compiler.backends.wasm.WasmBackendFactory; import java.util.List; diff --git a/src/main/java/org/shedlang/compiler/backends/PatioNativeCHeadersBackend.java b/src/main/java/org/shedlang/compiler/backends/PatioNativeCHeadersBackend.java index 84f7332a..fcd1ef4f 100644 --- a/src/main/java/org/shedlang/compiler/backends/PatioNativeCHeadersBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/PatioNativeCHeadersBackend.java @@ -2,6 +2,7 @@ package org.shedlang.compiler.backends; import org.shedlang.compiler.backends.paths.PartialTargetPath; import org.shedlang.compiler.backends.paths.TargetDir; +import org.shedlang.compiler.backends.targets.ShedTarget; import org.shedlang.compiler.config.ProfileConfig; import org.shedlang.compiler.config.ProjectConfig; import org.shedlang.compiler.patio.PatioCompilationUnit; diff --git a/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java b/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java index e93c7644..7c563b5d 100644 --- a/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java @@ -2,6 +2,7 @@ package org.shedlang.compiler.backends; import org.shedlang.compiler.backends.paths.PartialTargetPath; import org.shedlang.compiler.backends.paths.TargetDir; +import org.shedlang.compiler.backends.targets.ShedTarget; import org.shedlang.compiler.config.ProfileConfig; import org.shedlang.compiler.config.ProjectConfig; import org.shedlang.compiler.patio.PatioCompilationUnit; diff --git a/src/main/java/org/shedlang/compiler/backends/ShedTarget.java b/src/main/java/org/shedlang/compiler/backends/ShedTarget.java deleted file mode 100644 index d99de131..00000000 --- a/src/main/java/org/shedlang/compiler/backends/ShedTarget.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.shedlang.compiler.backends; - -import java.util.Arrays; -import java.util.List; -import java.util.Optional; - -public enum ShedTarget { - AMD64("amd64"), - I686("i686"), - WASM32("wasm32"), - WASM64("wasm64"), - PATIO_NATIVE_C_HEADERS("patio-native-c-headers"), - PATIO_TEXT("patio-text"), - SHID_TEXT("shid-text"); - - public static List targetNames() { - return Arrays.stream(ShedTarget.class.getEnumConstants()) - .map(ShedTarget::targetName) - .toList(); - } - - public static Optional fromString(String targetName) { - for (var target : ShedTarget.class.getEnumConstants()) { - if (target.targetName.equals(targetName)) { - return Optional.of(target); - } - } - - return Optional.empty(); - } - - private final String targetName; - - ShedTarget(String targetName) { - this.targetName = targetName; - } - - public String targetName() { - return targetName; - } -} diff --git a/src/main/java/org/shedlang/compiler/backends/ShidTextBackend.java b/src/main/java/org/shedlang/compiler/backends/ShidTextBackend.java index 56174101..39ff9bd9 100644 --- a/src/main/java/org/shedlang/compiler/backends/ShidTextBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/ShidTextBackend.java @@ -1,6 +1,7 @@ package org.shedlang.compiler.backends; import org.shedlang.compiler.backends.paths.TargetDir; +import org.shedlang.compiler.backends.targets.ShedTarget; import org.shedlang.compiler.config.ProfileConfig; import org.shedlang.compiler.config.ProjectConfig; import org.shedlang.compiler.shid.ShidNamespace; diff --git a/src/main/java/org/shedlang/compiler/backends/cranelift/CraneliftBackend.java b/src/main/java/org/shedlang/compiler/backends/cranelift/CraneliftBackend.java index 584fd7d0..75794092 100644 --- a/src/main/java/org/shedlang/compiler/backends/cranelift/CraneliftBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/cranelift/CraneliftBackend.java @@ -5,7 +5,7 @@ import org.pcollections.PVector; import org.shedlang.compiler.backends.Backend; import org.shedlang.compiler.backends.PatioBackends; import org.shedlang.compiler.backends.llvm.LlvmBackend; -import org.shedlang.compiler.backends.llvm.LlvmTarget; +import org.shedlang.compiler.backends.targets.NativeTarget; import org.shedlang.compiler.backends.paths.PartialTargetPath; import org.shedlang.compiler.backends.paths.TargetDir; import org.shedlang.compiler.config.ProfileConfig; @@ -30,15 +30,15 @@ import java.util.Optional; import static org.shedlang.compiler.util.processes.ProcessRunner.runInheritIo; public class CraneliftBackend implements Backend { - public static final CraneliftBackend AMD64 = forTarget(LlvmTarget.AMD64); + public static final CraneliftBackend AMD64 = forTarget(NativeTarget.AMD64); - public static CraneliftBackend forTarget(LlvmTarget target) { + public static CraneliftBackend forTarget(NativeTarget target) { return new CraneliftBackend(target); } - private final LlvmTarget target; + private final NativeTarget target; - private CraneliftBackend(LlvmTarget target) { + private CraneliftBackend(NativeTarget target) { this.target = target; } diff --git a/src/main/java/org/shedlang/compiler/backends/cranelift/CraneliftBackendFactory.java b/src/main/java/org/shedlang/compiler/backends/cranelift/CraneliftBackendFactory.java index b933d975..32c3c527 100644 --- a/src/main/java/org/shedlang/compiler/backends/cranelift/CraneliftBackendFactory.java +++ b/src/main/java/org/shedlang/compiler/backends/cranelift/CraneliftBackendFactory.java @@ -2,8 +2,8 @@ package org.shedlang.compiler.backends.cranelift; import org.shedlang.compiler.backends.Backend; import org.shedlang.compiler.backends.BackendFactory; -import org.shedlang.compiler.backends.ShedTarget; -import org.shedlang.compiler.backends.llvm.LlvmTarget; +import org.shedlang.compiler.backends.targets.ShedTarget; +import org.shedlang.compiler.backends.targets.NativeTarget; import java.util.Optional; @@ -15,8 +15,8 @@ public class CraneliftBackendFactory implements BackendFactory { @Override public Optional backendForTarget(ShedTarget target) { - Optional llvmTarget = switch (target) { - case AMD64 -> Optional.of(LlvmTarget.AMD64); + Optional llvmTarget = switch (target) { + case AMD64 -> Optional.of(NativeTarget.AMD64); default -> Optional.empty(); }; 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 0789467a..78177ec4 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java @@ -15,6 +15,7 @@ import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariableGlobal; import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariableLocal; import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes; import org.shedlang.compiler.backends.paths.TargetDir; +import org.shedlang.compiler.backends.targets.NativeTarget; import org.shedlang.compiler.config.ProfileConfig; import org.shedlang.compiler.config.ProjectConfig; import org.shedlang.compiler.patio.PatioCompilationUnit; @@ -34,16 +35,16 @@ import java.util.Optional; import static org.shedlang.compiler.util.processes.ProcessRunner.runInheritIo; public class LlvmBackend implements Backend { - public static final LlvmBackend AMD64 = new LlvmBackend(LlvmTarget.AMD64); - public static final LlvmBackend I686 = new LlvmBackend(LlvmTarget.I686); + public static final LlvmBackend AMD64 = new LlvmBackend(NativeTarget.AMD64); + public static final LlvmBackend I686 = new LlvmBackend(NativeTarget.I686); - public static LlvmBackend forTarget(LlvmTarget target) { + public static LlvmBackend forTarget(NativeTarget target) { return new LlvmBackend(target); } - private final LlvmTarget target; + private final NativeTarget target; - private LlvmBackend(LlvmTarget target) { + private LlvmBackend(NativeTarget target) { this.target = target; } diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackendFactory.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackendFactory.java index 301a912b..7bcc6dd4 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackendFactory.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackendFactory.java @@ -2,7 +2,8 @@ package org.shedlang.compiler.backends.llvm; import org.shedlang.compiler.backends.Backend; import org.shedlang.compiler.backends.BackendFactory; -import org.shedlang.compiler.backends.ShedTarget; +import org.shedlang.compiler.backends.targets.NativeTarget; +import org.shedlang.compiler.backends.targets.ShedTarget; import java.util.Optional; @@ -14,9 +15,9 @@ public class LlvmBackendFactory implements BackendFactory { @Override public Optional backendForTarget(ShedTarget target) { - Optional llvmTarget = switch (target) { - case AMD64 -> Optional.of(LlvmTarget.AMD64); - case I686 -> Optional.of(LlvmTarget.I686); + Optional llvmTarget = switch (target) { + case AMD64 -> Optional.of(NativeTarget.AMD64); + case I686 -> Optional.of(NativeTarget.I686); default -> Optional.empty(); }; diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmTarget.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmTarget.java deleted file mode 100644 index 35159998..00000000 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmTarget.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.shedlang.compiler.backends.llvm; - -import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypeScalar; -import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes; - -import java.util.List; - -public enum LlvmTarget { - AMD64("amd64", "x86_64-unknown-linux-gnu", LlvmTypes.INT_64, List.of()), - I686("i686", "i686-unknown-linux-gnu", LlvmTypes.INT_32, List.of("-m32")); - - private final String targetName; - private final String targetTriple; - private final LlvmTypeScalar sizeT; - private final List clangFlags; - - LlvmTarget( - String targetName, - String targetTriple, - LlvmTypeScalar sizeT, - List clangFlags - ) { - this.targetName = targetName; - this.targetTriple = targetTriple; - this.sizeT = sizeT; - this.clangFlags = clangFlags; - } - - public String targetName() { - return this.targetName; - } - - public String targetTriple() { - return this.targetTriple; - } - - public LlvmTypeScalar sizeT() { - return this.sizeT; - } - - public LlvmTypeScalar patioIntType() { - return this.sizeT; - } - - public LlvmTypeScalar cIntType() { - return LlvmTypes.INT_32; - } - - public List clangFlags() { - return this.clangFlags; - } -} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java index a49752e0..8093941e 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvm.java @@ -3,7 +3,7 @@ package org.shedlang.compiler.backends.llvm.codegen; import org.pcollections.PVector; import org.pcollections.TreePVector; import org.shedlang.compiler.backends.llvm.LlvmCodeGenLocalVariableSpace; -import org.shedlang.compiler.backends.llvm.LlvmTarget; +import org.shedlang.compiler.backends.targets.NativeTarget; import org.shedlang.compiler.backends.llvm.codegen.errors.SizeofJmpBufError; import org.shedlang.compiler.backends.llvm.ir.ast.*; import org.shedlang.compiler.backends.llvm.ir.ast.instructions.*; @@ -32,13 +32,13 @@ import java.util.stream.StreamSupport; public class PatioToLlvm { private static final LlvmType EXCEPTION_TAG_TYPE = LlvmTypes.INT_32; - private static LlvmType exceptionValueType(LlvmTarget target) { + private static LlvmType exceptionValueType(NativeTarget target) { return target.patioIntType(); } - private static final ConcurrentMap JMP_BUF_SIZE = new ConcurrentHashMap<>(); + private static final ConcurrentMap JMP_BUF_SIZE = new ConcurrentHashMap<>(); - private static int readJmpBufSize(LlvmTarget target) { + private static int readJmpBufSize(NativeTarget target) { try { var sizeofJmpBufString = Files.readString( ShedCompilerFiles.getRoot() @@ -52,7 +52,7 @@ public class PatioToLlvm { } } - private static LlvmType jmpBufType(LlvmTarget target) { + private static LlvmType jmpBufType(NativeTarget target) { if (!JMP_BUF_SIZE.containsKey(target)) { JMP_BUF_SIZE.put(target, readJmpBufSize(target)); } @@ -60,7 +60,7 @@ public class PatioToLlvm { return LlvmTypes.array(JMP_BUF_SIZE.get(target), LlvmTypes.INT_8); } - private static LlvmFunctionDeclaration setjmpDeclaration(LlvmTarget target) { + private static LlvmFunctionDeclaration setjmpDeclaration(NativeTarget target) { return new LlvmFunctionDeclaration( "_setjmp", target.cIntType(), @@ -79,7 +79,7 @@ public class PatioToLlvm { false ); - private static LlvmGlobalDefinition exceptionValueDeclaration(LlvmTarget target) { + private static LlvmGlobalDefinition exceptionValueDeclaration(NativeTarget target) { return new LlvmGlobalDefinition( "patio__runtime__exceptions_exception_value", exceptionValueType(target), @@ -90,7 +90,7 @@ public class PatioToLlvm { ); } - private static LlvmFunctionDeclaration throwDeclaration(LlvmTarget target) { + private static LlvmFunctionDeclaration throwDeclaration(NativeTarget target) { return new LlvmFunctionDeclaration( "patio__runtime__exceptions_throw", LlvmTypes.pointer(LlvmTypes.VOID), @@ -1072,7 +1072,7 @@ public class PatioToLlvm { private static LlvmType patioDataOffsetToLlvmType( PatioDataLayout patioDataLayout, List patioOffsets, - LlvmTarget target + NativeTarget target ) { return patioDataOffsetToLlvmType( patioDataLayout, @@ -1084,7 +1084,7 @@ public class PatioToLlvm { private static LlvmType patioDataOffsetToLlvmType( PatioDataLayout patioDataLayout, PVector patioOffsets, - LlvmTarget target + NativeTarget target ) { return patioDataLayoutToLlvmType( PatioOffsets.offsetDataLayout(patioDataLayout, patioOffsets), @@ -1216,7 +1216,7 @@ public class PatioToLlvm { private static LlvmOperand patioIntValueToLlvmOperand( PatioIntValue intValue, PatioType patioDestinationType, - LlvmTarget target + NativeTarget target ) { return switch (intValue) { case PatioIntValueByteOffsetOf byteOffsetOf -> @@ -1241,7 +1241,7 @@ public class PatioToLlvm { private static LlvmType patioReturnTypesToLlvmType( List patioReturnTypes, - LlvmTarget target + NativeTarget target ) { var llvmReturnTypes = patioReturnTypes.stream() .map(patioReturnType -> patioTypeToLlvmType(patioReturnType, target)) @@ -1261,7 +1261,7 @@ public class PatioToLlvm { private static LlvmType patioTypeToLlvmType( PatioType patioType, - LlvmTarget target + NativeTarget target ) { return switch (patioType) { case PatioBoolType patioBoolType -> @@ -1286,7 +1286,7 @@ public class PatioToLlvm { private static LlvmType patioDataLayoutToLlvmType( PatioDataLayout layout, - LlvmTarget target + NativeTarget target ) { return switch (layout) { case PatioDataLayoutArray patioDataLayoutArray -> @@ -1328,7 +1328,7 @@ public class PatioToLlvm { private static LlvmOperand patioDataLayoutToZeroedLlvmOperand( PatioDataLayout layout, - LlvmTarget target + NativeTarget target ) { return switch (layout) { case PatioDataLayoutArray patioDataLayoutArray -> @@ -1378,7 +1378,7 @@ public class PatioToLlvm { private static LlvmOperand patioDataValueToLlvmOperand( PatioDataValue value, - LlvmTarget target + NativeTarget target ) { return switch (value) { case PatioDataValueArray patioDataValueArray -> { @@ -1432,7 +1432,7 @@ public class PatioToLlvm { private static LlvmOperand sizeOf( PatioDataLayout layout, PatioType patioDestinationType, - LlvmTarget target + NativeTarget target ) { var llvmType = patioDataLayoutToLlvmType( layout, @@ -1445,7 +1445,7 @@ public class PatioToLlvm { private static LlvmOperand sizeOf( LlvmType type, PatioType patioDestinationType, - LlvmTarget target + NativeTarget target ) { var sizePtr = new LlvmOperandGetElementPtr( LlvmTypes.pointer(type), @@ -1462,7 +1462,7 @@ public class PatioToLlvm { PatioDataLayout patioDataLayout, List patioOffset, PatioType patioDestinationType, - LlvmTarget target + NativeTarget target ) { var offsetPtr = new LlvmOperandGetElementPtr( LlvmTypes.pointer(patioDataLayoutToLlvmType( diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmFunctionContext.java b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmFunctionContext.java index ca419896..31154679 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmFunctionContext.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/codegen/PatioToLlvmFunctionContext.java @@ -5,7 +5,7 @@ import org.pcollections.PStack; import org.pcollections.PVector; import org.shedlang.compiler.backends.NameAllocator; import org.shedlang.compiler.backends.llvm.LlvmCodeGenLocalVariableSpace; -import org.shedlang.compiler.backends.llvm.LlvmTarget; +import org.shedlang.compiler.backends.targets.NativeTarget; import org.shedlang.compiler.backends.llvm.ir.ast.LlvmBasicBlock; import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmBrUnconditional; import org.shedlang.compiler.backends.llvm.ir.ast.instructions.LlvmInstruction; @@ -61,7 +61,7 @@ class PatioToLlvmFunctionContext { this.loopLabels = loopLabels; } - LlvmTarget target() { + NativeTarget target() { return this.moduleContext.target(); } 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 4077ce6e..292fdd5f 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,26 +1,26 @@ package org.shedlang.compiler.backends.llvm.codegen; import org.pcollections.PMap; -import org.shedlang.compiler.backends.llvm.LlvmTarget; +import org.shedlang.compiler.backends.targets.NativeTarget; import org.shedlang.compiler.util.P; public class PatioToLlvmGlobalContext { - public static PatioToLlvmGlobalContext empty(LlvmTarget target) { + public static PatioToLlvmGlobalContext empty(NativeTarget target) { return new PatioToLlvmGlobalContext(target, P.map()); } - private final LlvmTarget target; + private final NativeTarget target; private final PMap exceptionTypeNameToTag; private PatioToLlvmGlobalContext( - LlvmTarget target, + NativeTarget target, PMap exceptionTypeNameToTag ) { this.target = target; this.exceptionTypeNameToTag = exceptionTypeNameToTag; } - public LlvmTarget target() { + public NativeTarget target() { return this.target; } 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 e5a36d14..abad8cdb 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 @@ -1,13 +1,13 @@ package org.shedlang.compiler.backends.llvm.codegen; import org.pcollections.PVector; -import org.shedlang.compiler.backends.llvm.LlvmTarget; +import org.shedlang.compiler.backends.targets.NativeTarget; import org.shedlang.compiler.backends.llvm.ir.ast.LlvmModule; import org.shedlang.compiler.backends.llvm.ir.ast.LlvmTopLevelEntity; import org.shedlang.compiler.util.P; class PatioToLlvmModuleContext { - static PatioToLlvmModuleContext empty(LlvmTarget target) { + static PatioToLlvmModuleContext empty(NativeTarget target) { return of(PatioToLlvmGlobalContext.empty(target)); } @@ -33,7 +33,7 @@ class PatioToLlvmModuleContext { )); } - LlvmTarget target() { + NativeTarget target() { return this.globalContext.target(); } diff --git a/src/main/java/org/shedlang/compiler/backends/targets/NativeTarget.java b/src/main/java/org/shedlang/compiler/backends/targets/NativeTarget.java new file mode 100644 index 00000000..69fb9044 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/targets/NativeTarget.java @@ -0,0 +1,52 @@ +package org.shedlang.compiler.backends.targets; + +import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypeScalar; +import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmTypes; + +import java.util.List; + +public enum NativeTarget { + AMD64("amd64", "x86_64-unknown-linux-gnu", LlvmTypes.INT_64, List.of()), + I686("i686", "i686-unknown-linux-gnu", LlvmTypes.INT_32, List.of("-m32")); + + private final String targetName; + private final String targetTriple; + private final LlvmTypeScalar sizeT; + private final List clangFlags; + + NativeTarget( + String targetName, + String targetTriple, + LlvmTypeScalar sizeT, + List clangFlags + ) { + this.targetName = targetName; + this.targetTriple = targetTriple; + this.sizeT = sizeT; + this.clangFlags = clangFlags; + } + + public String targetName() { + return this.targetName; + } + + public String targetTriple() { + return this.targetTriple; + } + + public LlvmTypeScalar sizeT() { + return this.sizeT; + } + + public LlvmTypeScalar patioIntType() { + return this.sizeT; + } + + public LlvmTypeScalar cIntType() { + return LlvmTypes.INT_32; + } + + public List clangFlags() { + return this.clangFlags; + } +} diff --git a/src/main/java/org/shedlang/compiler/backends/targets/ShedTarget.java b/src/main/java/org/shedlang/compiler/backends/targets/ShedTarget.java new file mode 100644 index 00000000..e65129b5 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/targets/ShedTarget.java @@ -0,0 +1,41 @@ +package org.shedlang.compiler.backends.targets; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +public enum ShedTarget { + AMD64("amd64"), + I686("i686"), + WASM32("wasm32"), + WASM64("wasm64"), + PATIO_NATIVE_C_HEADERS("patio-native-c-headers"), + PATIO_TEXT("patio-text"), + SHID_TEXT("shid-text"); + + public static List targetNames() { + return Arrays.stream(ShedTarget.class.getEnumConstants()) + .map(ShedTarget::targetName) + .toList(); + } + + public static Optional fromString(String targetName) { + for (var target : ShedTarget.class.getEnumConstants()) { + if (target.targetName.equals(targetName)) { + return Optional.of(target); + } + } + + return Optional.empty(); + } + + private final String targetName; + + ShedTarget(String targetName) { + this.targetName = targetName; + } + + public String targetName() { + return targetName; + } +} diff --git a/src/main/java/org/shedlang/compiler/backends/targets/WasmTarget.java b/src/main/java/org/shedlang/compiler/backends/targets/WasmTarget.java new file mode 100644 index 00000000..42aeea5c --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/targets/WasmTarget.java @@ -0,0 +1,102 @@ +package org.shedlang.compiler.backends.targets; + +import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmIndexType; +import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmValueType; + +import java.util.List; + +public enum WasmTarget { + WASM32( + "wasm32", + WasmIndexType.I32, + WasmValueType.I32, + List.of(), + List.of(), + List.of(), + List.of() + ), + WASM64( + "wasm64", + WasmIndexType.I64, + WasmValueType.I64, + List.of("-mwasm64"), + List.of("--enable-memory64"), + List.of(), + List.of("--wasm64") + ); + + private final String targetName; + private final WasmIndexType indexType; + private final WasmValueType sizeT; + private final List linkerFlags; + private final List wabtFlags; + private final List nodeFlags; + private final List runWasmFlags; + + WasmTarget( + String targetName, + WasmIndexType indexType, + WasmValueType sizeT, + List linkerFlags, + List wabtFlags, + List nodeFlags, + List runWasmFlags + ) { + this.targetName = targetName; + this.indexType = indexType; + this.sizeT = sizeT; + this.linkerFlags = linkerFlags; + this.wabtFlags = wabtFlags; + this.nodeFlags = nodeFlags; + this.runWasmFlags = runWasmFlags; + } + + public String targetName() { + return targetName; + } + + public WasmIndexType indexType() { + return indexType; + } + + public WasmValueType sizeT() { + return sizeT; + } + + public WasmValueType dataPtrType() { + return sizeT; + } + + public WasmValueType functionPtrType() { + // TODO: there's a problem here: wasm64 uses 32-bit function pointers, + // but C uses void* for all pointers, which will be 64-bit on wasm64. + // We could either: + // * Change the C definition of a closure to use a 32-bit int, and cast + // it to a void* on use, or + // * Change the Wasm backend to treat Patio function pointers as 64-bit, + // and convert from 32-bit to 64-bit when referencing table indices. + // We currently do the latter, but may want to consider the former (or + // some other alternative). + return sizeT; + } + + public WasmValueType patioIntType() { + return sizeT; + } + + public List linkerFlags() { + return linkerFlags; + } + + public List wabtFlags() { + return wabtFlags; + } + + public List nodeFlags() { + return this.nodeFlags; + } + + public List runWasmFlags() { + return this.runWasmFlags; + } +} diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java index 0260f120..8edbc42f 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/PatioToWasm.java @@ -3,6 +3,7 @@ package org.shedlang.compiler.backends.wasm; import org.pcollections.PMap; import org.pcollections.PStack; import org.pcollections.PVector; +import org.shedlang.compiler.backends.targets.WasmTarget; import org.shedlang.compiler.backends.wasm.structure.ast.instructions.*; import org.shedlang.compiler.backends.wasm.structure.ast.linking.WasmMemoryAddress; import org.shedlang.compiler.backends.wasm.structure.ast.modules.*; diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java index 7b9411b4..d39cae99 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java @@ -5,6 +5,7 @@ import org.shedlang.compiler.backends.Backend; import org.shedlang.compiler.backends.PatioBackends; import org.shedlang.compiler.backends.paths.PartialTargetPath; import org.shedlang.compiler.backends.paths.TargetDir; +import org.shedlang.compiler.backends.targets.WasmTarget; import org.shedlang.compiler.backends.wasm.structure.WasmBinaryFormat; import org.shedlang.compiler.backends.wasm.structure.ast.instructions.WasmCall; import org.shedlang.compiler.backends.wasm.structure.ast.instructions.WasmDrop; diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackendFactory.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackendFactory.java index 439bc05d..574c4220 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackendFactory.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackendFactory.java @@ -2,7 +2,8 @@ package org.shedlang.compiler.backends.wasm; import org.shedlang.compiler.backends.Backend; import org.shedlang.compiler.backends.BackendFactory; -import org.shedlang.compiler.backends.ShedTarget; +import org.shedlang.compiler.backends.targets.ShedTarget; +import org.shedlang.compiler.backends.targets.WasmTarget; import java.util.Optional; diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmTarget.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmTarget.java deleted file mode 100644 index 920b1cab..00000000 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmTarget.java +++ /dev/null @@ -1,102 +0,0 @@ -package org.shedlang.compiler.backends.wasm; - -import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmIndexType; -import org.shedlang.compiler.backends.wasm.structure.ast.types.WasmValueType; - -import java.util.List; - -public enum WasmTarget { - WASM32( - "wasm32", - WasmIndexType.I32, - WasmValueType.I32, - List.of(), - List.of(), - List.of(), - List.of() - ), - WASM64( - "wasm64", - WasmIndexType.I64, - WasmValueType.I64, - List.of("-mwasm64"), - List.of("--enable-memory64"), - List.of(), - List.of("--wasm64") - ); - - private final String targetName; - private final WasmIndexType indexType; - private final WasmValueType sizeT; - private final List linkerFlags; - private final List wabtFlags; - private final List nodeFlags; - private final List runWasmFlags; - - WasmTarget( - String targetName, - WasmIndexType indexType, - WasmValueType sizeT, - List linkerFlags, - List wabtFlags, - List nodeFlags, - List runWasmFlags - ) { - this.targetName = targetName; - this.indexType = indexType; - this.sizeT = sizeT; - this.linkerFlags = linkerFlags; - this.wabtFlags = wabtFlags; - this.nodeFlags = nodeFlags; - this.runWasmFlags = runWasmFlags; - } - - public String targetName() { - return targetName; - } - - public WasmIndexType indexType() { - return indexType; - } - - public WasmValueType sizeT() { - return sizeT; - } - - public WasmValueType dataPtrType() { - return sizeT; - } - - public WasmValueType functionPtrType() { - // TODO: there's a problem here: wasm64 uses 32-bit function pointers, - // but C uses void* for all pointers, which will be 64-bit on wasm64. - // We could either: - // * Change the C definition of a closure to use a 32-bit int, and cast - // it to a void* on use, or - // * Change the Wasm backend to treat Patio function pointers as 64-bit, - // and convert from 32-bit to 64-bit when referencing table indices. - // We currently do the latter, but may want to consider the former (or - // some other alternative). - return sizeT; - } - - public WasmValueType patioIntType() { - return sizeT; - } - - public List linkerFlags() { - return linkerFlags; - } - - public List wabtFlags() { - return wabtFlags; - } - - public List nodeFlags() { - return this.nodeFlags; - } - - public List runWasmFlags() { - return this.runWasmFlags; - } -} diff --git a/src/main/java/org/shedlang/compiler/cli/ShedCli.java b/src/main/java/org/shedlang/compiler/cli/ShedCli.java index 9ae3fb75..2c3e7a78 100644 --- a/src/main/java/org/shedlang/compiler/cli/ShedCli.java +++ b/src/main/java/org/shedlang/compiler/cli/ShedCli.java @@ -6,7 +6,7 @@ import net.sourceforge.argparse4j.inf.ArgumentParserException; import net.sourceforge.argparse4j.inf.Namespace; import org.shedlang.compiler.ShedCompiler; import org.shedlang.compiler.backends.Backends; -import org.shedlang.compiler.backends.ShedTarget; +import org.shedlang.compiler.backends.targets.ShedTarget; import org.shedlang.compiler.errors.CompilerError; import org.shedlang.compiler.sources.NullSource; diff --git a/src/main/java/org/shedlang/compiler/cli/UnsupportedTargetError.java b/src/main/java/org/shedlang/compiler/cli/UnsupportedTargetError.java index 265c2cdc..0a78433c 100644 --- a/src/main/java/org/shedlang/compiler/cli/UnsupportedTargetError.java +++ b/src/main/java/org/shedlang/compiler/cli/UnsupportedTargetError.java @@ -1,6 +1,6 @@ package org.shedlang.compiler.cli; -import org.shedlang.compiler.backends.ShedTarget; +import org.shedlang.compiler.backends.targets.ShedTarget; import org.shedlang.compiler.errors.CompilerError; import org.shedlang.compiler.sources.Sources; -- cgit v1.2.3