Skip to content

Commit 0c22bc0

Browse files
committed
Working on sequencer logic
1 parent 68bdb9d commit 0c22bc0

20 files changed

Lines changed: 887 additions & 685 deletions

src/main/java/de/mirkosertic/metair/ir/CFGDominatorTree.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ private Node intersectIDoms(Node v1, Node v2) {
110110
}
111111

112112
/**
113-
* Check wheter a node dominates another one.
113+
* Check whether a node dominates another one.
114114
*
115115
* @return true, if <code>dominator</code> dominates <code>dominated</code> w.r.t to the entry node
116116
*/

src/main/java/de/mirkosertic/metair/ir/DOTExporter.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ public static void writeTo(final CFGDominatorTree tree, final PrintStream ps) {
349349
c3 [style = invis];
350350
d8 [style = invis];
351351
d9 [style = invis];
352-
352+
353353
}
354354
c0 -> c1 [label="Control flow", style=solid, color=red]
355355
c2 -> c3 [label="Control flow back edge", style=dashed, color=red]
@@ -369,8 +369,8 @@ public static void writeBytecodeCFGTo(final MethodAnalyzer analyzer, final Print
369369
if (optCode.isPresent()) {
370370
final CodeModel code = optCode.get();
371371

372-
final MethodAnalyzer.Frame[] frames = analyzer.getFrames();
373-
final List<MethodAnalyzer.Frame> topologicalOrder = analyzer.getCodeModelTopologicalOrder();
372+
final Frame[] frames = analyzer.getFrames();
373+
final List<Frame> topologicalOrder = analyzer.getCodeModelTopologicalOrder();
374374

375375
final List<CodeElement> elements = code.elementList();
376376
for (int i = 0; i < elements.size(); i++) {
@@ -393,9 +393,9 @@ public static void writeBytecodeCFGTo(final MethodAnalyzer analyzer, final Print
393393
}
394394

395395
for (int elementIndex = 0; elementIndex < frames.length; elementIndex++) {
396-
final MethodAnalyzer.Frame frame = frames[elementIndex];
396+
final Frame frame = frames[elementIndex];
397397
if (frame != null) {
398-
for (final MethodAnalyzer.CFGEdge edge : frame.predecessors) {
398+
for (final FrameCFGEdge edge : frame.predecessors) {
399399
ps.print(" node");
400400
ps.print(edge.fromIndex());
401401
ps.print(" -> node");
@@ -406,6 +406,13 @@ public static void writeBytecodeCFGTo(final MethodAnalyzer analyzer, final Print
406406
}
407407
ps.println("];");
408408
}
409+
if (frame.immediateDominator != null) {
410+
ps.print(" node");
411+
ps.print(elementIndex);
412+
ps.print(" -> node");
413+
ps.print(topologicalOrder.indexOf(frame.immediateDominator));
414+
ps.println("[color=fuchsia];");
415+
}
409416
}
410417
}
411418
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package de.mirkosertic.metair.ir;
2+
3+
import java.lang.classfile.CodeElement;
4+
import java.lang.classfile.attribute.StackMapFrameInfo;
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
8+
public class Frame {
9+
10+
protected final CodeElement codeElement;
11+
protected final List<FrameCFGEdge> predecessors;
12+
protected Frame immediateDominator;
13+
protected final int elementIndex;
14+
protected int indexInTopologicalOrder;
15+
protected Node entryPoint;
16+
protected Status in;
17+
protected Status out;
18+
protected List<StackMapFrameInfo> verificationInfos;
19+
20+
public Frame(final int elementIndex, final CodeElement codeElement) {
21+
this.predecessors = new ArrayList<>();
22+
this.elementIndex = elementIndex;
23+
this.indexInTopologicalOrder = -1;
24+
this.codeElement = codeElement;
25+
}
26+
27+
public Status copyIncomingToOutgoing() {
28+
out = in.copy();
29+
return out;
30+
}
31+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package de.mirkosertic.metair.ir;
2+
3+
public record FrameCFGEdge(int fromIndex, FrameNamedProjection projection, FlowType flowType) {
4+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package de.mirkosertic.metair.ir;
2+
3+
public record FrameNamedProjection(String name) {
4+
public static final FrameNamedProjection DEFAULT = new FrameNamedProjection("default");
5+
}

src/main/java/de/mirkosertic/metair/ir/Goto.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,15 @@ public class Goto extends Node {
99
public String debugDescription() {
1010
return getClass().getSimpleName();
1111
}
12+
13+
public Node getJumpTarget() {
14+
for (final Node user : usedBy) {
15+
for (final UseEdge edge : user.uses) {
16+
if (edge.node() == this && edge.use() instanceof ControlFlowUse) {
17+
return user;
18+
}
19+
}
20+
}
21+
throw new IllegalStateException("Cannot find the jump target");
22+
}
1223
}

src/main/java/de/mirkosertic/metair/ir/LoopHeaderNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package de.mirkosertic.metair.ir;
22

3-
public class LoopHeaderNode extends MultiInputNode {
3+
public class LoopHeaderNode extends Node {
44

55
public final String label;
66

src/main/java/de/mirkosertic/metair/ir/MergeNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package de.mirkosertic.metair.ir;
22

3-
public class MergeNode extends MultiInputNode {
3+
public class MergeNode extends Node {
44

55
public final String label;
66

0 commit comments

Comments
 (0)