diff --git a/src/main/java/cn/edu/nju/software/ir/basicblock/BasicBlockRef.java b/src/main/java/cn/edu/nju/software/ir/basicblock/BasicBlockRef.java index 7c17b9604fea9d307fe5e6f407ec64849a0b8e04..7c4ba4461ff7f62cf8a3937edee22f0a3a6b3b67 100644 --- a/src/main/java/cn/edu/nju/software/ir/basicblock/BasicBlockRef.java +++ b/src/main/java/cn/edu/nju/software/ir/basicblock/BasicBlockRef.java @@ -7,7 +7,7 @@ import cn.edu.nju.software.ir.value.ValueRef; import java.util.ArrayList; -public class BasicBlockRef { +public class BasicBlockRef extends ValueRef { private final static ArrayList<String> usedNameList = new ArrayList<String>(){{add("");}}; private final static ArrayList<Integer> usedFreqList = new ArrayList<Integer>(){{add(0);}}; private final String name; @@ -81,4 +81,9 @@ public class BasicBlockRef { public LocalVar createLocalVar(TypeRef type, String name) { return function.createLocalVar(type, name); } + + @Override + public String toString() { + return "%" + name; + } } diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Allocate.java b/src/main/java/cn/edu/nju/software/ir/instruction/Allocate.java new file mode 100644 index 0000000000000000000000000000000000000000..0042784e22acbfde5ce802193fe0e0d495dba1c8 --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/Allocate.java @@ -0,0 +1,25 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.type.Pointer; +import cn.edu.nju.software.ir.type.TypeRef; +import cn.edu.nju.software.ir.value.ValueRef; + +import static cn.edu.nju.software.ir.instruction.Operator.getOperator; + +public class Allocate extends Instruction { + // please make sure that pointer(lVal) is a pointer type variable + public Allocate(ValueRef pointer) { + operator = getOperator(OpEnum.ALLOC); + lVal = pointer; + } + + @Override + public boolean isAlloc() { + return true; + } + @Override + public String toString() { + TypeRef base = ((Pointer)lVal.getType()).getBase(); + return lVal + " = alloca " + base + ", align " + base.getWidth(); + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Arithmetic.java b/src/main/java/cn/edu/nju/software/ir/instruction/Arithmetic.java new file mode 100644 index 0000000000000000000000000000000000000000..7cea8045355b4378febc971be75033414dd96cd9 --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/Arithmetic.java @@ -0,0 +1,17 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.type.TypeRef; +import cn.edu.nju.software.ir.value.ValueRef; + +import static cn.edu.nju.software.ir.instruction.Operator.getOperator; + +public class Arithmetic extends Binary { + public Arithmetic(ValueRef lVal, OpEnum op, ValueRef operand1, ValueRef operand2) { + super(lVal, op, operand1, operand2); + } + + @Override + public boolean isArithmetic() { + return true; + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Binary.java b/src/main/java/cn/edu/nju/software/ir/instruction/Binary.java new file mode 100644 index 0000000000000000000000000000000000000000..13a78fc7c0a5f0ebf55896214485f4356d915317 --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/Binary.java @@ -0,0 +1,19 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.value.ValueRef; + +import static cn.edu.nju.software.ir.instruction.Operator.getOperator; + +public class Binary extends Instruction { + public Binary(ValueRef lVal, OpEnum op, ValueRef operand1, ValueRef operand2) { + this.lVal = lVal; + operator = getOperator(op); + operands = new ValueRef[]{operand1, operand2}; + } + + @Override + public String toString() { + return operator + " " + operands[0].getType() + " " + operands[0] + ", " + + operands[1].getType() + " " + operands[1]; + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Br.java b/src/main/java/cn/edu/nju/software/ir/instruction/Br.java new file mode 100644 index 0000000000000000000000000000000000000000..1f0dbafd11863668bd4306ec074df8ee7d5a6a01 --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/Br.java @@ -0,0 +1,25 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.basicblock.BasicBlockRef; + +import static cn.edu.nju.software.ir.instruction.OpEnum.BR; +import static cn.edu.nju.software.ir.instruction.Operator.getOperator; + +public class Br extends Instruction { + public Br(BasicBlockRef target) { + operator = getOperator(BR); + operands = new BasicBlockRef[]{target}; + } + + public BasicBlockRef getTarget() { + return (BasicBlockRef) operands[0]; + } + @Override + public boolean isBr() { + return true; + } + @Override + public String toString() { + return "br label " + operands[0]; + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Call.java b/src/main/java/cn/edu/nju/software/ir/instruction/Call.java new file mode 100644 index 0000000000000000000000000000000000000000..3ff768b8898f52756dc1567a5efb6382516b853b --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/Call.java @@ -0,0 +1,62 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.type.FunctionType; +import cn.edu.nju.software.ir.type.Pointer; +import cn.edu.nju.software.ir.type.VoidType; +import cn.edu.nju.software.ir.value.ConstValue; +import cn.edu.nju.software.ir.value.FunctionValue; +import cn.edu.nju.software.ir.value.ValueRef; + +import java.util.ArrayList; + +import static cn.edu.nju.software.ir.instruction.OpEnum.CALL; +import static cn.edu.nju.software.ir.instruction.Operator.getOperator; + +public class Call extends Instruction { + private final ArrayList<ValueRef> realParams; + private final FunctionValue function; + public Call(FunctionValue function, ArrayList<ValueRef> realParams) { + operator = getOperator(CALL); + this.function = function; + this.realParams = realParams; + } + + public Call(ValueRef lVal, FunctionValue function, ArrayList<ValueRef> realParams) { + this.lVal = lVal; + operator = getOperator(CALL); + this.function = function; + this.realParams = realParams; + } + + @Override + public boolean isCall() { + return true; + } + @Override + public String toString() { + FunctionType ft = (FunctionType) function.getType(); + StringBuilder instr = new StringBuilder(); + if (!(ft.getReturnType() instanceof VoidType)) { + instr.append(lVal).append(" = "); + } + instr.append("call ").append(ft.getReturnType()).append(" ").append(function).append("("); + for (int i = 0; i < realParams.size(); i++) { + ValueRef param = realParams.get(i); + if (param instanceof ConstValue) { + instr.append(param); + } else { + if (ft.getFParameter(i) instanceof Pointer) { + Pointer paramPtr = new Pointer(param); + instr.append(paramPtr).append(" "); + } else { + instr.append(param.getType()).append(" "); + } + instr.append(param); + } + if (i < realParams.size() - 1) { + instr.append(", "); + } + } + return instr.append(")").toString(); + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Cmp.java b/src/main/java/cn/edu/nju/software/ir/instruction/Cmp.java new file mode 100644 index 0000000000000000000000000000000000000000..1c54332a351c633ceca1002ea55a126be335a932 --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/Cmp.java @@ -0,0 +1,36 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.value.ConstValue; +import cn.edu.nju.software.ir.value.ValueRef; + +import static cn.edu.nju.software.ir.instruction.Operator.*; + +public class Cmp extends Instruction { + private final String type; + public Cmp(ValueRef lVal, OpEnum op, int type, ValueRef operand1, ValueRef operand2) { + this.lVal = lVal; + operator = getOperator(op); + this.type = cmpType[type]; + operands = new ValueRef[]{operand1, operand2}; + } + + @Override + public boolean isCmp() { + return true; + } + @Override + public String toString() { + String instr = lVal + " = " + operator + " " + type + " " + operands[0].getType() + " "; + if (operands[0] instanceof ConstValue) { + instr += ((ConstValue) operands[0]).getValue() + ", "; + } else { + instr += operands[0] + ", "; + } + if (operands[1] instanceof ConstValue) { + instr += ((ConstValue) operands[1]).getValue(); + } else { + instr += operands[1]; + } + return instr; + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/CondBr.java b/src/main/java/cn/edu/nju/software/ir/instruction/CondBr.java new file mode 100644 index 0000000000000000000000000000000000000000..20656ac0862863dce46a0ba2e829047c6417eda3 --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/CondBr.java @@ -0,0 +1,33 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.basicblock.BasicBlockRef; +import cn.edu.nju.software.ir.value.ConstValue; +import cn.edu.nju.software.ir.value.ValueRef; + +import static cn.edu.nju.software.ir.instruction.OpEnum.BR; +import static cn.edu.nju.software.ir.instruction.Operator.getOperator; + +public class CondBr extends Instruction { + public CondBr(ValueRef cond, BasicBlockRef ifTrue, BasicBlockRef ifFalse) { + operator = getOperator(BR); + operands = new ValueRef[]{cond, ifTrue, ifFalse}; + } + + public BasicBlockRef getTrueBlock() { + return (BasicBlockRef) operands[1]; + } + + public BasicBlockRef getFalseBlock() { + return (BasicBlockRef) operands[2]; + } + + @Override + public String toString() { + if (operands[0] instanceof ConstValue) { + return "br " + operands[0] + ", label " + operands[1] + ", label " + operands[2]; + } else { + return "br " + operands[0].getType() + " " + operands[0] + + ", label " + operands[1] + ", label " + operands[2]; + } + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/FloatToInt.java b/src/main/java/cn/edu/nju/software/ir/instruction/FloatToInt.java new file mode 100644 index 0000000000000000000000000000000000000000..5c74b48fbea4fbe06df768c5ee16b86e414ae2d1 --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/FloatToInt.java @@ -0,0 +1,16 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.value.ValueRef; + +public class FloatToInt extends Instruction { + public FloatToInt(ValueRef lVal, ValueRef floatVal) { + this.lVal = lVal; + operator = "fptosi"; + operands = new ValueRef[]{floatVal}; + } + + @Override + public String toString() { + return lVal + " = fptosi float " + operands[0] + " to i32"; + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/GEP.java b/src/main/java/cn/edu/nju/software/ir/instruction/GEP.java new file mode 100644 index 0000000000000000000000000000000000000000..32c32f9224e616ec19d21e668b2767ae62477152 --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/GEP.java @@ -0,0 +1,30 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.type.ArrayType; +import cn.edu.nju.software.ir.type.Pointer; +import cn.edu.nju.software.ir.value.ConstValue; +import cn.edu.nju.software.ir.value.ValueRef; + +public class GEP extends Instruction { + private final ArrayType arrayType; + public GEP(ValueRef lVal, ArrayType arrayType, ValueRef[] operands) { + this.lVal = lVal; + operator = "getelementptr"; + this.arrayType = arrayType; + this.operands = operands; + } + + @Override + public String toString() { + StringBuilder instr = new StringBuilder(lVal + " = "); + instr.append(operator).append(" ").append(arrayType).append(", ").append(new Pointer(arrayType)).append(" ").append(operands[0]); + for (int i = 1; i < operands.length; i++) { + if (operands[i] instanceof ConstValue) { + instr.append(", ").append(operands[i]); + } else { + instr.append(", ").append(operands[i].getType()).append(" ").append(operands[i]); + } + } + return instr.toString(); + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Instruction.java b/src/main/java/cn/edu/nju/software/ir/instruction/Instruction.java index f5781d0c6e4b7b2e4fc68010f1901cf4f6cf2268..626abf8d9314212f921ee9c02d917ab9dc04ca64 100644 --- a/src/main/java/cn/edu/nju/software/ir/instruction/Instruction.java +++ b/src/main/java/cn/edu/nju/software/ir/instruction/Instruction.java @@ -1,4 +1,67 @@ package cn.edu.nju.software.ir.instruction; -public class Instruction { +import cn.edu.nju.software.ir.value.ValueRef; + +public abstract class Instruction { + protected ValueRef[] operands; + protected int numberOfOperands; + protected String operator; + protected ValueRef lVal; +// protected final static String DELIMITER = ", "; + + public ValueRef getOperand(int index) { + return operands[index]; + } + + public int getNumberOfOperands() { + return numberOfOperands; + } + + public OpEnum getOp() { + return Operator.getOp(operator); + } + + public boolean isArithmetic() { + return false; + } + + public boolean isLogic() { + return false; + } + + public boolean isCmp() { + return false; + } + + public boolean isCall() { + return false; + } + + public boolean isReturn() { + return false; + } + + public boolean isZExt() { + return false; + } + + public boolean isAlloc() { + return false; + } + + public boolean isStore() { + return false; + } + + public boolean isLoad() { + return false; + } + + public boolean isGEP() { + return false; + } + + public boolean isBr() { + return false; + } } diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/IntToFloat.java b/src/main/java/cn/edu/nju/software/ir/instruction/IntToFloat.java new file mode 100644 index 0000000000000000000000000000000000000000..bee1e5267f1691455454943befb92864414fe545 --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/IntToFloat.java @@ -0,0 +1,16 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.value.ValueRef; + +public class IntToFloat extends Instruction { + public IntToFloat(ValueRef lVal, ValueRef intVal) { + this.lVal = lVal; + operator = "fptosi"; + operands = new ValueRef[]{intVal}; + } + + @Override + public String toString() { + return lVal + " = sitofp i32 " + operands[0] + " to float"; + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Load.java b/src/main/java/cn/edu/nju/software/ir/instruction/Load.java new file mode 100644 index 0000000000000000000000000000000000000000..6b01b0c2d9be36df9f226881539f3c902ae0d8d6 --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/Load.java @@ -0,0 +1,22 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.value.ValueRef; + +public class Load extends Instruction { + // please first implement pointer type (allocate), then use this class + public Load(ValueRef lVal, ValueRef pointer) { + this.lVal = lVal; + operator = "load"; + operands = new ValueRef[]{pointer}; + } + + @Override + public boolean isLoad() { + return true; + } + @Override + public String toString() { + return lVal + " = load " + lVal.getType() + ", " + operands[0].getType() + " " + operands[0] + + ", align " + lVal.getType().getWidth(); + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Logic.java b/src/main/java/cn/edu/nju/software/ir/instruction/Logic.java new file mode 100644 index 0000000000000000000000000000000000000000..614ece94b1b9689fedb15df1fe6c5ca32455d25f --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/Logic.java @@ -0,0 +1,14 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.value.ValueRef; + +public class Logic extends Binary { + public Logic(ValueRef lVal, OpEnum op, ValueRef operand1, ValueRef operand2) { + super(lVal, op, operand1, operand2); + } + + @Override + public boolean isLogic() { + return true; + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/OpEnum.java b/src/main/java/cn/edu/nju/software/ir/instruction/OpEnum.java new file mode 100644 index 0000000000000000000000000000000000000000..1a2bc5db9cabf9e94eb3168519f7486922ba3ea5 --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/OpEnum.java @@ -0,0 +1,27 @@ +package cn.edu.nju.software.ir.instruction; + +public enum OpEnum { + ADD, + SUB, + MUL, + DIV, + MOD, + AND, + OR, + F2I, + I2F, + BR, + ICMP, + XOR, + ZEXT, // unsigned extension + LOAD, + STORE, + ALLOC, + GEP, + CALL, + RETURN, + FADD, + FSUB, + FMUL, + FDIV +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Operator.java b/src/main/java/cn/edu/nju/software/ir/instruction/Operator.java new file mode 100644 index 0000000000000000000000000000000000000000..ac9ea6823f49aa3d7161fcbd4ffd895419290121 --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/Operator.java @@ -0,0 +1,37 @@ +package cn.edu.nju.software.ir.instruction; + +import java.util.Arrays; + +public class Operator { + private final static String[] operators = new String[]{ + "add", "sub", "mul", "sdiv", "srem", "and", "or", + "fptosi", "sitofp", "br", "icmp", "xor", "zext", + "load", "store", "alloca", "getelementptr", + "call", "ret", "fadd", "fsub", "fmul", "fdiv" + }; + + public final static int CmpNE = 0; // != + public final static int CmpEQ = 1; // == + public final static int CmpSGT = 2; // > + public final static int CmpSLT = 3; // < + public final static int CmpSGE = 4; // >= + public final static int CmpSLE = 5; // <= + + public final static String[] cmpType = new String[]{ + "ne", "eq", "sgt", "slt", "sge", "sle" + }; + + protected static String getOperator(OpEnum index) { + return operators[index.ordinal()]; + } + + protected static OpEnum getOp(String op) { + int index = Arrays.binarySearch(operators, op); + for (OpEnum opEnum : OpEnum.values()) { + if (opEnum.ordinal() == index) { + return opEnum; + } + } + return null; + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Ret.java b/src/main/java/cn/edu/nju/software/ir/instruction/Ret.java new file mode 100644 index 0000000000000000000000000000000000000000..8eca18ad5d1c9bf66347b4068a0e781c7fe4ea54 --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/Ret.java @@ -0,0 +1,27 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.type.TypeRef; +import cn.edu.nju.software.ir.type.VoidType; +import cn.edu.nju.software.ir.value.ValueRef; + +import static cn.edu.nju.software.ir.instruction.OpEnum.RETURN; +import static cn.edu.nju.software.ir.instruction.Operator.getOperator; + +public class Ret extends Instruction { + protected final TypeRef retType; + public Ret(VoidType retType) { + operator = getOperator(RETURN); + this.retType = retType; + } + + public Ret(TypeRef retType, ValueRef retVal) { + operator = getOperator(RETURN); + this.retType = retType; + operands = new ValueRef[]{retVal}; + } + + @Override + public boolean isReturn() { + return true; + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/RetValue.java b/src/main/java/cn/edu/nju/software/ir/instruction/RetValue.java new file mode 100644 index 0000000000000000000000000000000000000000..8ef0f7fcdea3e4bb12551fe9acde78bd21cbe8ce --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/RetValue.java @@ -0,0 +1,20 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.type.TypeRef; +import cn.edu.nju.software.ir.value.ConstValue; +import cn.edu.nju.software.ir.value.ValueRef; + +public class RetValue extends Ret { + public RetValue(TypeRef retType, ValueRef retVal) { + super(retType, retVal); + } + + @Override + public String toString() { + if (operands[0] instanceof ConstValue) { + return "ret " + operands[0]; + } else { + return "ret " + retType + " " + operands[0]; + } + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/RetVoid.java b/src/main/java/cn/edu/nju/software/ir/instruction/RetVoid.java new file mode 100644 index 0000000000000000000000000000000000000000..48f8d4e18931298ed8ead3ff4c7bc22ba5aad9dd --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/RetVoid.java @@ -0,0 +1,14 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.type.VoidType; + +public class RetVoid extends Ret { + public RetVoid(VoidType voidType) { + super(voidType); + } + + @Override + public String toString() { + return "ret void"; + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/instruction/Store.java b/src/main/java/cn/edu/nju/software/ir/instruction/Store.java new file mode 100644 index 0000000000000000000000000000000000000000..6c754cc58a812a5994349070eaa1e12b35b3f11a --- /dev/null +++ b/src/main/java/cn/edu/nju/software/ir/instruction/Store.java @@ -0,0 +1,27 @@ +package cn.edu.nju.software.ir.instruction; + +import cn.edu.nju.software.ir.value.ConstValue; +import cn.edu.nju.software.ir.value.ValueRef; + +public class Store extends Instruction { + // please first implement pointer type (allocate), then use this class + public Store(ValueRef value, ValueRef pointer) { + operator = "store"; + operands = new ValueRef[]{value, pointer}; + } + + @Override + public boolean isStore() { + return true; + } + @Override + public String toString() { + if (operands[0] instanceof ConstValue) { + return "store " + operands[0] + ", " + operands[1].getType() + " " + operands[1] + + ", align 4"; + } else { + return "store " + operands[0].getType() + " " + operands[0] + ", " + + operands[1].getType() + " " + operands[1] + ", align " + operands[0].getType().getWidth(); + } + } +} diff --git a/src/main/java/cn/edu/nju/software/ir/value/FunctionValue.java b/src/main/java/cn/edu/nju/software/ir/value/FunctionValue.java index ab885139fed56d1f469b4b91c54fe7f47c731d36..a3db2039c2e46d7efad594c45a951936d53fb91f 100644 --- a/src/main/java/cn/edu/nju/software/ir/value/FunctionValue.java +++ b/src/main/java/cn/edu/nju/software/ir/value/FunctionValue.java @@ -97,6 +97,11 @@ public class FunctionValue extends ValueRef { blockNum--; } + @Override + public String toString() { + return "@" + name; + } + /** * This method should be call only if entering a new module */ diff --git a/src/main/java/cn/edu/nju/software/ir/value/GlobalVar.java b/src/main/java/cn/edu/nju/software/ir/value/GlobalVar.java index 8eaeff2b35678a4f2cee9e89444c3e795813ade9..e0a86d7dc2269f9269b589a7ba88e1d5e8ffa1cf 100644 --- a/src/main/java/cn/edu/nju/software/ir/value/GlobalVar.java +++ b/src/main/java/cn/edu/nju/software/ir/value/GlobalVar.java @@ -36,4 +36,8 @@ public class GlobalVar extends ValueRef { .forEach(ArrayList::clear); } + @Override + public String toString() { + return "@" + name; + } } diff --git a/src/main/java/cn/edu/nju/software/ir/value/LocalVar.java b/src/main/java/cn/edu/nju/software/ir/value/LocalVar.java index 71fcb9bfd7a06cb1207e819c44a400e4ce33e843..5974d53eeb43832f241d2790be01b21b7d51d1d1 100644 --- a/src/main/java/cn/edu/nju/software/ir/value/LocalVar.java +++ b/src/main/java/cn/edu/nju/software/ir/value/LocalVar.java @@ -6,4 +6,9 @@ public class LocalVar extends ValueRef { public LocalVar(TypeRef type, String name) { super(type, name); } + + @Override + public String toString() { + return "%" + name; + } }