diff --git a/ep20/pom.xml b/ep20/pom.xml index ea5232e..290daff 100644 --- a/ep20/pom.xml +++ b/ep20/pom.xml @@ -20,12 +20,6 @@ - - org.jgrapht - jgrapht-core - 1.5.2 - compile - org.jetbrains annotations diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/Compiler.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/Compiler.java index 001e206..dab69c9 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/Compiler.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/Compiler.java @@ -7,16 +7,12 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.teachfx.antlr4.ep20.ast.ASTNode; -import org.teachfx.antlr4.ep20.driver.Phase; import org.teachfx.antlr4.ep20.ir.IRNode; -import org.teachfx.antlr4.ep20.ir.Prog; import org.teachfx.antlr4.ep20.ir.stmt.Label; import org.teachfx.antlr4.ep20.parser.CymbolLexer; import org.teachfx.antlr4.ep20.parser.CymbolParser; import org.teachfx.antlr4.ep20.pass.ast.CymbolASTBuilder; //import org.teachfx.antlr4.ep20.pass.ir.CymbolIRBuilder; -import org.teachfx.antlr4.ep20.pass.cfg.BasicBlock; -import org.teachfx.antlr4.ep20.pass.cfg.ControlFlowAnalysis; import org.teachfx.antlr4.ep20.pass.codegen.CymbolAssembler; import org.teachfx.antlr4.ep20.pass.ir.CymbolIRBuilder; import org.teachfx.antlr4.ep20.pass.symtab.LocalDefine; diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/Prog.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/Prog.java index eea0d20..db430dd 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/Prog.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/Prog.java @@ -1,13 +1,12 @@ package org.teachfx.antlr4.ep20.ir; -import lombok.extern.log4j.Log4j2; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.teachfx.antlr4.ep20.ir.stmt.CJMP; import org.teachfx.antlr4.ep20.ir.stmt.FuncEntryLabel; import org.teachfx.antlr4.ep20.ir.stmt.JMP; import org.teachfx.antlr4.ep20.ir.stmt.Label; -import org.teachfx.antlr4.ep20.pass.cfg.BasicBlock; +import org.teachfx.antlr4.ep20.pass.cfg.LinearIRBlock; import java.util.ArrayList; import java.util.LinkedList; @@ -16,7 +15,7 @@ public class Prog extends IRNode { - public List blockList; + public List blockList; protected static Logger logger = LogManager.getLogger(Prog.class); public List instrs = new ArrayList<>(); @@ -30,23 +29,23 @@ public S accept(IRVisitor visitor){ return visitor.visit(this); } - public void addBlock(BasicBlock basicBlock) { - blockList.add(basicBlock); + public void addBlock(LinearIRBlock linearIRBlock) { + blockList.add(linearIRBlock); } - private void linearInstrsImpl(BasicBlock basicBlock) { - if (!basicBlock.getStmts().isEmpty()) { - if (!basicBlock.getJmpRefMap().isEmpty()){ - instrs.add(new Label(basicBlock.toString(),null)); + private void linearInstrsImpl(LinearIRBlock linearIRBlock) { + if (!linearIRBlock.getStmts().isEmpty()) { + if (!linearIRBlock.getJmpRefMap().isEmpty()){ + instrs.add(new Label(linearIRBlock.toString(),null)); } - instrs.addAll(basicBlock.getStmts()); + instrs.addAll(linearIRBlock.getStmts()); } else { - if (basicBlock.getSuccessors().isEmpty()) { + if (linearIRBlock.getSuccessors().isEmpty()) { return; } - var nextBlock = basicBlock.getSuccessors().get(0); - for (var ref : basicBlock.getJmpRefMap()){ + var nextBlock = linearIRBlock.getSuccessors().get(0); + for (var ref : linearIRBlock.getJmpRefMap()){ if (ref instanceof JMP jmp) { jmp.next = nextBlock; } else if (ref instanceof CJMP cjmp) { @@ -56,7 +55,7 @@ private void linearInstrsImpl(BasicBlock basicBlock) { } - for(var successor : basicBlock.getSuccessors()){ + for(var successor : linearIRBlock.getSuccessors()){ linearInstrsImpl(successor); } } diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/stmt/CJMP.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/stmt/CJMP.java index b282597..f3ae75f 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/stmt/CJMP.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/stmt/CJMP.java @@ -1,17 +1,17 @@ package org.teachfx.antlr4.ep20.ir.stmt; -import org.teachfx.antlr4.ep20.pass.cfg.BasicBlock; +import org.teachfx.antlr4.ep20.pass.cfg.LinearIRBlock; import org.teachfx.antlr4.ep20.ir.IRVisitor; import org.teachfx.antlr4.ep20.ir.expr.VarSlot; public class CJMP extends Stmt { public VarSlot cond; - private BasicBlock thenBlock; - private BasicBlock elseBlock; + private LinearIRBlock thenBlock; + private LinearIRBlock elseBlock; - public CJMP(VarSlot cond, BasicBlock thenLabel, BasicBlock elseLabel) { + public CJMP(VarSlot cond, LinearIRBlock thenLabel, LinearIRBlock elseLabel) { this.cond = cond; this.thenBlock = thenLabel; this.elseBlock = elseLabel; @@ -34,21 +34,21 @@ public String toString() { return "jmpIf %s,%s,%s".formatted(cond,thenBlock,elseBlock); } - public void setElseBlock(BasicBlock elseBlock) { + public void setElseBlock(LinearIRBlock elseBlock) { this.elseBlock = elseBlock; elseBlock.refJMP(this); } - public void setThenBlock(BasicBlock thenBlock) { + public void setThenBlock(LinearIRBlock thenBlock) { this.thenBlock = thenBlock; thenBlock.refJMP(this); } - public BasicBlock getElseBlock() { + public LinearIRBlock getElseBlock() { return elseBlock; } - public BasicBlock getThenBlock() { + public LinearIRBlock getThenBlock() { return thenBlock; } } diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/stmt/JMP.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/stmt/JMP.java index ea89a39..839b015 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/stmt/JMP.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/stmt/JMP.java @@ -1,6 +1,6 @@ package org.teachfx.antlr4.ep20.ir.stmt; -import org.teachfx.antlr4.ep20.pass.cfg.BasicBlock; +import org.teachfx.antlr4.ep20.pass.cfg.LinearIRBlock; import org.teachfx.antlr4.ep20.ir.IRVisitor; public class JMP extends Stmt @@ -10,12 +10,12 @@ public S accept(IRVisitor visitor) { return visitor.visit(this); } - public JMP(BasicBlock block) + public JMP(LinearIRBlock block) { this.next = block; block.refJMP(this); } - public BasicBlock next; + public LinearIRBlock next; @Override public StmtType getStmtType() { 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 555b34b..fd7944c 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,140 +1,62 @@ 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.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.symtab.scope.Scope; +import org.teachfx.antlr4.ep20.ir.stmt.Label; +import org.teachfx.antlr4.ep20.utils.Kind; -import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +import java.util.Optional; -public class BasicBlock { +public class BasicBlock implements Iterable> { - public enum Kind { - /// No jump instruction - CONTINUOUS, - /// Conditional instruction - END_BY_CJMP, - /// Unconditional jump instruction - END_BY_JMP, - /// Return instruction - END_BY_RETURN - } - - public Kind kind = Kind.CONTINUOUS; - private static int LABEL_SEQ = 1; - private ArrayList stmts; - - private List successors; - - private List predecessors; - - protected Scope scope = null; - - private List jmpRefMap = new ArrayList<>(); - - private int ord = 0; - - public BasicBlock() { - stmts = new ArrayList<>(); - successors = new ArrayList<>(); - predecessors = new ArrayList<>(); - ord = LABEL_SEQ++; - } + // Generate codes + public List> codes; - public void addStmt(IRNode stmt) { - stmts.add(stmt); - updateKindByLastInstr(stmt); - } + public int id; - private void updateKindByLastInstr(IRNode stmt) { - if (stmt instanceof CJMP) { - kind = Kind.END_BY_CJMP; - } else if (stmt instanceof JMP) { - kind = Kind.END_BY_JMP; - } else if (stmt instanceof ReturnVal) { - kind = Kind.END_BY_RETURN; - } else { - kind = Kind.CONTINUOUS; - } - } - public static boolean isBasicBlock(Stmt stmt) { - return !(stmt instanceof CJMP) && !(stmt instanceof JMP); - } + protected Optional