aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2015-01-20 19:29:58 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2015-01-20 19:29:58 +0100
commit17cb42833c207240918de8279e171c834093565a (patch)
treef0024654ba4929b13177d77f6b91416960580e26
parent73cb399d519cb8ca4a25b0be074aca16096f6e51 (diff)
downloadgcc-17cb42833c207240918de8279e171c834093565a.zip
gcc-17cb42833c207240918de8279e171c834093565a.tar.gz
gcc-17cb42833c207240918de8279e171c834093565a.tar.bz2
re PR debug/64663 (ICE at -O1 and above with -g enabled on x86_64-linux-gnu)
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
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/dwarf2out.c16
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr64663.c17
4 files changed, 39 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 68c8f74..340f15d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 5190c86..1cafd52 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8cf69c1..5988431 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..9a0bf0d
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr64663.c
@@ -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;
+}