Files
MY_COMPILER/midend/llvm/value/IrFuncValue.java
2025-12-10 17:58:17 +08:00

72 lines
1.9 KiB
Java

package midend.llvm.value;
import java.util.ArrayList;
import midend.llvm.type.IrType;
import midend.llvm.IrBuilder;
import midend.llvm.instr.ReturnInstr;
import midend.llvm.type.IrFuncType;
public class IrFuncValue extends IrValue {
private ArrayList<IrValue> params;
private ArrayList<IrBasicBlock> bblocks;
public IrFuncValue(String name, IrType retType) {
super(new IrFuncType(retType), name);
params = new ArrayList<>();
bblocks = new ArrayList<>();
}
public ArrayList<IrValue> getParams() {
return params;
}
public ArrayList<IrBasicBlock> getBBlocks() {
return bblocks;
}
public IrBasicBlock getBBlock(int index) {
return bblocks.get(index);
}
public void addParam(IrValue param) {
params.add(param);
}
public void addBBlock(IrBasicBlock bblock) {
bblocks.add(bblock);
}
public boolean isMain() {
return getName().equals("@main");
}
public IrType getRetType() {
return ((IrFuncType) getType()).getReturnType();
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("define dso_local " + this.getRetType() + " " + this.getName() + "(");
for (int i = 0; i < params.size(); i++) {
sb.append(params.get(i).getType() + " " + params.get(i).getName());
if (i < params.size() - 1) {
sb.append(", ");
}
}
sb.append(") {\n");
for (IrBasicBlock bblock : bblocks) {
sb.append(bblock.toString() + "\n");
}
sb.append("}\n");
return sb.toString();
}
public void checkReturn() {
IrBasicBlock currentBB = IrBuilder.getCurrentBB();
if (!currentBB.lastIsReturn()) {
ReturnInstr returnInstr = new ReturnInstr(null); // 确保没有return的情况只有void
IrBuilder.addInstr(returnInstr);
}
}
}