aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-08 16:41:55 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-08 16:45:35 +0100
commit2e491ca13d1035e10f4c5ed51af3d5246596820d (patch)
treea85203ccdb52aaa483e1ea879c147820aa040b04 /src/main/java
parent4b1a767cd808e5f749c5d5619a6e871a7ef7d3f9 (diff)
Use LlvmVariableLocal for labels
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java18
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/LlvmIrSerializer.java20
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBr.java5
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBrUnconditional.java4
-rw-r--r--src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmSwitch.java5
5 files changed, 28 insertions, 24 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
index 79f2e99f..fce77ab8 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmPatioCodeGen.java
@@ -293,8 +293,8 @@ public class LlvmPatioCodeGen {
context = context.addTerminatorInstruction(new LlvmBr(
patioOperandToLlvmOperand(patioIf.condition(), context),
- ifTrueStartLabel.name(),
- ifFalseStartLabel.name()
+ ifTrueStartLabel,
+ ifFalseStartLabel
));
context = generateBranches(
@@ -408,7 +408,7 @@ public class LlvmPatioCodeGen {
var loopEndLabel = loopEndLabelResult.value();
context = loopEndLabelResult.context();
- context = context.addTerminatorInstruction(new LlvmBrUnconditional(loopStartLabel.name()));
+ context = context.addTerminatorInstruction(new LlvmBrUnconditional(loopStartLabel));
context = context.setBasicBlockLabel(loopStartLabel.name());
@@ -422,10 +422,10 @@ public class LlvmPatioCodeGen {
}
case PatioLoopBreak patioLoopBreak ->
- context.addTerminatorInstruction(new LlvmBrUnconditional(context.loopEndLabel().name()));
+ context.addTerminatorInstruction(new LlvmBrUnconditional(context.loopEndLabel()));
case PatioLoopContinue patioLoopContinue ->
- context.addTerminatorInstruction(new LlvmBrUnconditional(context.loopStartLabel().name()));
+ context.addTerminatorInstruction(new LlvmBrUnconditional(context.loopStartLabel()));
case PatioMemoryLoad patioMemoryLoad -> {
var targetResult = context.addPatioLocalToLlvmLocal(patioMemoryLoad.target());
@@ -517,7 +517,7 @@ public class LlvmPatioCodeGen {
llvmSwitchCases.add(new LlvmSwitch.Case(
patioSwitchCase.value(),
- caseStartLabel.name()
+ caseStartLabel
));
}
@@ -531,7 +531,7 @@ public class LlvmPatioCodeGen {
context = context.addTerminatorInstruction(new LlvmSwitch(
LlvmTypes.INT_64,
patioOperandToLlvmOperand(patioSwitch.value(), context),
- switchDefaultLabel.name(),
+ switchDefaultLabel,
llvmSwitchCases
));
@@ -609,12 +609,12 @@ public class LlvmPatioCodeGen {
if (!endIsUnreachable) {
var branchEndLabel = branch.endLabel.orElseThrow();
context = context.addTerminatorInstruction(new LlvmBrUnconditional(
- branchEndLabel.name()
+ branchEndLabel
));
// TODO: only allow basic block label to be set with terminator instruction?
context = context.setBasicBlockLabel(branchEndLabel.name());
context = context.addTerminatorInstruction(new LlvmBrUnconditional(
- endLabel.name()
+ endLabel
));
phiPredecessors.add(new PhiPredecessor(branch.body, branchEndLabel));
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 3e2d597b..d3672574 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
@@ -236,14 +236,14 @@ public class LlvmIrSerializer {
case LlvmBr br -> {
writer.append("br i1 ");
serializeOperand(br.condition(), writer);
- writer.append(", label %");
- writer.append(br.ifTrueLabel());
- writer.append(", label %");
- writer.append(br.ifFalseLabel());
+ writer.append(", label ");
+ serializeVariable(br.ifTrueLabel(), writer);
+ writer.append(", label ");
+ serializeVariable(br.ifFalseLabel(), writer);
}
case LlvmBrUnconditional br -> {
- writer.append("br label %");
- writer.append(br.targetLabel());
+ writer.append("br label ");
+ serializeVariable(br.targetLabel(), writer);
}
case LlvmReturn returnValue -> {
writer.append("ret ");
@@ -259,16 +259,16 @@ public class LlvmIrSerializer {
serializeType(switch_.valueType(), writer);
writer.append(" ");
serializeOperand(switch_.value(), writer);
- writer.append(", label %");
- writer.append(switch_.defaultDestLabel());
+ writer.append(", label ");
+ serializeVariable(switch_.defaultDestLabel(), writer);
writer.append(" [\n");
for (var switchCase : switch_.cases()) {
writer.append(" ");
serializeType(switch_.valueType(), writer);
writer.append(" ");
writer.append(Integer.toString(switchCase.value()));
- writer.append(", label %");
- writer.append(switchCase.destLabel());
+ writer.append(", label ");
+ serializeVariable(switchCase.destLabel(), writer);
writer.append("\n");
}
writer.append("]");
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBr.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBr.java
index 2fa3e127..c985445b 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBr.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBr.java
@@ -1,10 +1,11 @@
package org.shedlang.compiler.backends.llvm.ir.ast.instructions;
import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperand;
+import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariableLocal;
public record LlvmBr(
LlvmOperand condition,
- String ifTrueLabel,
- String ifFalseLabel
+ LlvmVariableLocal ifTrueLabel,
+ LlvmVariableLocal ifFalseLabel
) implements LlvmTerminatorInstruction {
}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBrUnconditional.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBrUnconditional.java
index 0a33022b..47c6d344 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBrUnconditional.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmBrUnconditional.java
@@ -1,6 +1,8 @@
package org.shedlang.compiler.backends.llvm.ir.ast.instructions;
+import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariableLocal;
+
public record LlvmBrUnconditional(
- String targetLabel
+ LlvmVariableLocal targetLabel
) implements LlvmTerminatorInstruction {
}
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmSwitch.java b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmSwitch.java
index c3aecc68..6720fbbf 100644
--- a/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmSwitch.java
+++ b/src/main/java/org/shedlang/compiler/backends/llvm/ir/ast/instructions/LlvmSwitch.java
@@ -1,6 +1,7 @@
package org.shedlang.compiler.backends.llvm.ir.ast.instructions;
import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmOperand;
+import org.shedlang.compiler.backends.llvm.ir.ast.operands.LlvmVariableLocal;
import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType;
import java.util.List;
@@ -8,8 +9,8 @@ import java.util.List;
public record LlvmSwitch(
LlvmType valueType,
LlvmOperand value,
- String defaultDestLabel,
+ LlvmVariableLocal defaultDestLabel,
List<Case> cases
) implements LlvmTerminatorInstruction {
- public record Case(int value, String destLabel) {}
+ public record Case(int value, LlvmVariableLocal destLabel) {}
}