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 db430dd..963b9a1 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 @@ -2,6 +2,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.NotNull; import org.teachfx.antlr4.ep20.ir.stmt.CJMP; import org.teachfx.antlr4.ep20.ir.stmt.FuncEntryLabel; import org.teachfx.antlr4.ep20.ir.stmt.JMP; @@ -33,17 +34,19 @@ public void addBlock(LinearIRBlock linearIRBlock) { blockList.add(linearIRBlock); } - private void linearInstrsImpl(LinearIRBlock linearIRBlock) { + private void linearInstrsImpl(@NotNull LinearIRBlock linearIRBlock) { + // Add all instr from non-empty block if (!linearIRBlock.getStmts().isEmpty()) { if (!linearIRBlock.getJmpRefMap().isEmpty()){ - instrs.add(new Label(linearIRBlock.toString(),null)); + instrs.add(linearIRBlock.getLabel()); } instrs.addAll(linearIRBlock.getStmts()); } else { + // Drop empty block if (linearIRBlock.getSuccessors().isEmpty()) { return; } - + // Auto-fill next block for jmp/cjmp var nextBlock = linearIRBlock.getSuccessors().get(0); for (var ref : linearIRBlock.getJmpRefMap()){ if (ref instanceof JMP jmp) { @@ -55,6 +58,7 @@ private void linearInstrsImpl(LinearIRBlock linearIRBlock) { } + // recursive call 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 f3ae75f..85fe7ed 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 @@ -6,7 +6,6 @@ public class CJMP extends Stmt { public VarSlot cond; - private LinearIRBlock thenBlock; private LinearIRBlock elseBlock; diff --git a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/stmt/Label.java b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/stmt/Label.java index af50856..07dd151 100644 --- a/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/stmt/Label.java +++ b/ep20/src/main/java/org/teachfx/antlr4/ep20/ir/stmt/Label.java @@ -1,6 +1,5 @@ package org.teachfx.antlr4.ep20.ir.stmt; -import lombok.Getter; import org.teachfx.antlr4.ep20.ir.IRVisitor; import org.teachfx.antlr4.ep20.symtab.scope.Scope; @@ -10,7 +9,6 @@ public class Label extends Stmt { private Stmt nextEntry = null; - private String rawLabel; @@ -25,6 +23,12 @@ public Label(String rawLabel, Scope scope) { } } + public Label(Scope scope) { + this.scope = scope; + this.seq = scope.getLabelSeq(); + this.rawLabel = null; + } + public void setRawLabel(String rawLabel) { this.rawLabel = rawLabel; } 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 84de4a6..0e7cc5f 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,5 +1,6 @@ package org.teachfx.antlr4.ep20.pass.cfg; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.teachfx.antlr4.ep20.ir.IRNode; @@ -17,7 +18,7 @@ public class BasicBlock implements Iterable> { // Generate codes public List> codes; - public int id; + public final int id; protected Optional