diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/BasicBlock.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/BasicBlock.java index fd7944c..84de4a6 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/BasicBlock.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/BasicBlock.java @@ -1,13 +1,16 @@ package org.teachfx.antlr4.ep20.pass.cfg; import org.jetbrains.annotations.NotNull; + import org.teachfx.antlr4.ep20.ir.IRNode; +import org.teachfx.antlr4.ep20.ir.expr.Operand; import org.teachfx.antlr4.ep20.ir.stmt.Label; import org.teachfx.antlr4.ep20.utils.Kind; import java.util.Iterator; import java.util.List; import java.util.Optional; +import java.util.Set; public class BasicBlock implements Iterable> { @@ -57,6 +60,23 @@ public int getId() { public boolean isEmpty() { return codes.isEmpty(); } + public List> allSeq() { + if (kind.equals(Kind.CONTINUOUS)){ + return codes; + } + return codes.subList(0, codes.size() - 1); + } + + public I getLastInstr() { + return codes.get(codes.size() - 1).instr; + } + + // For data flow analysis + public Set def; + + public Set liveUse; + public Set liveIn; + public Set liveOut; } \ No newline at end of file diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/CFG.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/CFG.java index b276dd0..8847590 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/CFG.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/CFG.java @@ -1,21 +1,19 @@ package org.teachfx.antlr4.ep20.pass.cfg; import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.NotNull; import org.teachfx.antlr4.ep20.ir.IRNode; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; +import java.util.*; -public class CFG { - public final List nodes; +public class CFG implements Iterable> { + public final List> nodes; public final List> edges; private List, Set>> links; - public CFG(List nodes, List> edges) { + public CFG(List> nodes, List> edges) { // Generate init this.nodes = nodes; this.edges = edges; @@ -33,4 +31,30 @@ public CFG(List nodes, List> edges) { } } + + public BasicBlock getBlock(int id) { + return nodes.get(id); + } + + public Set getPrev(int id) { + return links.get(id).getLeft(); + } + + public Set getSucceed(int id) { + return links.get(id).getRight(); + } + + public int getInDegree(int id) { + return links.get(id).getLeft().size(); + } + + public int getOutDegree(int id) { + return links.get(id).getRight().size(); + } + + @NotNull + @Override + public Iterator> iterator() { + return nodes.iterator(); + } } diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/CFGBuilder.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/CFGBuilder.java index e9494bb..8082445 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/CFGBuilder.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/CFGBuilder.java @@ -1,2 +1,11 @@ -package org.teachfx.antlr4.ep20.pass.cfg;public class CFGBuilder { +package org.teachfx.antlr4.ep20.pass.cfg; + +import org.teachfx.antlr4.ep20.ir.IRNode; + +import java.util.List; + +public class CFGBuilder { + public CFGBuilder(List instrs){ + + } } diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/LinearIRBlock.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/LinearIRBlock.java index 4a035c6..f07d74b 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/LinearIRBlock.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/pass/cfg/LinearIRBlock.java @@ -1,10 +1,7 @@ package org.teachfx.antlr4.ep20.pass.cfg; import org.teachfx.antlr4.ep20.ir.IRNode; -import org.teachfx.antlr4.ep20.ir.stmt.CJMP; -import org.teachfx.antlr4.ep20.ir.stmt.JMP; -import org.teachfx.antlr4.ep20.ir.stmt.ReturnVal; -import org.teachfx.antlr4.ep20.ir.stmt.Stmt; +import org.teachfx.antlr4.ep20.ir.stmt.*; import org.teachfx.antlr4.ep20.symtab.scope.Scope; import org.teachfx.antlr4.ep20.utils.Kind; @@ -99,6 +96,12 @@ public void setScope(Scope scope) { @Override public String toString() { + var firstInstr = stmts.get(0); + + if (firstInstr instanceof Label){ + return firstInstr.toString(); + } + return "L"+ord; }