aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-06-17 19:27:40 +0100
committerMichael Williamson <mike@zwobble.org>2023-06-17 19:35:40 +0100
commitead99d70d1eeb48d3b2ca7dc757fb68a6c94e64a (patch)
tree5457dd491d3743c448238a90a46c7f0d9e67ba3a /src/main/java
parentabee865f5088ac9812b71f929e07db5f60d9859c (diff)
Support external global definitions
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java2
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java5
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java9
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmGlobalDefinition.java4
4 files changed, 14 insertions, 6 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java
index 60e6515b..980249e2 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java
@@ -123,7 +123,7 @@ public record LlvmCompilerContext(
var globalDefinition = new LlvmGlobalDefinition(
generateTopLevelEntityName(builder.namePrefix().orElseThrow()),
builder.type().orElseThrow(),
- builder.value().orElseThrow(),
+ builder.value(),
builder.constant(),
builder.isPrivate(),
builder.unnamedAddr()
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java
index 949ffa9c..5c0bbca5 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerNamespaces.java
@@ -12,6 +12,7 @@ import org.shedlang.compiler.types.NamespaceTypeInfo;
import java.util.Collections;
import java.util.List;
+import java.util.Optional;
import java.util.stream.IntStream;
public class LlvmCompilerNamespaces {
@@ -44,14 +45,14 @@ public class LlvmCompilerNamespaces {
return new LlvmGlobalDefinition(
globalNameNamespaceValue(namespaceName),
typeNamespaceStruct(namespaceTypeInfo),
- new LlvmOperandStructure(
+ Optional.of(new LlvmOperandStructure(
IntStream.range(0, namespaceTypeInfo.fieldCount())
.mapToObj(ignored -> new LlvmTypedOperand(
LlvmCompilerTypes.VALUE_TYPE,
new LlvmOperandInt(0)
))
.toList()
- ),
+ )),
false,
false,
false
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 5853fd6d..74a271ed 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
@@ -207,11 +207,16 @@ public class LlvmIrSerializer {
if (globalDefinition.unnamedAddr()) {
builder.append("unnamed_addr ");
}
+ if (globalDefinition.value().isEmpty()) {
+ builder.append("external ");
+ }
builder.append(globalDefinition.constant() ? "constant" : "global");
builder.append(" ");
serializeType(globalDefinition.type(), builder);
- builder.append(" ");
- serializeOperand(globalDefinition.value(), builder);
+ if (globalDefinition.value().isPresent()) {
+ builder.append(" ");
+ serializeOperand(globalDefinition.value().get(), builder);
+ }
builder.append("\n");
}
}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmGlobalDefinition.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmGlobalDefinition.java
index 68c9cd67..2f5f2e72 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmGlobalDefinition.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/LlvmGlobalDefinition.java
@@ -3,10 +3,12 @@ package org.shedlang.compiler.backends.llvm.ir.ast;
import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperand;
import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType;
+import java.util.Optional;
+
public record LlvmGlobalDefinition(
String name,
LlvmType type,
- LlvmOperand value,
+ Optional<LlvmOperand> value,
boolean constant,
boolean isPrivate,
boolean unnamedAddr