mips without optimize
This commit is contained in:
158
midend/visit/VisitorFuncDef.java
Normal file → Executable file
158
midend/visit/VisitorFuncDef.java
Normal file → Executable 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user