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 params; private ArrayList bblocks; public IrFuncValue(String name, IrType retType) { super(new IrFuncType(retType), name); params = new ArrayList<>(); bblocks = new ArrayList<>(); } public ArrayList getParams() { return params; } public ArrayList 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); } } }