mips without optimize
This commit is contained in:
248
midend/llvm/value/IrBasicBlock.java
Normal file → Executable file
248
midend/llvm/value/IrBasicBlock.java
Normal file → Executable file
@@ -1,120 +1,128 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
package midend.llvm.value;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
|
||||
import backend.mips.instr.MipsLabel;
|
||||
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;
|
||||
}
|
||||
|
||||
public void toMips() {
|
||||
new MipsLabel(getMipsLabel());
|
||||
for (IrInstr instr : instrs) {
|
||||
instr.toMips();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
195
midend/llvm/value/IrFuncValue.java
Normal file → Executable file
195
midend/llvm/value/IrFuncValue.java
Normal file → Executable file
@@ -1,71 +1,124 @@
|
||||
package midend.llvm.value;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import midend.llvm.type.IrType;
|
||||
import midend.llvm.IrBuilder;
|
||||
import midend.llvm.instr.ReturnInstr;
|
||||
import midend.llvm.type.IrFuncType;
|
||||
|
||||
public class IrFuncValue extends IrValue {
|
||||
private ArrayList<IrValue> params;
|
||||
private ArrayList<IrBasicBlock> bblocks;
|
||||
|
||||
public IrFuncValue(String name, IrType retType) {
|
||||
super(new IrFuncType(retType), name);
|
||||
params = new ArrayList<>();
|
||||
bblocks = new ArrayList<>();
|
||||
}
|
||||
|
||||
public ArrayList<IrValue> getParams() {
|
||||
return params;
|
||||
}
|
||||
|
||||
public ArrayList<IrBasicBlock> getBBlocks() {
|
||||
return bblocks;
|
||||
}
|
||||
|
||||
public IrBasicBlock getBBlock(int index) {
|
||||
return bblocks.get(index);
|
||||
}
|
||||
|
||||
public void addParam(IrValue param) {
|
||||
params.add(param);
|
||||
}
|
||||
|
||||
public void addBBlock(IrBasicBlock bblock) {
|
||||
bblocks.add(bblock);
|
||||
}
|
||||
|
||||
public boolean isMain() {
|
||||
return getName().equals("@main");
|
||||
}
|
||||
|
||||
public IrType getRetType() {
|
||||
return ((IrFuncType) getType()).getReturnType();
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("define dso_local " + this.getRetType() + " " + this.getName() + "(");
|
||||
for (int i = 0; i < params.size(); i++) {
|
||||
sb.append(params.get(i).getType() + " " + params.get(i).getName());
|
||||
if (i < params.size() - 1) {
|
||||
sb.append(", ");
|
||||
}
|
||||
}
|
||||
sb.append(") {\n");
|
||||
for (IrBasicBlock bblock : bblocks) {
|
||||
sb.append(bblock.toString() + "\n");
|
||||
}
|
||||
sb.append("}\n");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public void checkReturn() {
|
||||
IrBasicBlock currentBB = IrBuilder.getCurrentBB();
|
||||
if (!currentBB.lastIsReturn()) {
|
||||
ReturnInstr returnInstr = new ReturnInstr(null); // 确保没有return的情况只有void
|
||||
IrBuilder.addInstr(returnInstr);
|
||||
}
|
||||
}
|
||||
}
|
||||
package midend.llvm.value;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
import midend.llvm.type.IrType;
|
||||
import midend.llvm.IrBuilder;
|
||||
import midend.llvm.instr.ReturnInstr;
|
||||
import midend.llvm.type.IrFuncType;
|
||||
import backend.mips.MipsBuilder;
|
||||
import backend.mips.Register;
|
||||
import backend.mips.instr.MipsLabel;
|
||||
|
||||
public class IrFuncValue extends IrValue {
|
||||
private ArrayList<IrValue> params;
|
||||
private ArrayList<IrBasicBlock> bblocks;
|
||||
private HashMap<IrValue, Register> valueRegisterMap;
|
||||
private HashMap<IrValue, Integer> valueOffsetMap;
|
||||
|
||||
public IrFuncValue(String name, IrType retType) {
|
||||
super(new IrFuncType(retType), name);
|
||||
params = new ArrayList<>();
|
||||
bblocks = new ArrayList<>();
|
||||
valueRegisterMap = new HashMap<>();
|
||||
valueOffsetMap = new HashMap<>();
|
||||
}
|
||||
|
||||
public ArrayList<IrValue> getParams() {
|
||||
return params;
|
||||
}
|
||||
|
||||
public ArrayList<IrBasicBlock> getBBlocks() {
|
||||
return bblocks;
|
||||
}
|
||||
|
||||
public IrBasicBlock getBBlock(int index) {
|
||||
return bblocks.get(index);
|
||||
}
|
||||
|
||||
public void addParam(IrValue param) {
|
||||
params.add(param);
|
||||
}
|
||||
|
||||
public void addBBlock(IrBasicBlock bblock) {
|
||||
bblocks.add(bblock);
|
||||
}
|
||||
|
||||
public Register getRegister(IrValue value) {
|
||||
return valueRegisterMap.get(value);
|
||||
}
|
||||
|
||||
public int getOffset(IrValue value) {
|
||||
return valueOffsetMap.get(value);
|
||||
}
|
||||
|
||||
public void setRegister(IrValue value, Register reg) {
|
||||
valueRegisterMap.put(value, reg);
|
||||
}
|
||||
|
||||
public void setOffset(IrValue value, int offset) {
|
||||
valueOffsetMap.put(value, offset);
|
||||
}
|
||||
|
||||
public HashMap<IrValue, Register> getValueRegisterMap() {
|
||||
return valueRegisterMap;
|
||||
}
|
||||
|
||||
public HashMap<IrValue, Integer> getValueOffsetMap() {
|
||||
return valueOffsetMap;
|
||||
}
|
||||
|
||||
public boolean isMain() {
|
||||
return getName().equals("@main");
|
||||
}
|
||||
|
||||
public IrType getRetType() {
|
||||
return ((IrFuncType) getType()).getReturnType();
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("define dso_local " + this.getRetType() + " " + this.getName() + "(");
|
||||
for (int i = 0; i < params.size(); i++) {
|
||||
sb.append(params.get(i).getType() + " " + params.get(i).getName());
|
||||
if (i < params.size() - 1) {
|
||||
sb.append(", ");
|
||||
}
|
||||
}
|
||||
sb.append(") {\n");
|
||||
for (IrBasicBlock bblock : bblocks) {
|
||||
sb.append(bblock.toString() + "\n");
|
||||
}
|
||||
sb.append("}\n");
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
public void checkReturn() {
|
||||
IrBasicBlock currentBB = IrBuilder.getCurrentBB();
|
||||
if (!currentBB.lastIsReturn()) {
|
||||
ReturnInstr returnInstr = new ReturnInstr(null); // 确保没有return的情况只有void
|
||||
IrBuilder.addInstr(returnInstr);
|
||||
}
|
||||
}
|
||||
|
||||
public void toMips() {
|
||||
new MipsLabel(getMipsLabel());
|
||||
MipsBuilder.enterNewFunc(this);
|
||||
int num = 0;
|
||||
ArrayList<Register> paramRegs = new ArrayList<>();
|
||||
paramRegs.add(Register.A1);
|
||||
paramRegs.add(Register.A2);
|
||||
paramRegs.add(Register.A3);
|
||||
for (IrValue param : params) {
|
||||
num++;
|
||||
if (num <= 3) {
|
||||
MipsBuilder.allocaRegister(param, paramRegs.get(num - 1));
|
||||
}
|
||||
MipsBuilder.allocaOffset(param);
|
||||
}
|
||||
for (IrBasicBlock bblock : bblocks) {
|
||||
bblock.toMips();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
4
midend/llvm/value/IrGlobalValue.java
Normal file → Executable file
4
midend/llvm/value/IrGlobalValue.java
Normal file → Executable file
@@ -25,4 +25,8 @@ public class IrGlobalValue extends IrValue {
|
||||
return isConstant ? getName() + " = dso_local constant " + initVal.toString() :
|
||||
getName() + " = dso_local global " + initVal.toString();
|
||||
}
|
||||
|
||||
public void toMips() {
|
||||
initVal.toMips(getMipsLabel());
|
||||
}
|
||||
}
|
||||
|
||||
64
midend/llvm/value/IrLoop.java
Normal file → Executable file
64
midend/llvm/value/IrLoop.java
Normal file → Executable file
@@ -1,32 +1,32 @@
|
||||
package midend.llvm.value;
|
||||
|
||||
public class IrLoop {
|
||||
private IrBasicBlock condBB;
|
||||
private IrBasicBlock bodyBB;
|
||||
private IrBasicBlock stepBB;
|
||||
private IrBasicBlock followBB;
|
||||
|
||||
public IrLoop(IrBasicBlock condBB, IrBasicBlock bodyBB,
|
||||
IrBasicBlock stepBB, IrBasicBlock followBB) {
|
||||
this.condBB = condBB;
|
||||
this.bodyBB = bodyBB;
|
||||
this.stepBB = stepBB;
|
||||
this.followBB = followBB;
|
||||
}
|
||||
|
||||
public IrBasicBlock getCondBB() {
|
||||
return condBB;
|
||||
}
|
||||
|
||||
public IrBasicBlock getBodyBB() {
|
||||
return bodyBB;
|
||||
}
|
||||
|
||||
public IrBasicBlock getStepBB() {
|
||||
return stepBB;
|
||||
}
|
||||
|
||||
public IrBasicBlock getFollowBB() {
|
||||
return followBB;
|
||||
}
|
||||
}
|
||||
package midend.llvm.value;
|
||||
|
||||
public class IrLoop {
|
||||
private IrBasicBlock condBB;
|
||||
private IrBasicBlock bodyBB;
|
||||
private IrBasicBlock stepBB;
|
||||
private IrBasicBlock followBB;
|
||||
|
||||
public IrLoop(IrBasicBlock condBB, IrBasicBlock bodyBB,
|
||||
IrBasicBlock stepBB, IrBasicBlock followBB) {
|
||||
this.condBB = condBB;
|
||||
this.bodyBB = bodyBB;
|
||||
this.stepBB = stepBB;
|
||||
this.followBB = followBB;
|
||||
}
|
||||
|
||||
public IrBasicBlock getCondBB() {
|
||||
return condBB;
|
||||
}
|
||||
|
||||
public IrBasicBlock getBodyBB() {
|
||||
return bodyBB;
|
||||
}
|
||||
|
||||
public IrBasicBlock getStepBB() {
|
||||
return stepBB;
|
||||
}
|
||||
|
||||
public IrBasicBlock getFollowBB() {
|
||||
return followBB;
|
||||
}
|
||||
}
|
||||
|
||||
8
midend/llvm/value/IrValue.java
Normal file → Executable file
8
midend/llvm/value/IrValue.java
Normal file → Executable file
@@ -35,4 +35,12 @@ public class IrValue {
|
||||
public String toString() {
|
||||
return type.toString() + " " + name;
|
||||
}
|
||||
|
||||
public void toMips() {
|
||||
// 子类实现
|
||||
}
|
||||
|
||||
public String getMipsLabel() {
|
||||
return name.substring(1);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user