[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

Bill Wendling isanbard at gmail.com
Mon Dec 3 22:21:27 PST 2012


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





More information about the cfe-commits mailing list