Files
MY_COMPILER/backend/mips/MipsBuilder.java
2025-12-12 20:14:00 +08:00

94 lines
2.7 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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());
}
}