diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-17 19:27:40 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-17 19:35:40 +0100 |
| commit | ead99d70d1eeb48d3b2ca7dc757fb68a6c94e64a (patch) | |
| tree | 5457dd491d3743c448238a90a46c7f0d9e67ba3a /src/main/java | |
| parent | abee865f5088ac9812b71f929e07db5f60d9859c (diff) | |
Support external global definitions
Diffstat (limited to 'src/main/java')
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 |
