[cfe-commits] r169219 - in /cfe/trunk: lib/CodeGen/CGDebugInfo.cpp test/CodeGenCXX/debug-info-flex-member.cpp test/CodeGenCXX/debug-info-zero-length-arrays.cpp
Chris Lattner
clattner at apple.com
Tue Dec 4 08:52:52 PST 2012
Does it make sense to only emit this attribute in the ambiguous case?
-Chris
On Dec 3, 2012, at 10:21 PM, Bill Wendling <isanbard at gmail.com> 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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list