From: Ian Lance Taylor Date: Thu, 22 Feb 2007 14:55:09 +0000 (+0000) Subject: re PR debug/30898 (ICE with anonymous union and -g) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=0c5c188f0759e74255b4792d141d97926e6dc4a1;p=gcc.git re PR debug/30898 (ICE with anonymous union and -g) ./: PR debug/30898 * dwarf2out.c (concatn_mem_loc_descriptor): New static function. (mem_loc_descriptor): Call it. testsuite/: * g++.dg/debug/pr30898.C: New test. From-SVN: r122228 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d7f0f498a6a..15adfd335b4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-02-22 Ian Lance Taylor + + PR debug/30898 + * dwarf2out.c (concatn_mem_loc_descriptor): New static function. + (mem_loc_descriptor): Call it. + 2007-02-22 Zdenek Dvorak Ira Rosen diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 901fbff5279..2bb68dc9cd8 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -8811,6 +8811,32 @@ is_based_loc (rtx rtl) && GET_CODE (XEXP (rtl, 1)) == CONST_INT))); } +/* Return a descriptor that describes the concatenation of N locations + used to form the address of a memory location. */ + +static dw_loc_descr_ref +concatn_mem_loc_descriptor (rtx concatn, enum machine_mode mode) +{ + unsigned int i; + dw_loc_descr_ref cc_loc_result = NULL; + unsigned int n = XVECLEN (concatn, 0); + + for (i = 0; i < n; ++i) + { + dw_loc_descr_ref ref; + rtx x = XVECEXP (concatn, 0, i); + + ref = mem_loc_descriptor (x, mode); + if (ref == NULL) + return NULL; + + add_loc_descr (&cc_loc_result, ref); + add_loc_descr_op_piece (&cc_loc_result, GET_MODE_SIZE (GET_MODE (x))); + } + + return cc_loc_result; +} + /* The following routine converts the RTL for a variable or parameter (resident in memory) into an equivalent Dwarf representation of a mechanism for getting the address of that same variable onto the top of a @@ -9006,6 +9032,10 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode) mem_loc_result = int_loc_descriptor (INTVAL (rtl)); break; + case CONCATN: + mem_loc_result = concatn_mem_loc_descriptor (rtl, mode); + break; + default: gcc_unreachable (); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1e52e49d836..883e51e027f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-02-22 Ian Lance Taylor + + PR debug/30898 + * g++.dg/debug/pr30898.C: New test. + 2007-02-22 Ira Rosen * gcc.dg/vect/vect-106.c: New test. diff --git a/gcc/testsuite/g++.dg/debug/pr30898.C b/gcc/testsuite/g++.dg/debug/pr30898.C new file mode 100644 index 00000000000..4c06ea60845 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr30898.C @@ -0,0 +1,13 @@ +// { dg-do compile } + +double foo() +{ + union + { + int i; + double d; + }; + + i = 0; + return d; +}