re PR debug/64663 (ICE at -O1 and above with -g enabled on x86_64-linux-gnu)
authorJakub Jelinek <jakub@redhat.com>
Tue, 20 Jan 2015 18:29:58 +0000 (19:29 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 20 Jan 2015 18:29:58 +0000 (19:29 +0100)
PR debug/64663
* dwarf2out.c (decl_piece_node): Don't put bitsize into
mode if bitsize <= 0.
(decl_piece_bitsize, adjust_piece_list, add_var_loc_to_decl,
dw_sra_loc_expr): Use HOST_WIDE_INT instead of int for bit
sizes and positions.

* gcc.dg/pr64663.c: New test.

From-SVN: r219906

gcc/ChangeLog
gcc/dwarf2out.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr64663.c [new file with mode: 0644]

index 68c8f7499c87fda7ef322c78270410fc364da744..340f15d4aaecb083a44b3a857117bd2c5f3faa71 100644 (file)
@@ -1,3 +1,12 @@
+2015-01-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/64663
+       * dwarf2out.c (decl_piece_node): Don't put bitsize into
+       mode if bitsize <= 0.
+       (decl_piece_bitsize, adjust_piece_list, add_var_loc_to_decl,
+       dw_sra_loc_expr): Use HOST_WIDE_INT instead of int for bit
+       sizes and positions.
+
 2015-01-20  Chung-Lin Tang  <cltang@codesourcery.com>
 
        * config/nios2/nios2.c (nios2_asm_file_end): Implement
index 5190c86697fd21da546203ad40bc6058e001bcc6..1cafd52bf00acdaed47dc4164fda73bcddb23511 100644 (file)
@@ -5062,7 +5062,7 @@ equate_decl_number_to_die (tree decl, dw_die_ref decl_die)
 
 /* Return how many bits covers PIECE EXPR_LIST.  */
 
-static int
+static HOST_WIDE_INT
 decl_piece_bitsize (rtx piece)
 {
   int ret = (int) GET_MODE (piece);
@@ -5090,7 +5090,7 @@ decl_piece_varloc_ptr (rtx piece)
 static rtx_expr_list *
 decl_piece_node (rtx loc_note, HOST_WIDE_INT bitsize, rtx next)
 {
-  if (bitsize <= (int) MAX_MACHINE_MODE)
+  if (bitsize > 0 && bitsize <= (int) MAX_MACHINE_MODE)
     return alloc_EXPR_LIST (bitsize, loc_note, next);
   else
     return alloc_EXPR_LIST (0, gen_rtx_CONCAT (VOIDmode,
@@ -5129,7 +5129,7 @@ adjust_piece_list (rtx *dest, rtx *src, rtx *inner,
                   HOST_WIDE_INT bitpos, HOST_WIDE_INT piece_bitpos,
                   HOST_WIDE_INT bitsize, rtx loc_note)
 {
-  int diff;
+  HOST_WIDE_INT diff;
   bool copy = inner != NULL;
 
   if (copy)
@@ -5269,7 +5269,7 @@ add_var_loc_to_decl (tree decl, rtx loc_note, const char *label)
     {
       struct var_loc_node *last = temp->last, *unused = NULL;
       rtx *piece_loc = NULL, last_loc_note;
-      int piece_bitpos = 0;
+      HOST_WIDE_INT piece_bitpos = 0;
       if (last->next)
        {
          last = last->next;
@@ -5280,7 +5280,7 @@ add_var_loc_to_decl (tree decl, rtx loc_note, const char *label)
          piece_loc = &last->loc;
          do
            {
-             int cur_bitsize = decl_piece_bitsize (*piece_loc);
+             HOST_WIDE_INT cur_bitsize = decl_piece_bitsize (*piece_loc);
              if (piece_bitpos + cur_bitsize > bitpos)
                break;
              piece_bitpos += cur_bitsize;
@@ -13924,7 +13924,7 @@ static dw_loc_descr_ref
 dw_sra_loc_expr (tree decl, rtx loc)
 {
   rtx p;
-  unsigned int padsize = 0;
+  unsigned HOST_WIDE_INT padsize = 0;
   dw_loc_descr_ref descr, *descr_tail;
   unsigned HOST_WIDE_INT decl_size;
   rtx varloc;
@@ -13940,11 +13940,11 @@ dw_sra_loc_expr (tree decl, rtx loc)
 
   for (p = loc; p; p = XEXP (p, 1))
     {
-      unsigned int bitsize = decl_piece_bitsize (p);
+      unsigned HOST_WIDE_INT bitsize = decl_piece_bitsize (p);
       rtx loc_note = *decl_piece_varloc_ptr (p);
       dw_loc_descr_ref cur_descr;
       dw_loc_descr_ref *tail, last = NULL;
-      unsigned int opsize = 0;
+      unsigned HOST_WIDE_INT opsize = 0;
 
       if (loc_note == NULL_RTX
          || NOTE_VAR_LOCATION_LOC (loc_note) == NULL_RTX)
index 8cf69c1e93828bec972db21202c5a90931161b4d..598843154b655ef4cc5da66cf56cccb2946bb26a 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/64663
+       * gcc.dg/pr64663.c: New test.
+
 2015-01-20  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/64383
diff --git a/gcc/testsuite/gcc.dg/pr64663.c b/gcc/testsuite/gcc.dg/pr64663.c
new file mode 100644 (file)
index 0000000..9a0bf0d
--- /dev/null
@@ -0,0 +1,17 @@
+/* PR debug/64663 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -g -w" } */
+
+void
+foo (void)
+{
+  int a[9];
+  a[-8] = 0;
+}
+
+void
+bar (void)
+{
+  int a[9];
+  a[-9] = 0;
+}