dwarf2out: Use normal constant values in bound_info if possible.
authorMark Wielaard <mjw@redhat.com>
Thu, 17 Apr 2014 10:36:21 +0000 (10:36 +0000)
committerMark Wielaard <mark@gcc.gnu.org>
Thu, 17 Apr 2014 10:36:21 +0000 (10:36 +0000)
* dwarf2out.c (add_bound_info): If HOST_WIDE_INT is big enough,
then represent the bound as normal constant value.

From-SVN: r209473

gcc/ChangeLog
gcc/dwarf2out.c

index 2a00a71..1d89ceb 100644 (file)
@@ -1,3 +1,8 @@
+2014-03-20  Mark Wielaard  <mjw@redhat.com>
+
+       * dwarf2out.c (add_bound_info): If HOST_WIDE_INT is big enough,
+       then represent the bound as normal constant value.
+
 2014-04-17  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/60847
index 0cdb3dc..8caf940 100644 (file)
@@ -16203,21 +16203,31 @@ add_bound_info (dw_die_ref subrange_die, enum dwarf_attribute bound_attr, tree b
            && tree_to_shwi (bound) == dflt)
          ;
 
-       /* Otherwise represent the bound as an unsigned value with the
-          precision of its type.  The precision and signedness of the
-          type will be necessary to re-interpret it unambiguously.  */
-       else if (prec < HOST_BITS_PER_WIDE_INT)
+       /* If HOST_WIDE_INT is big enough then represent the bound as
+          a constant value.  We need to choose a form based on
+          whether the type is signed or unsigned.  We cannot just
+          call add_AT_unsigned if the value itself is positive
+          (add_AT_unsigned might add the unsigned value encoded as
+          DW_FORM_data[1248]).  Some DWARF consumers will lookup the
+          bounds type and then sign extend any unsigned values found
+          for signed types.  This is needed only for
+          DW_AT_{lower,upper}_bound, since for most other attributes,
+          consumers will treat DW_FORM_data[1248] as unsigned values,
+          regardless of the underlying type.  */
+       else if (prec <= HOST_BITS_PER_WIDE_INT
+                || TREE_INT_CST_HIGH (bound) == 0)
          {
-           unsigned HOST_WIDE_INT mask
-             = ((unsigned HOST_WIDE_INT) 1 << prec) - 1;
-           add_AT_unsigned (subrange_die, bound_attr,
-                            TREE_INT_CST_LOW (bound) & mask);
+           if (TYPE_UNSIGNED (TREE_TYPE (bound)))
+             add_AT_unsigned (subrange_die, bound_attr,
+                              TREE_INT_CST_LOW (bound));
+           else
+             add_AT_int (subrange_die, bound_attr, TREE_INT_CST_LOW (bound));
          }
-       else if (prec == HOST_BITS_PER_WIDE_INT
-                || TREE_INT_CST_HIGH (bound) == 0)
-         add_AT_unsigned (subrange_die, bound_attr,
-                          TREE_INT_CST_LOW (bound));
        else
+         /* Otherwise represent the bound as an unsigned value with
+            the precision of its type.  The precision and signedness
+            of the type will be necessary to re-interpret it
+            unambiguously.  */
          add_AT_double (subrange_die, bound_attr, TREE_INT_CST_HIGH (bound),
                         TREE_INT_CST_LOW (bound));
       }