94 lines
2.7 KiB
Java
94 lines
2.7 KiB
Java
package backend.mips;
|
||
|
||
import java.util.HashMap;
|
||
import java.util.ArrayList;
|
||
|
||
import backend.mips.instr.MipsInstr;
|
||
import backend.mips.instr.data.MipsAsciiz;
|
||
import backend.mips.instr.data.MipsSpace;
|
||
import backend.mips.instr.data.MipsWord;
|
||
import midend.llvm.value.IrFuncValue;
|
||
import midend.llvm.value.IrValue;
|
||
|
||
public class MipsBuilder {
|
||
private static MipsModule module = null;
|
||
private static int offset = 0;
|
||
private static HashMap<IrValue, Integer> valueOffsetMap = new HashMap<>();
|
||
private static HashMap<IrValue, Register> valueRegisterMap = new HashMap<>();
|
||
|
||
public static void setModule(MipsModule module) {
|
||
MipsBuilder.module = module;
|
||
}
|
||
|
||
public static int getOffset() {
|
||
return offset;
|
||
}
|
||
|
||
public static void setOffset(int offset) {
|
||
MipsBuilder.offset = offset;
|
||
}
|
||
|
||
public static void setValueOffsetMap(HashMap<IrValue, Integer> valueOffsetMap) {
|
||
MipsBuilder.valueOffsetMap = valueOffsetMap;
|
||
}
|
||
|
||
public static HashMap<IrValue, Integer> getValueOffsetMap() {
|
||
return valueOffsetMap;
|
||
}
|
||
|
||
public static void setValueRegisterMap(HashMap<IrValue, Register> valueRegisterMap) {
|
||
MipsBuilder.valueRegisterMap = valueRegisterMap;
|
||
}
|
||
|
||
public static HashMap<IrValue, Register> getValueRegisterMap() {
|
||
return valueRegisterMap;
|
||
}
|
||
|
||
public static MipsModule getModule() {
|
||
return module;
|
||
}
|
||
|
||
public static void addMipsInstr(MipsInstr instr) {
|
||
if (instr instanceof MipsAsciiz || instr instanceof MipsWord || instr instanceof MipsSpace) { //data段
|
||
module.addData(instr);
|
||
} else {
|
||
module.addText(instr);
|
||
}
|
||
}
|
||
|
||
public static void enterNewFunc(IrFuncValue func) {
|
||
offset = 0;
|
||
valueOffsetMap = func.getValueOffsetMap();
|
||
valueOffsetMap.clear(); //TODO:是否需要清空?
|
||
valueRegisterMap = func.getValueRegisterMap();
|
||
}
|
||
|
||
public static Register getRegister(IrValue value) {
|
||
return valueRegisterMap.get(value);
|
||
}
|
||
|
||
public static Integer getOffset(IrValue value) {
|
||
return valueOffsetMap.get(value);
|
||
}
|
||
|
||
public static void allocaRegister(IrValue value, Register reg) {
|
||
valueRegisterMap.put(value, reg);
|
||
}
|
||
|
||
public static void allocaOffset(IrValue value) {
|
||
if (!valueOffsetMap.containsKey(value)) {
|
||
offset -= 4;
|
||
int valueOffset = offset;
|
||
valueOffsetMap.put(value, valueOffset);
|
||
}
|
||
}
|
||
|
||
public static void allocaOffset(int extra) {
|
||
offset -= extra;
|
||
}
|
||
|
||
public static ArrayList<Register> getUsedRegisters() {
|
||
return new ArrayList<>(valueRegisterMap.values());
|
||
}
|
||
}
|