зеркало из https://github.com/microsoft/clang-1.git
Follow Eli's advice and store the VLA size with the native size_t type. Fixes PR3491.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63879 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
1a6b3686bf
Коммит
96f214776c
|
@ -197,6 +197,9 @@ void CodeGenFunction::EmitLocalBlockVarDecl(const VarDecl &D) {
|
|||
|
||||
llvm::Value *VLASize = EmitVLASize(Ty);
|
||||
|
||||
// Downcast the VLA size expression
|
||||
VLASize = Builder.CreateIntCast(VLASize, llvm::Type::Int32Ty, false, "tmp");
|
||||
|
||||
// Allocate memory for the array.
|
||||
llvm::Value *VLA = Builder.CreateAlloca(llvm::Type::Int8Ty, VLASize, "vla");
|
||||
DeclPtr = Builder.CreateBitCast(VLA, LElemPtrTy, "tmp");
|
||||
|
|
|
@ -685,9 +685,7 @@ ScalarExprEmitter::VisitSizeOfAlignOfExpr(const SizeOfAlignOfExpr *E) {
|
|||
CGF.EmitVLASize(TypeToSize);
|
||||
}
|
||||
|
||||
llvm::Value *VLASize = CGF.GetVLASize(VAT);
|
||||
return Builder.CreateIntCast(VLASize, ConvertType(E->getType()),
|
||||
false, "conv");
|
||||
return CGF.GetVLASize(VAT);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -480,18 +480,19 @@ llvm::Value *CodeGenFunction::EmitVLASize(QualType Ty)
|
|||
llvm::Value *ElemSize;
|
||||
|
||||
QualType ElemTy = VAT->getElementType();
|
||||
|
||||
|
||||
const llvm::Type *SizeTy = ConvertType(getContext().getSizeType());
|
||||
|
||||
if (ElemTy->isVariableArrayType())
|
||||
ElemSize = EmitVLASize(ElemTy);
|
||||
else {
|
||||
// FIXME: We use Int32Ty here because the alloca instruction takes a
|
||||
// 32-bit integer. What should we do about overflow?
|
||||
ElemSize = llvm::ConstantInt::get(llvm::Type::Int32Ty,
|
||||
ElemSize = llvm::ConstantInt::get(SizeTy,
|
||||
getContext().getTypeSize(ElemTy) / 8);
|
||||
}
|
||||
|
||||
llvm::Value *NumElements = EmitScalarExpr(VAT->getSizeExpr());
|
||||
|
||||
NumElements = Builder.CreateIntCast(NumElements, SizeTy, false, "tmp");
|
||||
|
||||
SizeEntry = Builder.CreateMul(ElemSize, NumElements);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче