80 lines
3.6 KiB
Java
Executable File
80 lines
3.6 KiB
Java
Executable File
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<Integer> paramList = funcSymbol.getParamList();
|
|
ArrayList<Symbol> paramSymbolList = funcSymbol.getParamSymbolList();
|
|
ArrayList<IrValue> 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();
|
|
}
|
|
} |