package midend.visit; import java.util.ArrayList; import frontend.ast.block.Block; import frontend.ast.func.FuncDef; import frontend.ast.func.MainFuncDef; import frontend.ast.token.TokenNode; import midend.llvm.IrBuilder; import midend.llvm.instr.AllocateInstr; import midend.llvm.instr.StoreInstr; import midend.llvm.type.IrInterType; import midend.llvm.type.IrPointerType; import midend.llvm.value.IrFuncValue; import midend.llvm.value.IrValue; import midend.symbol.Symbol; import midend.symbol.FuncSymbol; import midend.symbol.SymbolManager; public class VisitorFuncDef { public static void visitFuncDef(FuncDef funcDef) { FuncSymbol funcSymbol = (FuncSymbol) SymbolManager.getSymbol( ((TokenNode) funcDef.getChild(1)).getName()); IrInterType returnType = funcSymbol.getReturnType() == 1 ? IrInterType.INT32 : IrInterType.VOID; IrFuncValue funcValue = new IrFuncValue( IrBuilder.geFuncName(funcSymbol.getName()), returnType); IrBuilder.addNewFunc(funcValue); funcSymbol.setIrValue(funcValue); // 进入函数作用域 SymbolManager.nextTable(); // System.out.println("(func)now table: " + SymbolManager.getCurrentTableId());//TODO:debug ArrayList paramList = funcSymbol.getParamList(); ArrayList paramSymbolList = funcSymbol.getParamSymbolList(); ArrayList irParamList = new ArrayList<>(); for (int i = 0; i < paramList.size(); i++) { if (paramList.get(i) == 0) { IrValue param = new IrValue(IrInterType.INT32, IrBuilder.getLocalName()); irParamList.add(param); funcValue.addParam(param); } else { IrValue param = new IrValue( new IrPointerType(IrInterType.INT32), IrBuilder.getLocalName()); irParamList.add(param); funcValue.addParam(param); paramSymbolList.get(i).setIrValue(param); } } for (int i = 0; i < irParamList.size(); i++) { if (paramList.get(i) == 1) { continue; // 数组参数不分配内存 } AllocateInstr allocateInstr = new AllocateInstr( irParamList.get(i).getType(), IrBuilder.getLocalName()); IrBuilder.addInstr(allocateInstr); StoreInstr storeInstr = new StoreInstr(irParamList.get(i), allocateInstr); IrBuilder.addInstr(storeInstr); paramSymbolList.get(i).setIrValue(allocateInstr); } //这里貌似可以不用allocate?函数形参似乎可以直接拿来用? Block block = (Block) funcDef.getChild(funcDef.getChildren().size() - 1); VisitorBlock.visitBlock(block); // TODO:check return? funcValue.checkReturn(); SymbolManager.nextTable(); // System.out.println("(func)now table: " + SymbolManager.getCurrentTableId());//TODO:debug } public static void visitMainFuncDef(MainFuncDef mainFuncDef) { IrFuncValue mainFuncValue = new IrFuncValue( IrBuilder.geFuncName("main"), IrInterType.INT32); IrBuilder.addNewFunc(mainFuncValue); SymbolManager.nextTable(); // System.out.println("(mainfunc)now table: " + SymbolManager.getCurrentTableId());//TODO:debug Block block = (Block) mainFuncDef.getChild(mainFuncDef.getChildren().size() - 1); VisitorBlock.visitBlock(block); SymbolManager.nextTable(); } }