Hi!

This patch fixes 3 spots with UB in dwarf2out.c, furthermore the first spot
results in smaller/better debug info.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2016-11-30  Jakub Jelinek  <ja...@redhat.com>

        PR debug/78587
        * dwarf2out.c (loc_descr_plus_const): For negative offset use
        uint_loc_descriptor instead of int_loc_descriptor and perform negation
        in unsigned HOST_WIDE_INT type.
        (scompare_loc_descriptor): Shift UINTVAL left instead of INTVAL.

        * gcc.dg/debug/pr78587.c: New test.

--- gcc/dwarf2out.c.jj  2016-11-18 22:55:19.000000000 +0100
+++ gcc/dwarf2out.c     2016-11-30 15:16:39.402673343 +0100
@@ -1514,7 +1514,8 @@ loc_descr_plus_const (dw_loc_descr_ref *
 
   else
     {
-      loc->dw_loc_next = int_loc_descriptor (-offset);
+      loc->dw_loc_next
+       = uint_loc_descriptor (-(unsigned HOST_WIDE_INT) offset);
       add_loc_descr (&loc->dw_loc_next, new_loc_descr (DW_OP_minus, 0, 0));
     }
 }
@@ -13837,7 +13838,7 @@ scompare_loc_descriptor (enum dwarf_loca
       if (CONST_INT_P (XEXP (rtl, 1))
          && GET_MODE_BITSIZE (op_mode) < HOST_BITS_PER_WIDE_INT
          && (size_of_int_loc_descriptor (shift) + 1
-             + size_of_int_loc_descriptor (INTVAL (XEXP (rtl, 1)) << shift)
+             + size_of_int_loc_descriptor (UINTVAL (XEXP (rtl, 1)) << shift)
              >= size_of_int_loc_descriptor (GET_MODE_MASK (op_mode)) + 1
                 + size_of_int_loc_descriptor (INTVAL (XEXP (rtl, 1))
                                               & GET_MODE_MASK (op_mode))))
@@ -13852,7 +13853,7 @@ scompare_loc_descriptor (enum dwarf_loca
   add_loc_descr (&op0, int_loc_descriptor (shift));
   add_loc_descr (&op0, new_loc_descr (DW_OP_shl, 0, 0));
   if (CONST_INT_P (XEXP (rtl, 1)))
-    op1 = int_loc_descriptor (INTVAL (XEXP (rtl, 1)) << shift);
+    op1 = int_loc_descriptor (UINTVAL (XEXP (rtl, 1)) << shift);
   else
     {
       add_loc_descr (&op1, int_loc_descriptor (shift));
--- gcc/testsuite/gcc.dg/debug/pr78587.c.jj     2016-11-30 15:01:08.855153232 
+0100
+++ gcc/testsuite/gcc.dg/debug/pr78587.c        2016-11-30 15:20:22.000000000 
+0100
@@ -0,0 +1,23 @@
+/* PR debug/78587 */
+/* { dg-do compile } */
+/* { dg-additional-options "-w" } */
+
+extern void bar (void);
+
+void
+foo (long long x)
+{
+  x ^= 9223372036854775808ULL;
+  bar ();
+}
+
+struct S { int w[4]; } a[1], b;
+
+void
+baz ()
+{
+  int e = (int) baz;
+  if (e <= -80)
+    e = 0;
+  b = a[e];
+}

        Jakub

Reply via email to