diff mbox

Fix up dwarf2out ICE (PR debug/64663)

Message ID 20150120113019.GC1746@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Jan. 20, 2015, 11:30 a.m. UTC
Hi!

This patch fixes ICE caused by trying to put negative bitposition
into an EXPR_LIST node; as mode is 8-bit, if the negative value
is e.g. -256 (bitpos % 256 == 0), we'd ICE on the assertion that
if mode is 0, then the expression must be CONCAT of the actual
bit position (or size) and rtl expression.

Only the second hunk is strictly needed, the rest is to avoid
silent wrapping.  For 4.9/4.8 perhaps just the second hunk would be enough.

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

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.

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


	Jakub

Comments

Richard Henderson Jan. 20, 2015, 5:55 p.m. UTC | #1
On 01/20/2015 03:30 AM, Jakub Jelinek wrote:
> 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.
> 
> 	* gcc.dg/pr64663.c: New test.

Ok.


r~
diff mbox

Patch

--- gcc/dwarf2out.c.jj	2015-01-19 09:31:22.000000000 +0100
+++ gcc/dwarf2out.c	2015-01-19 12:57:48.104400169 +0100
@@ -5062,7 +5062,7 @@  equate_decl_number_to_die (tree decl, dw
 
 /* 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,
 		   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_
     {
       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_
 	  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)
--- gcc/testsuite/gcc.dg/pr64663.c.jj	2015-01-19 12:59:13.032958657 +0100
+++ gcc/testsuite/gcc.dg/pr64663.c	2015-01-19 12:59:18.020873996 +0100
@@ -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;
+}