mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +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