mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-12-21 18:15:06 +08:00
tm.texi.in (TARGET_PREPARE_PCH_SAVE): New hook.
gcc/ * doc/tm.texi.in (TARGET_PREPARE_PCH_SAVE): New hook. * doc/tm.texi: Regenerate. * target.def (prepare_pch_save): New hook. * c-family/c-pch.c (c_common_write_pch): Call it. * config/mips/mips.c (was_mips16_pch_p): Delete. (mips_set_mips16_mode): Don't refer to was_mips16_pch_p. (mips_prepare_pch_save): New function. (TARGET_PREPARE_PCH_SAVE): Define. From-SVN: r182640
This commit is contained in:
parent
dcf3062542
commit
e32ea2d1b2
@ -1,3 +1,14 @@
|
||||
2011-12-22 Richard Sandiford <rdsandiford@googlemail.com>
|
||||
|
||||
* doc/tm.texi.in (TARGET_PREPARE_PCH_SAVE): New hook.
|
||||
* doc/tm.texi: Regenerate.
|
||||
* target.def (prepare_pch_save): New hook.
|
||||
* c-family/c-pch.c (c_common_write_pch): Call it.
|
||||
* config/mips/mips.c (was_mips16_pch_p): Delete.
|
||||
(mips_set_mips16_mode): Don't refer to was_mips16_pch_p.
|
||||
(mips_prepare_pch_save): New function.
|
||||
(TARGET_PREPARE_PCH_SAVE): Define.
|
||||
|
||||
2011-12-22 Aldy Hernandez <aldyh@redhat.com>
|
||||
|
||||
PR middle-end/51212
|
||||
|
@ -180,6 +180,8 @@ c_common_write_pch (void)
|
||||
|
||||
timevar_push (TV_PCH_SAVE);
|
||||
|
||||
targetm.prepare_pch_save ();
|
||||
|
||||
(*debug_hooks->handle_pch) (1);
|
||||
|
||||
cpp_write_pch_deps (parse_in, pch_outfile);
|
||||
|
@ -15208,14 +15208,8 @@ mips_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
|
||||
}
|
||||
|
||||
/* The last argument passed to mips_set_mips16_mode, or negative if the
|
||||
function hasn't been called yet.
|
||||
|
||||
There are two copies of this information. One is saved and restored
|
||||
by the PCH process while the other is specific to this compiler
|
||||
invocation. The information calculated by mips_set_mips16_mode
|
||||
is invalid unless the two variables are the same. */
|
||||
function hasn't been called yet. */
|
||||
static int was_mips16_p = -1;
|
||||
static GTY(()) int was_mips16_pch_p = -1;
|
||||
|
||||
/* Set up the target-dependent global state so that it matches the
|
||||
current function's ISA mode. */
|
||||
@ -15223,8 +15217,7 @@ static GTY(()) int was_mips16_pch_p = -1;
|
||||
static void
|
||||
mips_set_mips16_mode (int mips16_p)
|
||||
{
|
||||
if (mips16_p == was_mips16_p
|
||||
&& mips16_p == was_mips16_pch_p)
|
||||
if (mips16_p == was_mips16_p)
|
||||
return;
|
||||
|
||||
/* Restore base settings of various flags. */
|
||||
@ -15321,7 +15314,6 @@ mips_set_mips16_mode (int mips16_p)
|
||||
restore_target_globals (&default_target_globals);
|
||||
|
||||
was_mips16_p = mips16_p;
|
||||
was_mips16_pch_p = mips16_p;
|
||||
}
|
||||
|
||||
/* Implement TARGET_SET_CURRENT_FUNCTION. Decide whether the current
|
||||
@ -16336,6 +16328,34 @@ mips_shift_truncation_mask (enum machine_mode mode)
|
||||
return GET_MODE_BITSIZE (mode) - 1;
|
||||
}
|
||||
|
||||
/* Implement TARGET_PREPARE_PCH_SAVE. */
|
||||
|
||||
static void
|
||||
mips_prepare_pch_save (void)
|
||||
{
|
||||
/* We are called in a context where the current MIPS16 vs. non-MIPS16
|
||||
setting should be irrelevant. The question then is: which setting
|
||||
makes most sense at load time?
|
||||
|
||||
The PCH is loaded before the first token is read. We should never
|
||||
have switched into MIPS16 mode by that point, and thus should not
|
||||
have populated mips16_globals. Nor can we load the entire contents
|
||||
of mips16_globals from the PCH file, because mips16_globals contains
|
||||
a combination of GGC and non-GGC data.
|
||||
|
||||
There is therefore no point in trying save the GGC part of
|
||||
mips16_globals to the PCH file, or to preserve MIPS16ness across
|
||||
the PCH save and load. The loading compiler would not have access
|
||||
to the non-GGC parts of mips16_globals (either from the PCH file,
|
||||
or from a copy that the loading compiler generated itself) and would
|
||||
have to call target_reinit anyway.
|
||||
|
||||
It therefore seems best to switch back to non-MIPS16 mode at
|
||||
save time, and to ensure that mips16_globals remains null after
|
||||
a PCH load. */
|
||||
mips_set_mips16_mode (false);
|
||||
mips16_globals = 0;
|
||||
}
|
||||
|
||||
/* Initialize the GCC target structure. */
|
||||
#undef TARGET_ASM_ALIGNED_HI_OP
|
||||
@ -16555,6 +16575,9 @@ mips_shift_truncation_mask (enum machine_mode mode)
|
||||
#undef TARGET_SHIFT_TRUNCATION_MASK
|
||||
#define TARGET_SHIFT_TRUNCATION_MASK mips_shift_truncation_mask
|
||||
|
||||
#undef TARGET_PREPARE_PCH_SAVE
|
||||
#define TARGET_PREPARE_PCH_SAVE mips_prepare_pch_save
|
||||
|
||||
struct gcc_target targetm = TARGET_INITIALIZER;
|
||||
|
||||
#include "gt-mips.h"
|
||||
|
@ -10079,6 +10079,13 @@ of @code{target_flags}. @var{pch_flags} specifies the value that
|
||||
value is the same as for @code{TARGET_PCH_VALID_P}.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Target Hook} void TARGET_PREPARE_PCH_SAVE (void)
|
||||
Called before writing out a PCH file. If the target has some
|
||||
garbage-collected data that needs to be in a particular state on PCH loads,
|
||||
it can use this hook to enforce that state. Very few targets need
|
||||
to do anything here.
|
||||
@end deftypefn
|
||||
|
||||
@node C++ ABI
|
||||
@section C++ ABI parameters
|
||||
@cindex parameters, c++ abi
|
||||
|
@ -9974,6 +9974,8 @@ of @code{target_flags}. @var{pch_flags} specifies the value that
|
||||
value is the same as for @code{TARGET_PCH_VALID_P}.
|
||||
@end deftypefn
|
||||
|
||||
@hook TARGET_PREPARE_PCH_SAVE
|
||||
|
||||
@node C++ ABI
|
||||
@section C++ ABI parameters
|
||||
@cindex parameters, c++ abi
|
||||
|
@ -1819,6 +1819,15 @@ DEFHOOK
|
||||
const char *, (const void *data, size_t sz),
|
||||
default_pch_valid_p)
|
||||
|
||||
DEFHOOK
|
||||
(prepare_pch_save,
|
||||
"Called before writing out a PCH file. If the target has some\n\
|
||||
garbage-collected data that needs to be in a particular state on PCH loads,\n\
|
||||
it can use this hook to enforce that state. Very few targets need\n\
|
||||
to do anything here.",
|
||||
void, (void),
|
||||
hook_void_void)
|
||||
|
||||
/* If nonnull, this function checks whether a PCH file with the
|
||||
given set of target flags can be used. It returns NULL if so,
|
||||
otherwise it returns an error message. */
|
||||
|
Loading…
Reference in New Issue
Block a user