diff options
author | Cary Coutant <ccoutant@google.com> | 2013-10-04 16:25:23 +0000 |
---|---|---|
committer | Cary Coutant <ccoutant@gcc.gnu.org> | 2013-10-04 09:25:23 -0700 |
commit | 7c327f7b1021e3702a1565510563fdf277e1877b (patch) | |
tree | 00d883efeec6e1c3fe5f7040c899fec025669041 /gcc | |
parent | 3700bce33c7d1492d3970d45edb33581e2a18d63 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 28 |
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 |