121 lines
2.9 KiB
Java
121 lines
2.9 KiB
Java
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<IrInstr> instrs;
|
|
private IrFuncValue func;
|
|
private ArrayList<IrBasicBlock> preds; //前驱
|
|
private ArrayList<IrBasicBlock> succs; //后继
|
|
private HashSet<IrBasicBlock> domied; //支配该节点
|
|
private IrBasicBlock directDomi;
|
|
private HashSet<IrBasicBlock> directDomies; //该节点直接支配
|
|
private HashSet<IrBasicBlock> 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<IrBasicBlock> getPreds() {
|
|
return preds;
|
|
}
|
|
|
|
public ArrayList<IrBasicBlock> 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<IrInstr> 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<IrBasicBlock> getDomied() {
|
|
return domied;
|
|
}
|
|
|
|
public IrBasicBlock getDirectDomi() {
|
|
return this.directDomi;
|
|
}
|
|
}
|