Add map of VLA types and their sizes

llvm-svn: 60939
This commit is contained in:
Anders Carlsson 2008-12-12 07:19:02 +00:00
parent dcba4a7713
commit ccbe9200f9
2 changed files with 36 additions and 0 deletions

View File

@ -401,3 +401,30 @@ 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();
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 *NumElements = EmitScalarExpr(VAT->getSizeExpr());
SizeEntry = Builder.CreateMul(ElemSize, NumElements);
}
return SizeEntry;
}

View File

@ -166,6 +166,11 @@ private:
/// statement range in current switch instruction.
llvm::BasicBlock *CaseRangeBlock;
// VLASizeMap - This keeps track of the associated size for each VLA type
// FIXME: Maybe this could be a stack of maps that is pushed/popped as
// we enter/leave scopes.
llvm::DenseMap<const VariableArrayType*, llvm::Value*> VLASizeMap;
/// StackSaveValues - A stack(!) of stack save values. When a new scope is
/// entered, a null is pushed on this stack. If a VLA is emitted, then
/// the return value of llvm.stacksave() is stored at the top of this stack.
@ -344,6 +349,10 @@ public:
// instruction in LLVM instead once it works well enough.
llvm::Value *EmitVAArg(llvm::Value *VAListAddr, QualType Ty);
// GetVLASize - Returns an LLVM value that corresponds to the size in bytes
// of a variable length array type.
llvm::Value *GetVLASize(const VariableArrayType *);
//===--------------------------------------------------------------------===//
// Declaration Emission
//===--------------------------------------------------------------------===//