mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-29 10:25:12 +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.
|
||||||
|
@@ -864,8 +864,9 @@ 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);
|
||||||
@@ -873,8 +874,9 @@ 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;
|
||||||
I->mutateType(TypeMapper->remapType(I->getType()));
|
}
|
||||||
|
if (auto *AI = dyn_cast<AllocaInst>(I))
|
||||||
|
AI->setAllocatedType(TypeMapper->remapType(AI->getAllocatedType()));
|
||||||
|
I->mutateType(TypeMapper->remapType(I->getType()));
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user