Split up emitting of VLA sizes and getting the size of a VLA.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61284 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anders Carlsson 2008-12-20 20:27:15 +00:00
Родитель eb91f0ecb4
Коммит f666b7780d
3 изменённых файлов: 30 добавлений и 18 удалений

Просмотреть файл

@ -180,7 +180,7 @@ void CodeGenFunction::EmitLocalBlockVarDecl(const VarDecl &D) {
const llvm::Type *LElemPtrTy =
llvm::PointerType::get(LElemTy, D.getType().getAddressSpace());
llvm::Value *VLASize = GetVLASize(VAT);
llvm::Value *VLASize = EmitVLASize(VAT);
// Allocate memory for the array.
llvm::Value *VLA = Builder.CreateAlloca(llvm::Type::Int8Ty, VLASize, "vla");

Просмотреть файл

@ -401,30 +401,38 @@ llvm::Value *CodeGenFunction::EmitVAArg(llvm::Value *VAListAddr, QualType Ty)
return AddrTyped;
}
llvm::Value *CodeGenFunction::GetVLASize(const VariableArrayType *VAT)
{
llvm::Value *&SizeEntry = VLASizeMap[VAT];
if (!SizeEntry) {
// Get the element size;
llvm::Value *ElemSize;
QualType ElemTy = VAT->getElementType();
assert(SizeEntry && "Did not emit size for type");
return SizeEntry;
}
if (const VariableArrayType *ElemVAT =
getContext().getAsVariableArrayType(ElemTy))
ElemSize = GetVLASize(ElemVAT);
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,
getContext().getTypeSize(ElemTy) / 8);
}
llvm::Value *CodeGenFunction::EmitVLASize(const VariableArrayType *VAT)
{
llvm::Value *&SizeEntry = VLASizeMap[VAT];
llvm::Value *NumElements = EmitScalarExpr(VAT->getSizeExpr());
assert(!SizeEntry && "Must not emit the same VLA size more than once!");
// Get the element size;
llvm::Value *ElemSize;
QualType ElemTy = VAT->getElementType();
SizeEntry = Builder.CreateMul(ElemSize, NumElements);
if (const VariableArrayType *ElemVAT =
getContext().getAsVariableArrayType(ElemTy))
ElemSize = EmitVLASize(ElemVAT);
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,
getContext().getTypeSize(ElemTy) / 8);
}
llvm::Value *NumElements = EmitScalarExpr(VAT->getSizeExpr());
SizeEntry = Builder.CreateMul(ElemSize, NumElements);
return SizeEntry;
}

Просмотреть файл

@ -349,7 +349,11 @@ public:
// FIXME: We should be able to get rid of this method and use the va_arg
// instruction in LLVM instead once it works well enough.
llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty);
// EmitVLASize - Generate code for the VLA type. Returns an
// lLVM value that corresponds to the size in bytes of the
llvm::Value *EmitVLASize(const VariableArrayType *);
// GetVLASize - Returns an LLVM value that corresponds to the size in bytes
// of a variable length array type.
llvm::Value *GetVLASize(const VariableArrayType *);