From 4ffc7f73ce8fbcff80ef1eec6c7098ec87d5ff99 Mon Sep 17 00:00:00 2001 From: willson walter Date: Sat, 18 Nov 2023 14:23:26 +0800 Subject: [PATCH] 1. Moving the block label to a separate Label class 2. Adding various utility methods for managing blocks Removing unused fields like predecessors 3. Changing CFGBuilder to build from LinearIRBlock instead of raw IR 4. Deleting the lombok dependency from pom.xml --- .../java/org/teachfx/antlr4/ep20/ir/Prog.java | 10 ++- .../org/teachfx/antlr4/ep20/ir/stmt/CJMP.java | 1 - .../teachfx/antlr4/ep20/ir/stmt/Label.java | 8 +- .../antlr4/ep20/pass/cfg/BasicBlock.java | 13 ++- .../antlr4/ep20/pass/cfg/CFGBuilder.java | 2 +- .../antlr4/ep20/pass/cfg/LinearIRBlock.java | 83 +++++++++++-------- pom.xml | 5 -- 7 files changed, 76 insertions(+), 46 deletions(-) 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