From: Aldy Hernandez Date: Thu, 18 Mar 2010 20:41:40 +0000 (+0000) Subject: tree.h: Declare make_decl_rtl_for_debug. X-Git-Tag: releases/gcc-4.5.0~315 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b1aa06558404f699aac25f84835dc04b16f437ea;p=thirdparty%2Fgcc.git tree.h: Declare make_decl_rtl_for_debug. * tree.h: Declare make_decl_rtl_for_debug. * varasm.c (make_decl_rtl_for_debug): New. * dwarf2out.c (rtl_for_decl_location): Call it. * cfgexpand.c (expand_debug_expr): Call it. From-SVN: r157551 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 527a9c3bb7a6..018d94c2c0fd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-03-18 Aldy Hernandez + + * tree.h: Declare make_decl_rtl_for_debug. + * varasm.c (make_decl_rtl_for_debug): New. + * dwarf2out.c (rtl_for_decl_location): Call it. + * cfgexpand.c (expand_debug_expr): Call it. + 2010-03-18 Jakub Jelinek PR bootstrap/43399 diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index ee1459934045..fcae897a3925 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -2339,8 +2339,7 @@ expand_debug_expr (tree exp) || mode == VOIDmode) return NULL; - op0 = DECL_RTL (exp); - SET_DECL_RTL (exp, NULL); + op0 = make_decl_rtl_for_debug (exp); if (!MEM_P (op0) || GET_CODE (XEXP (op0, 0)) != SYMBOL_REF || SYMBOL_REF_DECL (XEXP (op0, 0)) != exp) diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 8dfe65d1fbec..540d75fd9f93 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -15770,10 +15770,7 @@ rtl_for_decl_location (tree decl) && !DECL_HARD_REGISTER (decl) && DECL_MODE (decl) != VOIDmode) { - rtl = DECL_RTL (decl); - /* Reset DECL_RTL back, as various parts of the compiler expects - DECL_RTL set meaning it is actually going to be output. */ - SET_DECL_RTL (decl, NULL); + rtl = make_decl_rtl_for_debug (decl); if (!MEM_P (rtl) || GET_CODE (XEXP (rtl, 0)) != SYMBOL_REF || SYMBOL_REF_DECL (XEXP (rtl, 0)) != decl) diff --git a/gcc/testsuite/gfortran.dg/assign-debug.f90 b/gcc/testsuite/gfortran.dg/assign-debug.f90 new file mode 100644 index 000000000000..bd441211242a --- /dev/null +++ b/gcc/testsuite/gfortran.dg/assign-debug.f90 @@ -0,0 +1,8 @@ +! { dg-do compile } +! { dg-options "-fcompare-debug -O2" } + program test + integer i + common i + assign 2000 to i ! { dg-warning "Deleted feature: ASSIGN statement" } +2000 continue + end diff --git a/gcc/tree.h b/gcc/tree.h index 7e51ea624ae8..bc3cd29453e9 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -5131,6 +5131,7 @@ extern unsigned int update_alignment_for_field (record_layout_info, tree, unsigned int); /* varasm.c */ extern void make_decl_rtl (tree); +extern rtx make_decl_rtl_for_debug (tree); extern void make_decl_one_only (tree, tree); extern int supports_one_only (void); extern void resolve_unique_section (tree, int, int); diff --git a/gcc/varasm.c b/gcc/varasm.c index 6b8222f8e9a4..31007b8af864 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -1476,6 +1476,38 @@ make_decl_rtl (tree decl) if (flag_mudflap && TREE_CODE (decl) == VAR_DECL) mudflap_enqueue_decl (decl); } + +/* Like make_decl_rtl, but inhibit creation of new alias sets when + calling make_decl_rtl. Also, reset DECL_RTL before returning the + rtl. */ + +rtx +make_decl_rtl_for_debug (tree decl) +{ + unsigned int save_aliasing_flag; + rtx rtl; + + if (DECL_RTL_SET_P (decl)) + return DECL_RTL (decl); + + /* Kludge alert! Somewhere down the call chain, make_decl_rtl will + call new_alias_set. If running with -fcompare-debug, sometimes + we do not want to create alias sets that will throw the alias + numbers off in the comparison dumps. So... clearing + flag_strict_aliasing will keep new_alias_set() from creating a + new set. */ + save_aliasing_flag = flag_strict_aliasing; + flag_strict_aliasing = 0; + + rtl = DECL_RTL (decl); + /* Reset DECL_RTL back, as various parts of the compiler expects + DECL_RTL set meaning it is actually going to be output. */ + SET_DECL_RTL (decl, NULL); + + flag_strict_aliasing = save_aliasing_flag; + + return rtl; +} /* Output a string of literal assembler code for an `asm' keyword used between functions. */