From 8f93a8266bec80d619c5725291f77abde22999f5 Mon Sep 17 00:00:00 2001 From: ccoutant Date: Fri, 4 Oct 2013 16:25:23 +0000 Subject: [PATCH] gcc/ * dwarf2out.c (dw_sra_loc_expr): Release addr_table entries when discarding a location list expression (or a piece of one). git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@203206 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ 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 + + * 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 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 -- 2.7.4