An error occurred while loading the file. Please try again.
-
Hans Zhang 1911512 authoredd5866ed9
package backend;
import backend.asmInstr.AsmInstr;
import backend.asmInstr.asmBr.AsmBnez;
import backend.asmInstr.asmBr.AsmJ;
import backend.asmInstr.asmBinary.*;
import backend.asmInstr.asmConv.AsmFtoi;
import backend.asmInstr.asmConv.AsmitoF;
import backend.asmInstr.asmLS.*;
import backend.asmInstr.asmTermin.AsmCall;
import backend.asmInstr.asmTermin.AsmRet;
import backend.itemStructure.*;
import backend.regs.AsmFVirReg;
import backend.regs.AsmReg;
import backend.regs.AsmVirReg;
import backend.regs.RegGeter;
import frontend.ir.constvalue.ConstFloat;
import frontend.ir.instr.binop.*;
import frontend.ir.instr.convop.ConversionOperation;
import frontend.ir.instr.otherop.CallInstr;
import frontend.ir.instr.otherop.MoveInstr;
import frontend.ir.instr.otherop.cmp.Cmp;
import frontend.ir.instr.otherop.cmp.CmpCond;
import frontend.ir.instr.terminator.*;
import frontend.ir.instr.memop.*;
import frontend.ir.instr.unaryop.FNegInstr;
import frontend.ir.structure.*;
import frontend.ir.Value;
import frontend.ir.constvalue.ConstInt;
import frontend.ir.instr.Instruction;
import frontend.ir.symbols.Symbol;
import Utils.CustomList.Node;
import java.util.*;
import static backend.regs.RegGeter.ZERO;
import static frontend.ir.DataType.*;
public class IrParser {
private Program program;
private AsmModule asmModule = new AsmModule();
//全局变量的c表示映射到全局变量的asm表示。全局变量的llvm表示是标签,对于asm来说没有意义
private HashMap<Symbol, AsmGlobalVar> gvMap = new HashMap<>();
private HashMap<Function, AsmFunction> funcMap = new HashMap<>();
private HashMap<BasicBlock, AsmBlock> blockMap = new HashMap<>();
//llvm的虚拟寄存器或立即数映射到asm的物理寄存器或立即数
private HashMap<Value, AsmOperand> operandMap = new HashMap<>();
public HashMap<AsmOperand, Value> downOperandMap = new HashMap<>();
//指示对应浮点数值映射到的标签
private HashMap<Integer, AsmLabel> floatLabelMap = new HashMap<>();
private HashMap<Group<AsmBlock, Group<AsmOperand, AsmOperand>>, AsmOperand> blockDivExp2Res = new HashMap<>();
private HashMap<Group<AsmBlock, Group<AsmOperand, AsmOperand>>, AsmOperand> blockMulExp2Res = new HashMap<>();
public IrParser(Program program) {
this.program = program;
}
public AsmModule parse() {
parseGlobalVars();
parseFunctions();
return asmModule;
}
private void parseGlobalVars() {
List<Symbol> globalVars = program.getGlobalVars();
for (Symbol globalVar : globalVars) {
AsmGlobalVar asmGlobalVar = parseGlobalVar(globalVar);
asmModule.addGlobalVar(asmGlobalVar);
gvMap.put(globalVar, asmGlobalVar);