package midend.llvm.value; import java.util.ArrayList; import java.util.HashSet; import midend.llvm.instr.IrInstr; import midend.llvm.instr.ReturnInstr; import midend.llvm.type.IrBasicBlockType; public class IrBasicBlock extends IrValue { private ArrayList instrs; private IrFuncValue func; private ArrayList preds; //前驱 private ArrayList succs; //后继 private HashSet domied; //支配该节点 private IrBasicBlock directDomi; private HashSet directDomies; //该节点直接支配 private HashSet domiFrontier; public IrBasicBlock(String name, IrFuncValue func) { super(new IrBasicBlockType(), name); this.func = func; instrs = new ArrayList<>(); preds = new ArrayList<>(); succs = new ArrayList<>(); domied = new HashSet<>(); directDomi = null; directDomies = new HashSet<>(); domiFrontier = new HashSet<>(); } public void addInstr(IrInstr instr) { instrs.add(instr); instr.setBBlock(this); } public IrFuncValue getFunc() { return func; } public boolean isEmpty() { return instrs.isEmpty(); } public boolean isEntry() { return this.func.getBBlock(0) == this; } public ArrayList getPreds() { return preds; } public ArrayList getSuccs() { return succs; } public String toString() { StringBuilder sb = new StringBuilder(); sb.append(getName() + ":\n\t"); for (IrInstr instr : instrs) { sb.append(instr.toString()); if (instr != instrs.get(instrs.size() - 1)) { sb.append("\n\t"); } } return sb.toString(); } public boolean lastIsReturn() { if (instrs.isEmpty()) { return false; } return instrs.get(instrs.size() - 1) instanceof ReturnInstr; } public void clearCfg() { this.preds.clear(); this.succs.clear(); domied.clear(); directDomi = null; directDomies.clear(); domiFrontier.clear(); } public ArrayList getInstrs() { return instrs; } public void addPred(IrBasicBlock bb) { this.preds.add(bb); } public void addSucc(IrBasicBlock bb) { this.succs.add(bb); } public void addDomied(IrBasicBlock bb) { this.domied.add(bb); } public void addDirectDomies(IrBasicBlock bb) { this.directDomies.add(bb); } public void addDomiFrontier(IrBasicBlock bb) { this.domiFrontier.add(bb); } public void setDirectDomi(IrBasicBlock bb) { this.directDomi = bb; } public HashSet getDomied() { return domied; } public IrBasicBlock getDirectDomi() { return this.directDomi; } }