llvmir some opt
This commit is contained in:
57
midend/llvm/instr/GepInstr.java
Normal file
57
midend/llvm/instr/GepInstr.java
Normal file
@@ -0,0 +1,57 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user