aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2012-12-04 21:34:03 +0000
committerBill Wendling <isanbard@gmail.com>2012-12-04 21:34:03 +0000
commit9493dae613847b01b79914502f337814fe3e00ac (patch)
treea226d132d41fbb221f379e5d5099b28a3e13af70 /lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
parent91b9763d53d12e5bb89a395daec9e12359e7adb4 (diff)
Use the 'count' attribute to calculate the upper bound of an array.
The count attribute is more accurate with regards to the size of an array. It also obviates the upper bound attribute in the subrange. We can also better handle an unbound array by setting the count to -1 instead of the lower bound to 1 and upper bound to 0. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169312 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp')
-rw-r--r--lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp27
1 files changed, 14 insertions, 13 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index f5f36e461f..c880707949 100644
--- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -1250,24 +1250,25 @@ void CompileUnit::constructSubrangeDIE(DIE &Buffer, DISubrange SR,
DIE *IndexTy) {
DIE *DW_Subrange = new DIE(dwarf::DW_TAG_subrange_type);
addDIEEntry(DW_Subrange, dwarf::DW_AT_type, dwarf::DW_FORM_ref4, IndexTy);
+
+ // The L value defines the lower bounds which is typically zero for C/C++. The
+ // Count value is the number of elements. Values are 64 bit. If Count == -1
+ // then the array is unbounded and we do not emit DW_AT_lower_bound and
+ // DW_AT_upper_bound attributes. If L == 0 and Count == 0, then the array has
+ // zero elements in which case we do not emit an upper bound.
uint64_t L = SR.getLo();
- uint64_t H = SR.getHi();
int64_t Count = SR.getCount();
- // The L value defines the lower bounds which is typically zero for C/C++. The
- // H value is the upper bounds. Values are 64 bit. H - L + 1 is the size
- // of the array. If L > H then do not emit DW_AT_lower_bound and
- // DW_AT_upper_bound attributes. If L is zero and H is also zero then the
- // array has one element and in such case do not emit lower bound.
+ if (Count != -1) {
+ // FIXME: An unbounded array should reference the expression that defines
+ // the array.
+ if (L)
+ addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
- if (L > H) {
- Buffer.addChild(DW_Subrange);
- return;
+ if (Count != 0)
+ addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, Count - 1);
}
- if (L)
- addUInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
- if (H > 0 || Count != 0)
- addUInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
+
Buffer.addChild(DW_Subrange);
}