From 825e851df3bb56e00d6d434bb0491ffd4112cead Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 14 Jun 2023 19:18:32 +0100 Subject: Add LLVM function type --- .../shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java | 10 ++++++++++ .../shedlang/compiler/backends/llvm/ir/ast/types/LlvmType.java | 2 +- .../compiler/backends/llvm/ir/ast/types/LlvmTypeFunction.java | 9 +++++++++ .../compiler/backends/llvm/ir/ast/types/LlvmTypes.java | 7 +++++++ 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypeFunction.java (limited to 'src/main/java') 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 9bceaf45..b78ed21e 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 @@ -191,6 +191,16 @@ public class LlvmIrSerializer { serializeType(pointer.elementType(), builder); builder.append(" *"); } + case LlvmTypeFunction function -> { + serializeType(function.returnType(), builder); + builder.append(" ("); + forEachInterspersed( + function.paramTypes(), + paramType -> serializeType(paramType, builder), + () -> builder.append(", ") + ); + builder.append(")"); + } } } diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmType.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmType.java index dec3db7e..16e33790 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmType.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmType.java @@ -1,4 +1,4 @@ package org.shedlang.compiler.backends.llvm.ir.ast.types; -public sealed interface LlvmType permits LlvmTypeArray, LlvmTypePointer, LlvmTypeScalar, LlvmTypeStructure { +public sealed interface LlvmType permits LlvmTypeArray, LlvmTypeFunction, LlvmTypePointer, LlvmTypeScalar, LlvmTypeStructure { } diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypeFunction.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypeFunction.java new file mode 100644 index 00000000..c6c3bfba --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypeFunction.java @@ -0,0 +1,9 @@ +package org.shedlang.compiler.backends.llvm.ir.ast.types; + +import java.util.List; + +public record LlvmTypeFunction( + LlvmType returnType, + List paramTypes +) implements LlvmType { +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypes.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypes.java index b22cda43..e507546a 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypes.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/types/LlvmTypes.java @@ -15,6 +15,13 @@ public class LlvmTypes { return new LlvmTypeArray(size, elementType); } + public static LlvmTypeFunction function( + LlvmType returnType, + List paramTypes + ) { + return new LlvmTypeFunction(returnType, paramTypes); + } + public static LlvmTypePointer pointer(LlvmType elementType) { return new LlvmTypePointer(elementType); } -- cgit v1.2.3