Skip to content

Commit

Permalink
Refactor operand stack and cleanup code
Browse files Browse the repository at this point in the history
- Renamed StackSlot to OperandSlot
- Removed unused imports and code
- Added ord field to BasicBlock
- Removed FuncEntryLabel usage
- Removed unused method parameters
  • Loading branch information
whtoo committed Nov 14, 2023
1 parent e37138f commit 031a2eb
Show file tree
Hide file tree
Showing 12 changed files with 32 additions and 37 deletions.
4 changes: 2 additions & 2 deletions ep20/src/main/java/org/teachfx/antlr4/ep20/ir/IRVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import org.teachfx.antlr4.ep20.ir.expr.CallFunc;
import org.teachfx.antlr4.ep20.ir.expr.addr.FrameSlot;
import org.teachfx.antlr4.ep20.ir.expr.addr.StackSlot;
import org.teachfx.antlr4.ep20.ir.expr.addr.OperandSlot;
import org.teachfx.antlr4.ep20.ir.expr.arith.BinExpr;
import org.teachfx.antlr4.ep20.ir.expr.arith.UnaryExpr;
import org.teachfx.antlr4.ep20.ir.expr.val.ConstVal;
Expand All @@ -28,7 +28,7 @@ public interface IRVisitor<S,E> {

S visit(Prog prog);

E visit(StackSlot stackSlot);
E visit(OperandSlot operandSlot);

E visit(FrameSlot frameSlot);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,8 @@


import org.teachfx.antlr4.ep20.ir.IRVisitor;
import org.teachfx.antlr4.ep20.ir.expr.addr.StackSlot;
import org.teachfx.antlr4.ep20.symtab.symbol.MethodSymbol;

import java.util.List;

public class CallFunc extends Expr {
protected MethodSymbol funcType;
protected String funcName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@
import org.teachfx.antlr4.ep20.ir.IRVisitor;
import org.teachfx.antlr4.ep20.ir.expr.VarSlot;

public class StackSlot extends VarSlot {
public class OperandSlot extends VarSlot {
private static int ordSeq = 0;

public static StackSlot genTemp() {
return new StackSlot();
public static OperandSlot genTemp() {
return new OperandSlot();
}

private int ord = 0;
private StackSlot() {
this.ord = StackSlot.ordSeq++;
private OperandSlot() {
this.ord = OperandSlot.ordSeq++;
}
public int getOrd() {
return ord;
Expand All @@ -29,7 +29,7 @@ public <S, E> E accept(IRVisitor<S, E> visitor) {
}


public static StackSlot pushStack() { return StackSlot.genTemp(); }
public static OperandSlot pushStack() { return OperandSlot.genTemp(); }
public static void popStack() { ordSeq--;}

public static int getOrdSeq() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import org.teachfx.antlr4.ep20.ir.IRVisitor;
import org.teachfx.antlr4.ep20.ir.expr.Expr;
import org.teachfx.antlr4.ep20.ir.expr.VarSlot;
import org.teachfx.antlr4.ep20.ir.expr.addr.StackSlot;
import org.teachfx.antlr4.ep20.symtab.type.OperatorType;
import org.teachfx.antlr4.ep20.symtab.type.OperatorType.UnaryOpType;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import org.teachfx.antlr4.ep20.ir.IRNode;
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.Stmt;
import org.teachfx.antlr4.ep20.symtab.scope.Scope;
Expand Down Expand Up @@ -93,6 +92,11 @@ public void setJmpRefMap(List<IRNode> jmpRefMap) {
this.jmpRefMap = jmpRefMap;
}

public int getOrd() {
return ord;
}


public void refJMP(IRNode node) {
jmpRefMap.add(node);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import org.teachfx.antlr4.ep20.ir.Prog;
import org.teachfx.antlr4.ep20.ir.expr.CallFunc;
import org.teachfx.antlr4.ep20.ir.expr.addr.FrameSlot;
import org.teachfx.antlr4.ep20.ir.expr.addr.StackSlot;
import org.teachfx.antlr4.ep20.ir.expr.addr.OperandSlot;
import org.teachfx.antlr4.ep20.ir.expr.arith.BinExpr;
import org.teachfx.antlr4.ep20.ir.expr.arith.UnaryExpr;
import org.teachfx.antlr4.ep20.ir.expr.val.ConstVal;
Expand Down Expand Up @@ -68,7 +68,7 @@ public Void visit(Prog prog) {
}

@Override
public Void visit(StackSlot stackSlot) {
public Void visit(OperandSlot operandSlot) {
return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import org.teachfx.antlr4.ep20.ir.Prog;
import org.teachfx.antlr4.ep20.ir.expr.CallFunc;
import org.teachfx.antlr4.ep20.ir.expr.addr.FrameSlot;
import org.teachfx.antlr4.ep20.ir.expr.addr.StackSlot;
import org.teachfx.antlr4.ep20.ir.expr.addr.OperandSlot;
import org.teachfx.antlr4.ep20.ir.expr.arith.BinExpr;
import org.teachfx.antlr4.ep20.ir.expr.arith.UnaryExpr;
import org.teachfx.antlr4.ep20.ir.expr.val.ConstVal;
Expand Down Expand Up @@ -58,7 +58,7 @@ public Void visit(Prog prog) {
}

@Override
public Void visit(StackSlot stackSlot) {
public Void visit(OperandSlot operandSlot) {
return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import org.teachfx.antlr4.ep20.ir.expr.CallFunc;
import org.teachfx.antlr4.ep20.ir.expr.Expr;
import org.teachfx.antlr4.ep20.ir.expr.addr.FrameSlot;
import org.teachfx.antlr4.ep20.ir.expr.addr.StackSlot;
import org.teachfx.antlr4.ep20.ir.expr.addr.OperandSlot;
import org.teachfx.antlr4.ep20.ir.expr.arith.BinExpr;
import org.teachfx.antlr4.ep20.ir.expr.arith.UnaryExpr;
import org.teachfx.antlr4.ep20.ir.expr.val.ConstVal;
Expand Down Expand Up @@ -119,7 +119,7 @@ public Void visit(ReturnVal returnVal) {
}

@Override
public Void visit(StackSlot stackSlot) {
public Void visit(OperandSlot operandSlot) {
return null;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
import org.teachfx.antlr4.ep20.ir.expr.CallFunc;
import org.teachfx.antlr4.ep20.ir.expr.VarSlot;
import org.teachfx.antlr4.ep20.ir.expr.addr.FrameSlot;
import org.teachfx.antlr4.ep20.ir.expr.addr.StackSlot;
import org.teachfx.antlr4.ep20.ir.expr.addr.OperandSlot;
import org.teachfx.antlr4.ep20.ir.expr.arith.BinExpr;
import org.teachfx.antlr4.ep20.ir.expr.arith.UnaryExpr;
import org.teachfx.antlr4.ep20.ir.expr.val.ConstVal;
Expand Down Expand Up @@ -330,10 +330,10 @@ public Optional<VarSlot> addInstr(IRNode stmt) {
if (stmt instanceof BinExpr) {
popEvalOperand();
popEvalOperand();
return Optional.of(StackSlot.pushStack());
return Optional.of(OperandSlot.pushStack());
} else if (stmt instanceof UnaryExpr) {
popEvalOperand();
return Optional.of(StackSlot.pushStack());
return Optional.of(OperandSlot.pushStack());
} else if(stmt instanceof CJMP) {
popEvalOperand();
} else if (stmt instanceof CallFunc callFunc) {
Expand All @@ -345,7 +345,7 @@ public Optional<VarSlot> addInstr(IRNode stmt) {
}
// 如果存在返回值,则要模拟压入返回值以保证栈平衡
if(!callFunc.getFuncType().isVoid()) {
pushEvalOperand(StackSlot.genTemp());
pushEvalOperand(OperandSlot.genTemp());
}
}

Expand Down Expand Up @@ -388,9 +388,9 @@ protected VarSlot pushEvalOperand(Temp temp) {
logger.info(curNode.toString());
}

if (!(temp instanceof StackSlot)){
if (!(temp instanceof OperandSlot)){
cnt++;
var assignee = StackSlot.pushStack();
var assignee = OperandSlot.pushStack();
evalExprStack.push(assignee);
addInstr(Assign.with(assignee, temp));
logger.info("-> eval stack %s%n", evalExprStack.toString());
Expand All @@ -408,8 +408,8 @@ protected VarSlot popEvalOperand() {
var res = evalExprStack.pop();
logger.info("pop eval operand %s",res);
logger.info("pop stack");
StackSlot.popStack();
if (StackSlot.getOrdSeq() < 0) {
OperandSlot.popStack();
if (OperandSlot.getOrdSeq() < 0) {
throw new RuntimeException("un matched pop");
}
return res;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
package org.teachfx.antlr4.ep20.ast.expr;public class BoolExprNodeTest {
package org.teachfx.antlr4.ep20.ast.expr;
public class BoolExprNodeTest {
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,7 @@

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.teachfx.antlr4.ep20.ir.expr.arith.BinExpr;
import org.teachfx.antlr4.ep20.ir.expr.arith.UnaryExpr;
import org.teachfx.antlr4.ep20.ir.expr.val.ConstVal;
import org.teachfx.antlr4.ep20.ir.stmt.Assign;
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 static org.junit.jupiter.api.Assertions.assertEquals;

Expand Down
4 changes: 2 additions & 2 deletions ep21/TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
- [ ] 线性化MIR输出

- [ ] CFG
- [ ] 基本块划分
- [ ] 关系生成
- [x] 基本块划分
- [x] 关系生成
- [ ] 生成DOT

## Todo
Expand Down

0 comments on commit 031a2eb

Please sign in to comment.