summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2012-11-13 02:31:58 +0000
committerBill Wendling <isanbard@gmail.com>2012-11-13 02:31:58 +0000
commit2415b3b6b0c4eeb47c53cc0f908040d106b4d024 (patch)
tree1889d4e85ca8e188e2acae8a3fa68e826655c63c /clang/lib/CodeGen
parentf454dfb6b5af1ff34602577b5f546c3370be315e (diff)
downloadbcm5719-llvm-2415b3b6b0c4eeb47c53cc0f908040d106b4d024.tar.gz
bcm5719-llvm-2415b3b6b0c4eeb47c53cc0f908040d106b4d024.zip
Use the 'count' attribute instead of the 'upper_bound' attribute.
If we have a type 'int a[1]' and a type 'int b[0]', the generated DWARF is the same for both of them because we use the 'upper_bound' attribute. Instead use the 'count' attrbute, which gives the correct number of elements in the array. <rdar://problem/12566646> llvm-svn: 167807
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CGDebugInfo.cpp21
1 files changed, 12 insertions, 9 deletions
diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp
index 80fa09be747..38438896357 100644
--- a/clang/lib/CodeGen/CGDebugInfo.cpp
+++ b/clang/lib/CodeGen/CGDebugInfo.cpp
@@ -1473,23 +1473,23 @@ llvm::DIType CGDebugInfo::CreateType(const ObjCInterfaceType *Ty,
llvm::DIType CGDebugInfo::CreateType(const VectorType *Ty, llvm::DIFile Unit) {
llvm::DIType ElementTy = getOrCreateType(Ty->getElementType(), Unit);
- int64_t NumElems = Ty->getNumElements();
+ int64_t UpperBound = Ty->getNumElements();
int64_t LowerBound = 0;
- if (NumElems == 0)
+ if (UpperBound == 0)
// If number of elements are not known then this is an unbounded array.
// Use Low = 1, Hi = 0 to express such arrays.
LowerBound = 1;
else
- --NumElems;
+ --UpperBound;
- llvm::Value *Subscript = DBuilder.getOrCreateSubrange(LowerBound, NumElems);
+ llvm::Value *Subscript = DBuilder.getOrCreateSubrange(LowerBound, UpperBound,
+ Ty->getNumElements());
llvm::DIArray SubscriptArray = DBuilder.getOrCreateArray(Subscript);
uint64_t Size = CGM.getContext().getTypeSize(Ty);
uint64_t Align = CGM.getContext().getTypeAlign(Ty);
- return
- DBuilder.createVectorType(Size, Align, ElementTy, SubscriptArray);
+ return DBuilder.createVectorType(Size, Align, ElementTy, SubscriptArray);
}
llvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty,
@@ -1525,9 +1525,11 @@ llvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty,
while ((Ty = dyn_cast<ArrayType>(EltTy))) {
int64_t UpperBound = 0;
int64_t LowerBound = 0;
+ uint64_t Count = 0;
if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(Ty)) {
- if (CAT->getSize().getZExtValue())
- UpperBound = CAT->getSize().getZExtValue() - 1;
+ Count = CAT->getSize().getZExtValue();
+ if (Count)
+ UpperBound = Count - 1;
} else
// This is an unbounded array. Use Low = 1, Hi = 0 to express such
// arrays.
@@ -1535,7 +1537,8 @@ llvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty,
// FIXME: Verify this is right for VLAs.
Subscripts.push_back(DBuilder.getOrCreateSubrange(LowerBound,
- UpperBound));
+ UpperBound,
+ Count));
EltTy = Ty->getElementType();
}
OpenPOWER on IntegriCloud