aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CodeGenFunction.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CodeGen/CodeGenFunction.cpp')
-rw-r--r--lib/CodeGen/CodeGenFunction.cpp53
1 files changed, 32 insertions, 21 deletions
diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp
index 4a3bb3f6ca..6f32553118 100644
--- a/lib/CodeGen/CodeGenFunction.cpp
+++ b/lib/CodeGen/CodeGenFunction.cpp
@@ -410,29 +410,40 @@ llvm::Value *CodeGenFunction::GetVLASize(const VariableArrayType *VAT)
return SizeEntry;
}
-llvm::Value *CodeGenFunction::EmitVLASize(const VariableArrayType *VAT)
+llvm::Value *CodeGenFunction::EmitVLASize(QualType Ty)
{
- llvm::Value *&SizeEntry = VLASizeMap[VAT];
-
- assert(!SizeEntry && "Must not emit the same VLA size more than once!");
- // Get the element size;
- llvm::Value *ElemSize;
+ assert(Ty->isVariablyModifiedType() &&
+ "Must pass variably modified type to EmitVLASizes!");
- QualType ElemTy = VAT->getElementType();
-
- if (const VariableArrayType *ElemVAT =
- getContext().getAsVariableArrayType(ElemTy))
- ElemSize = EmitVLASize(ElemVAT);
+ if (const VariableArrayType *VAT = getContext().getAsVariableArrayType(Ty)) {
+ llvm::Value *&SizeEntry = VLASizeMap[VAT];
+
+ assert(!SizeEntry && "Must not emit the same VLA size more than once!");
+
+ // Get the element size;
+ llvm::Value *ElemSize;
+
+ QualType ElemTy = VAT->getElementType();
+
+ 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,
+ getContext().getTypeSize(ElemTy) / 8);
+ }
+
+ llvm::Value *NumElements = EmitScalarExpr(VAT->getSizeExpr());
+
+ SizeEntry = Builder.CreateMul(ElemSize, NumElements);
+
+ return SizeEntry;
+ } else if (const PointerType *PT = Ty->getAsPointerType())
+ EmitVLASize(PT->getPointeeType());
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);
+ assert(0 && "unknown VM type!");
}
-
- llvm::Value *NumElements = EmitScalarExpr(VAT->getSizeExpr());
-
- SizeEntry = Builder.CreateMul(ElemSize, NumElements);
-
- return SizeEntry;
+
+ return 0;
}