72 lines
1.9 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|