mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-24 06:25:18 +00:00
[opaque pointer type] Track explicit GEP pointee type through in-memory IR
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236510 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -801,6 +801,8 @@ inline Type *checkGEPType(Type *Ty) {
|
||||
/// access elements of arrays and structs
|
||||
///
|
||||
class GetElementPtrInst : public Instruction {
|
||||
Type *SourceElementType;
|
||||
|
||||
GetElementPtrInst(const GetElementPtrInst &GEPI);
|
||||
void init(Value *Ptr, ArrayRef<Value *> IdxList, const Twine &NameStr);
|
||||
|
||||
@@ -823,6 +825,13 @@ public:
|
||||
const Twine &NameStr = "",
|
||||
Instruction *InsertBefore = nullptr) {
|
||||
unsigned Values = 1 + unsigned(IdxList.size());
|
||||
if (!PointeeType)
|
||||
PointeeType =
|
||||
cast<PointerType>(Ptr->getType()->getScalarType())->getElementType();
|
||||
else
|
||||
assert(
|
||||
PointeeType ==
|
||||
cast<PointerType>(Ptr->getType()->getScalarType())->getElementType());
|
||||
return new (Values) GetElementPtrInst(PointeeType, Ptr, IdxList, Values,
|
||||
NameStr, InsertBefore);
|
||||
}
|
||||
@@ -831,6 +840,13 @@ public:
|
||||
const Twine &NameStr,
|
||||
BasicBlock *InsertAtEnd) {
|
||||
unsigned Values = 1 + unsigned(IdxList.size());
|
||||
if (!PointeeType)
|
||||
PointeeType =
|
||||
cast<PointerType>(Ptr->getType()->getScalarType())->getElementType();
|
||||
else
|
||||
assert(
|
||||
PointeeType ==
|
||||
cast<PointerType>(Ptr->getType()->getScalarType())->getElementType());
|
||||
return new (Values) GetElementPtrInst(PointeeType, Ptr, IdxList, Values,
|
||||
NameStr, InsertAtEnd);
|
||||
}
|
||||
@@ -876,10 +892,9 @@ public:
|
||||
return cast<SequentialType>(Instruction::getType());
|
||||
}
|
||||
|
||||
Type *getSourceElementType() const {
|
||||
return cast<SequentialType>(getPointerOperandType()->getScalarType())
|
||||
->getElementType();
|
||||
}
|
||||
Type *getSourceElementType() const { return SourceElementType; }
|
||||
|
||||
void setSourceElementType(Type *Ty) { SourceElementType = Ty; }
|
||||
|
||||
Type *getResultElementType() const {
|
||||
return cast<PointerType>(getType()->getScalarType())->getElementType();
|
||||
@@ -1002,23 +1017,21 @@ GetElementPtrInst::GetElementPtrInst(Type *PointeeType, Value *Ptr,
|
||||
ArrayRef<Value *> IdxList, unsigned Values,
|
||||
const Twine &NameStr,
|
||||
Instruction *InsertBefore)
|
||||
: Instruction(PointeeType ? getGEPReturnType(PointeeType, Ptr, IdxList)
|
||||
: getGEPReturnType(Ptr, IdxList),
|
||||
GetElementPtr,
|
||||
: Instruction(getGEPReturnType(PointeeType, Ptr, IdxList), GetElementPtr,
|
||||
OperandTraits<GetElementPtrInst>::op_end(this) - Values,
|
||||
Values, InsertBefore) {
|
||||
Values, InsertBefore),
|
||||
SourceElementType(PointeeType) {
|
||||
init(Ptr, IdxList, NameStr);
|
||||
assert(!PointeeType || PointeeType == getSourceElementType());
|
||||
}
|
||||
GetElementPtrInst::GetElementPtrInst(Type *PointeeType, Value *Ptr,
|
||||
ArrayRef<Value *> IdxList, unsigned Values,
|
||||
const Twine &NameStr,
|
||||
BasicBlock *InsertAtEnd)
|
||||
: Instruction(getGEPReturnType(Ptr, IdxList), GetElementPtr,
|
||||
: Instruction(getGEPReturnType(PointeeType, Ptr, IdxList), GetElementPtr,
|
||||
OperandTraits<GetElementPtrInst>::op_end(this) - Values,
|
||||
Values, InsertAtEnd) {
|
||||
Values, InsertAtEnd),
|
||||
SourceElementType(PointeeType) {
|
||||
init(Ptr, IdxList, NameStr);
|
||||
assert(!PointeeType || PointeeType == getSourceElementType());
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user