mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-11-04 05:17:07 +00:00 
			
		
		
		
	[opaque pointer type] Store the value type of an alloca
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236175 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		@@ -73,6 +73,8 @@ return (Ord == Release ||
 | 
				
			|||||||
/// AllocaInst - an instruction to allocate memory on the stack
 | 
					/// AllocaInst - an instruction to allocate memory on the stack
 | 
				
			||||||
///
 | 
					///
 | 
				
			||||||
class AllocaInst : public UnaryInstruction {
 | 
					class AllocaInst : public UnaryInstruction {
 | 
				
			||||||
 | 
					  Type *AllocatedType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
protected:
 | 
					protected:
 | 
				
			||||||
  AllocaInst *clone_impl() const override;
 | 
					  AllocaInst *clone_impl() const override;
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
@@ -113,7 +115,10 @@ public:
 | 
				
			|||||||
  /// getAllocatedType - Return the type that is being allocated by the
 | 
					  /// getAllocatedType - Return the type that is being allocated by the
 | 
				
			||||||
  /// instruction.
 | 
					  /// instruction.
 | 
				
			||||||
  ///
 | 
					  ///
 | 
				
			||||||
  Type *getAllocatedType() const;
 | 
					  Type *getAllocatedType() const { return AllocatedType; }
 | 
				
			||||||
 | 
					  /// \brief for use only in special circumstances that need to generically
 | 
				
			||||||
 | 
					  /// transform a whole instruction (eg: IR linking and vectorization).
 | 
				
			||||||
 | 
					  void setAllocatedType(Type *Ty) { AllocatedType = Ty; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /// getAlignment - Return the alignment of the memory that is being allocated
 | 
					  /// getAlignment - Return the alignment of the memory that is being allocated
 | 
				
			||||||
  /// by the instruction.
 | 
					  /// by the instruction.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -865,7 +865,8 @@ AllocaInst::AllocaInst(Type *Ty, Value *ArraySize, const Twine &Name,
 | 
				
			|||||||
AllocaInst::AllocaInst(Type *Ty, Value *ArraySize, unsigned Align,
 | 
					AllocaInst::AllocaInst(Type *Ty, Value *ArraySize, unsigned Align,
 | 
				
			||||||
                       const Twine &Name, Instruction *InsertBefore)
 | 
					                       const Twine &Name, Instruction *InsertBefore)
 | 
				
			||||||
    : UnaryInstruction(PointerType::getUnqual(Ty), Alloca,
 | 
					    : UnaryInstruction(PointerType::getUnqual(Ty), Alloca,
 | 
				
			||||||
                     getAISize(Ty->getContext(), ArraySize), InsertBefore) {
 | 
					                       getAISize(Ty->getContext(), ArraySize), InsertBefore),
 | 
				
			||||||
 | 
					      AllocatedType(Ty) {
 | 
				
			||||||
  setAlignment(Align);
 | 
					  setAlignment(Align);
 | 
				
			||||||
  assert(!Ty->isVoidTy() && "Cannot allocate void!");
 | 
					  assert(!Ty->isVoidTy() && "Cannot allocate void!");
 | 
				
			||||||
  setName(Name);
 | 
					  setName(Name);
 | 
				
			||||||
@@ -874,7 +875,8 @@ AllocaInst::AllocaInst(Type *Ty, Value *ArraySize, unsigned Align,
 | 
				
			|||||||
AllocaInst::AllocaInst(Type *Ty, Value *ArraySize, unsigned Align,
 | 
					AllocaInst::AllocaInst(Type *Ty, Value *ArraySize, unsigned Align,
 | 
				
			||||||
                       const Twine &Name, BasicBlock *InsertAtEnd)
 | 
					                       const Twine &Name, BasicBlock *InsertAtEnd)
 | 
				
			||||||
    : UnaryInstruction(PointerType::getUnqual(Ty), Alloca,
 | 
					    : UnaryInstruction(PointerType::getUnqual(Ty), Alloca,
 | 
				
			||||||
                     getAISize(Ty->getContext(), ArraySize), InsertAtEnd) {
 | 
					                       getAISize(Ty->getContext(), ArraySize), InsertAtEnd),
 | 
				
			||||||
 | 
					      AllocatedType(Ty) {
 | 
				
			||||||
  setAlignment(Align);
 | 
					  setAlignment(Align);
 | 
				
			||||||
  assert(!Ty->isVoidTy() && "Cannot allocate void!");
 | 
					  assert(!Ty->isVoidTy() && "Cannot allocate void!");
 | 
				
			||||||
  setName(Name);
 | 
					  setName(Name);
 | 
				
			||||||
@@ -899,10 +901,6 @@ bool AllocaInst::isArrayAllocation() const {
 | 
				
			|||||||
  return true;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Type *AllocaInst::getAllocatedType() const {
 | 
					 | 
				
			||||||
  return getType()->getElementType();
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/// isStaticAlloca - Return true if this alloca is in the entry block of the
 | 
					/// isStaticAlloca - Return true if this alloca is in the entry block of the
 | 
				
			||||||
/// function and is a constant size.  If so, the code generator will fold it
 | 
					/// function and is a constant size.  If so, the code generator will fold it
 | 
				
			||||||
/// into the prolog/epilog code, so it is basically free.
 | 
					/// into the prolog/epilog code, so it is basically free.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -396,6 +396,9 @@ void llvm::RemapInstruction(Instruction *I, ValueToValueMapTy &VMap,
 | 
				
			|||||||
      Tys.push_back(TypeMapper->remapType(Ty));
 | 
					      Tys.push_back(TypeMapper->remapType(Ty));
 | 
				
			||||||
    CS.mutateFunctionType(FunctionType::get(
 | 
					    CS.mutateFunctionType(FunctionType::get(
 | 
				
			||||||
        TypeMapper->remapType(I->getType()), Tys, FTy->isVarArg()));
 | 
					        TypeMapper->remapType(I->getType()), Tys, FTy->isVarArg()));
 | 
				
			||||||
  } else
 | 
					    return;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  if (auto *AI = dyn_cast<AllocaInst>(I))
 | 
				
			||||||
 | 
					    AI->setAllocatedType(TypeMapper->remapType(AI->getAllocatedType()));
 | 
				
			||||||
  I->mutateType(TypeMapper->remapType(I->getType()));
 | 
					  I->mutateType(TypeMapper->remapType(I->getType()));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user