[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