[cfe-commits] r167807 - in /cfe/trunk: lib/CodeGen/CGDebugInfo.cpp test/CodeGen/debug-info-zero-length-arrays.c test/CodeGenCXX/debug-info-flex-member.cpp
Bill Wendling
isanbard at gmail.com
Mon Nov 12 18:31:58 PST 2012
Author: void
Date: Mon Nov 12 20:31:58 2012
New Revision: 167807
URL: http://llvm.org/viewvc/llvm-project?rev=167807&view=rev
Log:
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>
Added:
cfe/trunk/test/CodeGen/debug-info-zero-length-arrays.c
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=167807&r1=167806&r2=167807&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Mon Nov 12 20:31:58 2012
@@ -1473,23 +1473,23 @@
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 @@
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 @@
// FIXME: Verify this is right for VLAs.
Subscripts.push_back(DBuilder.getOrCreateSubrange(LowerBound,
- UpperBound));
+ UpperBound,
+ Count));
EltTy = Ty->getElementType();
}
Added: cfe/trunk/test/CodeGen/debug-info-zero-length-arrays.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-info-zero-length-arrays.c?rev=167807&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/debug-info-zero-length-arrays.c (added)
+++ cfe/trunk/test/CodeGen/debug-info-zero-length-arrays.c Mon Nov 12 20:31:58 2012
@@ -0,0 +1,33 @@
+// RUN: %clang -emit-llvm -S -g %s -o - | FileCheck %s
+
+// <rdar://problem/12566646>
+
+// The subrange for a type 'int[1]' and 'int[0]' should be different. Use the
+// 'count' attribute instead of the 'upper_bound' attribute do disabmiguate the
+// DIE.
+
+struct foo {
+ int a;
+ int b[1];
+};
+
+struct bar {
+ int a;
+ int b[0];
+};
+
+int main()
+{
+ struct foo my_foo;
+ struct bar my_bar;
+
+ my_foo.a = 3;
+ my_bar.a = 5;
+
+ return my_foo.a + my_bar.a;
+}
+
+// The third metadata operand is the count.
+//
+// CHECK: metadata !{i32 786465, i64 0, i64 0, i64 1} ; [ DW_TAG_subrange_type ]
+// CHECK: metadata !{i32 786465, i64 0, i64 0, i64 0} ; [ DW_TAG_subrange_type ]
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=167807&r1=167806&r2=167807&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/debug-info-flex-member.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/debug-info-flex-member.cpp Mon Nov 12 20:31:58 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 0} ; [ DW_TAG_subrange_type ]
struct StructName {
int member[];
More information about the cfe-commits
mailing list