aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@google.com>2013-10-04 16:25:23 +0000
committerCary Coutant <ccoutant@gcc.gnu.org>2013-10-04 09:25:23 -0700
commit7c327f7b1021e3702a1565510563fdf277e1877b (patch)
tree00d883efeec6e1c3fe5f7040c899fec025669041 /gcc
parent3700bce33c7d1492d3970d45edb33581e2a18d63 (diff)
downloadgcc-7c327f7b1021e3702a1565510563fdf277e1877b.zip
gcc-7c327f7b1021e3702a1565510563fdf277e1877b.tar.gz
gcc-7c327f7b1021e3702a1565510563fdf277e1877b.tar.bz2
dwarf2out.c (dw_sra_loc_expr): Release addr_table entries when discarding a location list expression (or a...
gcc/ * dwarf2out.c (dw_sra_loc_expr): Release addr_table entries when discarding a location list expression (or a piece of one). From-SVN: r203206
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/dwarf2out.c28
2 files changed, 26 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f061abd..065ebf1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2013-10-04 Cary Coutant <ccoutant@google.com>
+
+ * dwarf2out.c (dw_sra_loc_expr): Release addr_table entries when
+ discarding a location list expression (or a piece of one).
+
2013-10-03 Jan Hubicka <jh@suse.cz>
* config/i386/i386.c (ix86_issue_rate): Pentium4, Nocona has issue
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 723317b..3f4e314 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -13492,6 +13492,9 @@ dw_sra_loc_expr (tree decl, rtx loc)
if (last != NULL && opsize != bitsize)
{
padsize += bitsize;
+ /* Discard the current piece of the descriptor and release any
+ addr_table entries it uses. */
+ remove_loc_list_addr_table_entries (cur_descr);
continue;
}
@@ -13500,18 +13503,24 @@ dw_sra_loc_expr (tree decl, rtx loc)
if (padsize)
{
if (padsize > decl_size)
- return NULL;
+ {
+ remove_loc_list_addr_table_entries (cur_descr);
+ goto discard_descr;
+ }
decl_size -= padsize;
*descr_tail = new_loc_descr_op_bit_piece (padsize, 0);
if (*descr_tail == NULL)
- return NULL;
+ {
+ remove_loc_list_addr_table_entries (cur_descr);
+ goto discard_descr;
+ }
descr_tail = &(*descr_tail)->dw_loc_next;
padsize = 0;
}
*descr_tail = cur_descr;
descr_tail = tail;
if (bitsize > decl_size)
- return NULL;
+ goto discard_descr;
decl_size -= bitsize;
if (last == NULL)
{
@@ -13547,9 +13556,9 @@ dw_sra_loc_expr (tree decl, rtx loc)
{
if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN
&& (memsize > BITS_PER_WORD || bitsize > BITS_PER_WORD))
- return NULL;
+ goto discard_descr;
if (memsize < bitsize)
- return NULL;
+ goto discard_descr;
if (BITS_BIG_ENDIAN)
offset = memsize - bitsize;
}
@@ -13557,7 +13566,7 @@ dw_sra_loc_expr (tree decl, rtx loc)
*descr_tail = new_loc_descr_op_bit_piece (bitsize, offset);
if (*descr_tail == NULL)
- return NULL;
+ goto discard_descr;
descr_tail = &(*descr_tail)->dw_loc_next;
}
}
@@ -13568,9 +13577,14 @@ dw_sra_loc_expr (tree decl, rtx loc)
{
*descr_tail = new_loc_descr_op_bit_piece (decl_size, 0);
if (*descr_tail == NULL)
- return NULL;
+ goto discard_descr;
}
return descr;
+
+discard_descr:
+ /* Discard the descriptor and release any addr_table entries it uses. */
+ remove_loc_list_addr_table_entries (descr);
+ return NULL;
}
/* Return the dwarf representation of the location list LOC_LIST of