diff options
author | Jakub Jelinek <jakub@redhat.com> | 2011-02-03 09:29:03 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2011-02-03 09:29:03 +0100 |
commit | 89843f5dfbb0b867f42c7743a8691ebe5bb35682 (patch) | |
tree | 4ee13b18ac1af831b910bd634daf1a77e1ed061b /gcc/toplev.c | |
parent | 996c0cb05f747d94ff4d6e9329e702414f46f700 (diff) | |
download | gcc-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.c | 26 |
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 |