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 valueOffsetMap = new HashMap<>(); private static HashMap 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 valueOffsetMap) { MipsBuilder.valueOffsetMap = valueOffsetMap; } public static HashMap getValueOffsetMap() { return valueOffsetMap; } public static void setValueRegisterMap(HashMap valueRegisterMap) { MipsBuilder.valueRegisterMap = valueRegisterMap; } public static HashMap 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 getUsedRegisters() { return new ArrayList<>(valueRegisterMap.values()); } }