Does it make sense to only emit this attribute in the ambiguous case? -Chris
On Dec 3, 2012, at 10:21 PM, Bill Wendling <[email protected]> wrote: > Author: void > Date: Tue Dec 4 00:21:27 2012 > New Revision: 169219 > > URL: http://llvm.org/viewvc/llvm-project?rev=169219&view=rev > Log: > Add a 'count' field to the DWARF subrange. > > The count field is necessary because there isn't a difference between the 'lo' > and 'hi' attributes for a one-element array and a zero-element array. When the > count is '0', we know that this is a zero-element array. When it's >=1, then > it's a normal constant sized array. When it's -1, then the array is unbounded. > > Added: > cfe/trunk/test/CodeGenCXX/debug-info-zero-length-arrays.cpp > Modified: > cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > cfe/trunk/test/CodeGenCXX/debug-info-flex-member.cpp > > Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=169219&r1=169218&r2=169219&view=diff > ============================================================================== > --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original) > +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Tue Dec 4 00:21:27 2012 > @@ -1475,6 +1475,7 @@ > llvm::DIType ElementTy = getOrCreateType(Ty->getElementType(), Unit); > int64_t NumElems = Ty->getNumElements(); > int64_t LowerBound = 0; > + int64_t Count = NumElems; > if (NumElems == 0) > // If number of elements are not known then this is an unbounded array. > // Use Low = 1, Hi = 0 to express such arrays. > @@ -1482,7 +1483,8 @@ > else > --NumElems; > > - llvm::Value *Subscript = DBuilder.getOrCreateSubrange(LowerBound, > NumElems); > + llvm::Value *Subscript = DBuilder.getOrCreateSubrange(LowerBound, NumElems, > + Count); > llvm::DIArray SubscriptArray = DBuilder.getOrCreateArray(Subscript); > > uint64_t Size = CGM.getContext().getTypeSize(Ty); > @@ -1523,19 +1525,30 @@ > SmallVector<llvm::Value *, 8> Subscripts; > QualType EltTy(Ty, 0); > while ((Ty = dyn_cast<ArrayType>(EltTy))) { > + // If the number of elements is known, then count is that number. > Otherwise, > + // it's -1. This allows us to represent a subrange with an array of 0 > + // elements, like this: > + // > + // struct foo { > + // int x[0]; > + // }; > int64_t UpperBound = 0; > int64_t LowerBound = 0; > + int64_t Count = -1; > if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(Ty)) { > - if (CAT->getSize().getZExtValue()) > - UpperBound = CAT->getSize().getZExtValue() - 1; > - } else > + Count = CAT->getSize().getZExtValue(); > + if (Count) > + UpperBound = Count - 1; > + } else { > // This is an unbounded array. Use Low = 1, Hi = 0 to express such > // arrays. > LowerBound = 1; > + } > > // FIXME: Verify this is right for VLAs. > Subscripts.push_back(DBuilder.getOrCreateSubrange(LowerBound, > - UpperBound)); > + UpperBound, > + Count)); > EltTy = Ty->getElementType(); > } > > > Modified: cfe/trunk/test/CodeGenCXX/debug-info-flex-member.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-flex-member.cpp?rev=169219&r1=169218&r2=169219&view=diff > ============================================================================== > --- cfe/trunk/test/CodeGenCXX/debug-info-flex-member.cpp (original) > +++ cfe/trunk/test/CodeGenCXX/debug-info-flex-member.cpp Tue Dec 4 00:21:27 > 2012 > @@ -1,6 +1,6 @@ > // RUN: %clang_cc1 -emit-llvm -g -triple x86_64-apple-darwin %s -o - | > FileCheck %s > > -// CHECK: metadata !{i32 {{.*}}, i64 1, i64 0} ; [ > DW_TAG_subrange_type ] > +// CHECK: metadata !{i32 {{.*}}, i64 1, i64 0, i64 -1} ; [ > DW_TAG_subrange_type ] > > struct StructName { > int member[]; > > Added: cfe/trunk/test/CodeGenCXX/debug-info-zero-length-arrays.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-zero-length-arrays.cpp?rev=169219&view=auto > ============================================================================== > --- cfe/trunk/test/CodeGenCXX/debug-info-zero-length-arrays.cpp (added) > +++ cfe/trunk/test/CodeGenCXX/debug-info-zero-length-arrays.cpp Tue Dec 4 > 00:21:27 2012 > @@ -0,0 +1,16 @@ > +// RUN: %clang -fverbose-asm -g -O0 -S %s -o - | FileCheck %s > +// <rdar://problem/12566646> > + > +class A { > + int x[]; > +}; > +A a; > + > +// CHECK: Abbrev [3] 0x2d:0x3 DW_TAG_base_type > +// CHECK-NEXT: DW_AT_byte_size > +// CHECK-NEXT: DW_AT_encoding > +// CHECK-NEXT: Abbrev [4] 0x30:0xb DW_TAG_array_type > +// CHECK-NEXT: DW_AT_type > +// CHECK-NEXT: Abbrev [5] 0x35:0x5 DW_TAG_subrange_type > +// CHECK-NEXT: DW_AT_type > +// CHECK-NEXT: End Of Children Mark > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
