aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-17 19:35:47 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-17 19:35:47 +0100
commit51f6b88390ce1c028fd1a3163f26620e6be16480 (patch)
treef26449e408cebc0bf7243c2621f9c6924e2bf63b /src/main/java
parentead99d70d1eeb48d3b2ca7dc757fb68a6c94e64a (diff)
Add LLVM function declarations
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java13
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmFunctionDeclaration.java12
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmTopLevelEntity.java2
3 files changed, 26 insertions, 1 deletions
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 74a271ed..0b1ff62b 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
@@ -180,6 +180,19 @@ public class LlvmIrSerializer {
public static void serializeTopLevelEntity(LlvmTopLevelEntity entity, StringBuilder builder) {
switch (entity) {
+ case LlvmFunctionDeclaration functionDeclaration -> {
+ builder.append("declare ");
+ serializeType(functionDeclaration.returnType(), builder);
+ builder.append(" @");
+ builder.append(functionDeclaration.name());
+ builder.append("(");
+ forEachInterspersed(
+ functionDeclaration.params(),
+ param -> serializeParam(param, builder),
+ () -> builder.append(", ")
+ );
+ builder.append(")\n");
+ }
case LlvmFunctionDefinition functionDefinition -> {
builder.append("define ");
serializeType(functionDefinition.returnType(), builder);
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmFunctionDeclaration.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmFunctionDeclaration.java
new file mode 100644
index 00000000..4abd406c
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmFunctionDeclaration.java
@@ -0,0 +1,12 @@
+package org.shedlang.compiler.backends.llvm.ir.ast;
+
+import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType;
+
+import java.util.List;
+
+public record LlvmFunctionDeclaration(
+ String name,
+ LlvmType returnType,
+ List<LlvmParam> params
+) implements LlvmTopLevelEntity {
+}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmTopLevelEntity.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmTopLevelEntity.java
index b1cabfa0..376664f2 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmTopLevelEntity.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmTopLevelEntity.java
@@ -1,5 +1,5 @@
package org.shedlang.compiler.backends.llvm.ir.ast;
-public sealed interface LlvmTopLevelEntity permits LlvmFunctionDefinition, LlvmGlobalDefinition {
+public sealed interface LlvmTopLevelEntity permits LlvmFunctionDeclaration, LlvmFunctionDefinition, LlvmGlobalDefinition {
String name();
}