mips without optimize

This commit is contained in:
colden
2025-12-12 20:14:00 +08:00
parent 84827838e2
commit c94bebf37b
130 changed files with 5462 additions and 4182 deletions

158
midend/visit/VisitorFuncDef.java Normal file → Executable file
View File

@@ -1,80 +1,80 @@
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();
}
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();
}
}