Do not emit DW_AT_upper_bound and DW_AT_lower_bound for unbouded array.
If lower bound is more then upper bound then consider it is an unbounded array.
An array is unbounded if non-zero lower bound is same as upper bound.
If lower bound and upper bound are zero than array has one element.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129156 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
index bad87c1..b9bf37b 100644
--- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
+++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
@@ -1237,15 +1237,27 @@
 
 /// constructSubrangeDIE - Construct subrange DIE from DISubrange.
 void DwarfDebug::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);
   int64_t L = SR.getLo();
   int64_t H = SR.getHi();
-  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 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 the array will be unbounded. If the L is 
+  // non zero and same is H then also the array will be unbounded. If L is
+  // zero and H is zero then the array has one element and in such case do
+  // not emit lower bound.
+
+  if (L > H || (L == H && L != 0)) {
+    // This is an unbounded subrange.
+    Buffer.addChild(DW_Subrange);
+    return;
+  }
+
   if (L)
     addSInt(DW_Subrange, dwarf::DW_AT_lower_bound, 0, L);
   addSInt(DW_Subrange, dwarf::DW_AT_upper_bound, 0, H);
-
   Buffer.addChild(DW_Subrange);
 }