diff --git a/src/main/java/codegen/analysis/dataflow/DataFlowGraph.java b/src/main/java/codegen/analysis/dataflow/DataFlowGraph.java index f1aa55f..e0a970f 100644 --- a/src/main/java/codegen/analysis/dataflow/DataFlowGraph.java +++ b/src/main/java/codegen/analysis/dataflow/DataFlowGraph.java @@ -107,8 +107,9 @@ public final class DataFlowGraph implements Iterable { .append("node[shape=Mrecord]\n"); for (DataFlowNode node : this.dataFlowNodes) { - dot.append(node.getId()) - .append(" [label=\"{ ") + dot.append("\"") + .append(node.getId()) + .append("\" [label=\"{ ") .append(this.dataFlowNodes.indexOf(node)) .append("| ") .append(node.getInst()) @@ -118,13 +119,13 @@ public final class DataFlowGraph implements Iterable { dot.append("START[label=\"START\"];\n") .append("END[label=\"END\"];\n"); - dot.append("START -> ").append(this.dataFlowNodes.get(0).getId()).append(";\n"); - dot.append(this.dataFlowNodes.get(this.dataFlowNodes.size() - 1).getId()).append(" -> END;\n"); + dot.append("START -> \"").append(this.dataFlowNodes.get(0).getId()).append("\";\n"); + dot.append("\"").append(this.dataFlowNodes.get(this.dataFlowNodes.size() - 1).getId()).append("\" -> END;\n"); for (DataFlowNode node : this.dataFlowNodes) { for (DataFlowNode successor : node.getSuccessorSet()) { - dot.append(node.getId()).append(" -> ").append(successor.getId()).append(";\n"); + dot.append("\"").append(node.getId()).append("\" -> \"").append(successor.getId()).append("\";\n"); } } diff --git a/src/main/java/codegen/analysis/dataflow/DataFlowNode.java b/src/main/java/codegen/analysis/dataflow/DataFlowNode.java index 162b9c0..1ad340d 100644 --- a/src/main/java/codegen/analysis/dataflow/DataFlowNode.java +++ b/src/main/java/codegen/analysis/dataflow/DataFlowNode.java @@ -7,6 +7,7 @@ import java.util.Collections; import java.util.HashSet; import java.util.Objects; import java.util.Set; +import java.util.UUID; import java.util.stream.Collectors; /** @@ -15,7 +16,7 @@ import java.util.stream.Collectors; public final class DataFlowNode { // General graph structure information - private final String id; + private final UUID id; private final Set predecessors; private final Set successors; @@ -46,7 +47,7 @@ public final class DataFlowNode { */ private final Set out; - private DataFlowNode(String id, String inst, String use, String def) { + private DataFlowNode(UUID id, String inst, String use, String def) { this.id = id; this.inst = inst; this.use = use; @@ -80,7 +81,7 @@ public final class DataFlowNode { // Getters, Setters - public String getId() { + public UUID getId() { return this.id; } diff --git a/src/main/java/codegen/analysis/liveness/InterferenceGraph.java b/src/main/java/codegen/analysis/liveness/InterferenceGraph.java index 8004e79..44257f1 100644 --- a/src/main/java/codegen/analysis/liveness/InterferenceGraph.java +++ b/src/main/java/codegen/analysis/liveness/InterferenceGraph.java @@ -78,8 +78,9 @@ public final class InterferenceGraph implements Iterable { .append("node[shape=Mrecord]\n"); for (InterferenceNode node : this.interferenceNodes) { - dot.append(node.getSymbol()) - .append(" [label=\"{ Symbol: ") + dot.append("\"") + .append(node.getId()) + .append("\" [label=\"{ Symbol: ") .append(node.getSymbol()) .append("| Color: ") .append(node.getColor()) @@ -88,10 +89,10 @@ public final class InterferenceGraph implements Iterable { for (InterferenceNode node : this.interferenceNodes) { for (InterferenceNode neigh : node.getNeighbourSet()) { - if (!dot.toString().contains(neigh.getSymbol() + " -> " + node.getSymbol())) { + if (!dot.toString().contains(neigh.getId() + "\" -> \"" + node.getId())) { // No double lines - dot.append(node.getSymbol()).append(" -> ").append(neigh.getSymbol()).append(" [arrowhead=\"none\"];\n"); + dot.append("\"").append(node.getId()).append("\" -> \"").append(neigh.getId()).append("\" [arrowhead=\"none\"];\n"); } } } diff --git a/src/main/java/codegen/analysis/liveness/InterferenceNode.java b/src/main/java/codegen/analysis/liveness/InterferenceNode.java index 2e21072..a069cf1 100644 --- a/src/main/java/codegen/analysis/liveness/InterferenceNode.java +++ b/src/main/java/codegen/analysis/liveness/InterferenceNode.java @@ -4,12 +4,15 @@ import java.util.Collections; import java.util.HashSet; import java.util.Objects; import java.util.Set; +import java.util.UUID; /** * Repräsentiert eine Variable und ihre Farbe im Interferenzgraph. */ public class InterferenceNode { + private final UUID id; + /** * Der Name der Variable. */ @@ -26,6 +29,7 @@ public class InterferenceNode { private int color; public InterferenceNode(String symbol) { + this.id = UUID.randomUUID(); this.symbol = symbol; this.color = 0; this.neighbours = new HashSet<>(); @@ -37,6 +41,10 @@ public class InterferenceNode { // Getters, Setters + public UUID getId() { + return this.id; + } + public String getSymbol() { return this.symbol; } diff --git a/src/main/java/codegen/flowgraph/FlowBasicBlock.java b/src/main/java/codegen/flowgraph/FlowBasicBlock.java index 441d58b..905295b 100644 --- a/src/main/java/codegen/flowgraph/FlowBasicBlock.java +++ b/src/main/java/codegen/flowgraph/FlowBasicBlock.java @@ -8,12 +8,13 @@ import java.util.List; import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.UUID; import java.util.stream.Collectors; public class FlowBasicBlock implements Iterable { // Graph structure information - private final String id; + private final UUID id; private final Set predecessors; private final Set successors; @@ -35,7 +36,7 @@ public class FlowBasicBlock implements Iterable { public FlowBasicBlock(String label) { this.label = label; - this.id = String.valueOf(System.nanoTime()); + this.id = UUID.randomUUID(); this.instructions = new ArrayList<>(); this.predecessors = new HashSet<>(); this.successors = new HashSet<>(); @@ -55,7 +56,7 @@ public class FlowBasicBlock implements Iterable { // Geteter, Setter - public String getId() { + public UUID getId() { return this.id; } @@ -65,8 +66,7 @@ public class FlowBasicBlock implements Iterable { public void addInstruction(String instruction, String... args) { this.instNr++; - this.instructions.add(new FlowInstruction(String.valueOf(Long.parseLong(this.id) + this.instNr), - instruction, args)); + this.instructions.add(new FlowInstruction(instruction, args)); } public Set getBlockSuccessorSet() { diff --git a/src/main/java/codegen/flowgraph/FlowGraph.java b/src/main/java/codegen/flowgraph/FlowGraph.java index 31ce2b9..45970d9 100644 --- a/src/main/java/codegen/flowgraph/FlowGraph.java +++ b/src/main/java/codegen/flowgraph/FlowGraph.java @@ -214,8 +214,9 @@ public class FlowGraph implements Iterable { .append("node[shape=Mrecord]\n"); for (FlowBasicBlock block : this.basicBlocks) { - dot.append(block.getId()) - .append(" [label=\"{ ") + dot.append("\"") + .append(block.getId()) + .append("\" [label=\"{ ") .append(this.basicBlocks.indexOf(block)) .append(": ") .append(block.getLabel()) @@ -227,14 +228,14 @@ public class FlowGraph implements Iterable { dot.append("START[label=\"START\"];\n") .append("END[label=\"END\"];\n"); - dot.append("START -> ").append(this.basicBlocks.get(0).getId()).append(";\n"); - dot.append(currentBlock.get().getId()).append(" -> END;\n"); + dot.append("START -> \"").append(this.basicBlocks.get(0).getId()).append("\";\n"); + dot.append("\"").append(currentBlock.get().getId()).append("\" -> END;\n"); for (FlowBasicBlock block : this.basicBlocks) { // Successors for (FlowBasicBlock successor : block.getBlockSuccessorSet()) { - dot.append(block.getId()).append(" -> ").append(successor.getId()).append(";\n"); + dot.append("\"").append(block.getId()).append("\" -> \"").append(successor.getId()).append("\";\n"); } } diff --git a/src/main/java/codegen/flowgraph/FlowInstruction.java b/src/main/java/codegen/flowgraph/FlowInstruction.java index 52bbc01..b37d7c7 100644 --- a/src/main/java/codegen/flowgraph/FlowInstruction.java +++ b/src/main/java/codegen/flowgraph/FlowInstruction.java @@ -1,11 +1,13 @@ package codegen.flowgraph; +import java.util.UUID; + /** * Repräsentiert eine Instruction im {@link FlowGraph}. */ public class FlowInstruction { - private final String id; + private final UUID id; /** * Die Instruction ist der Jasmin-Assembler Befehl. @@ -13,13 +15,13 @@ public class FlowInstruction { private final String instruction; private final String[] args; - public FlowInstruction(String id, String instruction, String... args) { - this.id = id; + public FlowInstruction(String instruction, String... args) { + this.id = UUID.randomUUID(); this.instruction = instruction; this.args = args; } - public String getId() { + public UUID getId() { return this.id; }