From: Cary Coutant Date: Fri, 4 Oct 2013 16:25:23 +0000 (+0000) Subject: dwarf2out.c (dw_sra_loc_expr): Release addr_table entries when discarding a location... X-Git-Tag: releases/gcc-4.9.0~3708 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7c327f7b1021e3702a1565510563fdf277e1877b;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f061abd4a83f..065ebf19ebf1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2013-10-04 Cary Coutant + + * 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 * config/i386/i386.c (ix86_issue_rate): Pentium4, Nocona has issue diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 723317b8e6ad..3f4e314e1d43 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