58 lines
1.8 KiB
Java
58 lines
1.8 KiB
Java
package midend.llvm.instr;
|
|
|
|
import midend.llvm.type.IrArrayType;
|
|
import midend.llvm.type.IrPointerType;
|
|
import midend.llvm.type.IrType;
|
|
import midend.llvm.value.IrValue;
|
|
|
|
public class GepInstr extends IrInstr {
|
|
public GepInstr(IrValue pointer, IrValue offset, String name) {
|
|
super(new IrPointerType(getTargetType(pointer)), name, IrInstrType.GEP);
|
|
addUse(pointer);
|
|
addUse(offset);
|
|
}
|
|
|
|
public IrValue getPointer() {
|
|
return getUse(0);
|
|
}
|
|
|
|
public IrValue getOffset() {
|
|
return getUse(1);
|
|
}
|
|
|
|
public String toString() {
|
|
IrValue pointer = this.getPointer();
|
|
IrValue offset = this.getOffset();
|
|
|
|
IrPointerType pointerType = (IrPointerType) pointer.getType();
|
|
IrType targetType = pointerType.getPointeeType();
|
|
|
|
if (targetType instanceof IrArrayType arrayType) {
|
|
return getName() + " = getelementptr inbounds " +
|
|
arrayType + ", " +
|
|
pointerType + " " +
|
|
pointer.getName() + ", i32 0, " +
|
|
offset.getType() + " " +
|
|
offset.getName();
|
|
} else {
|
|
return getName() + " = getelementptr inbounds " +
|
|
targetType + ", " +
|
|
pointerType + " " +
|
|
pointer.getName() + ", " +
|
|
offset.getType() + " " +
|
|
offset.getName();
|
|
}
|
|
}
|
|
|
|
public static IrType getTargetType(IrValue pointer) {
|
|
IrType targetType = ((IrPointerType) pointer.getType()).getPointeeType();
|
|
if (targetType instanceof IrArrayType arrayType) {
|
|
return arrayType.getElementType();
|
|
} else if (targetType instanceof IrPointerType pointerType) {
|
|
return pointerType.getPointeeType();
|
|
} else {
|
|
return targetType;
|
|
}
|
|
}
|
|
}
|