aboutsummaryrefslogtreecommitdiff
path: root/gcc/toplev.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-02-03 09:29:03 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-02-03 09:29:03 +0100
commit89843f5dfbb0b867f42c7743a8691ebe5bb35682 (patch)
tree4ee13b18ac1af831b910bd634daf1a77e1ed061b /gcc/toplev.c
parent996c0cb05f747d94ff4d6e9329e702414f46f700 (diff)
downloadgcc-89843f5dfbb0b867f42c7743a8691ebe5bb35682.zip
gcc-89843f5dfbb0b867f42c7743a8691ebe5bb35682.tar.gz
gcc-89843f5dfbb0b867f42c7743a8691ebe5bb35682.tar.bz2
re PR target/47564 (internal compiler error in memory_address_addr_space, at explow.c:504)
PR target/47564 * toplev.c (target_reinit): Save and restore *crtl and regno_reg_rtx around backend_init_target and lang_dependent_init_target calls. * cgraphunit.c (cgraph_debug_gimple_stmt): New function. (verify_cgraph_node): Don't call set_cfun here. Use cgraph_debug_gimple_stmt instead of debug_gimple_stmt. Set error_found for incorrectly represented calls to thunks. * gcc.target/i386/pr47564.c: New test. From-SVN: r169784
Diffstat (limited to 'gcc/toplev.c')
-rw-r--r--gcc/toplev.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 082c842..64af112 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -1,7 +1,7 @@
/* Top level of GCC compilers (cc1, cc1plus, etc.)
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
- 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
- Free Software Foundation, Inc.
+ 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+ 2011 Free Software Foundation, Inc.
This file is part of GCC.
@@ -1780,11 +1780,33 @@ lang_dependent_init (const char *name)
void
target_reinit (void)
{
+ struct rtl_data saved_x_rtl;
+ rtx *saved_regno_reg_rtx;
+
+ /* Save *crtl and regno_reg_rtx around the reinitialization
+ to allow target_reinit being called even after prepare_function_start. */
+ saved_regno_reg_rtx = regno_reg_rtx;
+ if (saved_regno_reg_rtx)
+ {
+ saved_x_rtl = *crtl;
+ memset (crtl, '\0', sizeof (*crtl));
+ regno_reg_rtx = NULL;
+ }
+
/* Reinitialize RTL backend. */
backend_init_target ();
/* Reinitialize lang-dependent parts. */
lang_dependent_init_target ();
+
+ /* And restore it at the end, as free_after_compilation from
+ expand_dummy_function_end clears it. */
+ if (saved_regno_reg_rtx)
+ {
+ *crtl = saved_x_rtl;
+ regno_reg_rtx = saved_regno_reg_rtx;
+ saved_regno_reg_rtx = NULL;
+ }
}
void