re PR target/58115 (testcase gcc.target/i386/intrinsics_4.c failure)

PR target/58115
	* tree-core.h (struct target_globals): New forward declaration.
	(struct tree_target_option): Add globals field.
	* tree.h (TREE_TARGET_GLOBALS): Define.
	(prepare_target_option_nodes_for_pch): New prototype.
	* target-globals.h (struct target_globals): Define even if
	!SWITCHABLE_TARGET.
	* tree.c (prepare_target_option_node_for_pch,
	prepare_target_option_nodes_for_pch): New functions.
	* config/i386/i386.h (SWITCHABLE_TARGET): Define.
	* config/i386/i386.c: Include target-globals.h.
	(ix86_set_current_function): Instead of doing target_reinit
	unconditionally, use save_target_globals_default_opts and
	restore_target_globals.
c-family/
	* c-pch.c (c_common_write_pch): Call
	prepare_target_option_nodes_for_pch.

From-SVN: r206478
This commit is contained in:
Jakub Jelinek 2014-01-09 19:25:19 +01:00 committed by Jakub Jelinek
parent b5f58ba331
commit e83b8e2e24
9 changed files with 80 additions and 6 deletions

View File

@ -1,3 +1,20 @@
2014-01-09 Jakub Jelinek <jakub@redhat.com>
PR target/58115
* tree-core.h (struct target_globals): New forward declaration.
(struct tree_target_option): Add globals field.
* tree.h (TREE_TARGET_GLOBALS): Define.
(prepare_target_option_nodes_for_pch): New prototype.
* target-globals.h (struct target_globals): Define even if
!SWITCHABLE_TARGET.
* tree.c (prepare_target_option_node_for_pch,
prepare_target_option_nodes_for_pch): New functions.
* config/i386/i386.h (SWITCHABLE_TARGET): Define.
* config/i386/i386.c: Include target-globals.h.
(ix86_set_current_function): Instead of doing target_reinit
unconditionally, use save_target_globals_default_opts and
restore_target_globals.
2014-01-09 Richard Biener <rguenther@suse.de>
PR tree-optimization/59715

View File

@ -1,3 +1,9 @@
2014-01-09 Jakub Jelinek <jakub@redhat.com>
PR target/58115
* c-pch.c (c_common_write_pch): Call
prepare_target_option_nodes_for_pch.
2014-01-02 Richard Sandiford <rdsandiford@googlemail.com>
Update copyright years

View File

@ -180,6 +180,8 @@ c_common_write_pch (void)
(*debug_hooks->handle_pch) (1);
prepare_target_option_nodes_for_pch ();
cpp_write_pch_deps (parse_in, pch_outfile);
gt_pch_save (pch_outfile);

View File

@ -80,6 +80,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-pass.h"
#include "context.h"
#include "pass_manager.h"
#include "target-globals.h"
static rtx legitimize_dllimport_symbol (rtx, bool);
static rtx legitimize_pe_coff_extern_decl (rtx, bool);
@ -4868,16 +4869,25 @@ ix86_set_current_function (tree fndecl)
{
cl_target_option_restore (&global_options,
TREE_TARGET_OPTION (new_tree));
target_reinit ();
if (TREE_TARGET_GLOBALS (new_tree))
restore_target_globals (TREE_TARGET_GLOBALS (new_tree));
else
TREE_TARGET_GLOBALS (new_tree)
= save_target_globals_default_opts ();
}
else if (old_tree)
{
struct cl_target_option *def
= TREE_TARGET_OPTION (target_option_current_node);
cl_target_option_restore (&global_options, def);
target_reinit ();
new_tree = target_option_current_node;
cl_target_option_restore (&global_options,
TREE_TARGET_OPTION (new_tree));
if (TREE_TARGET_GLOBALS (new_tree))
restore_target_globals (TREE_TARGET_GLOBALS (new_tree));
else if (new_tree == target_option_default_node)
restore_target_globals (&default_target_globals);
else
TREE_TARGET_GLOBALS (new_tree)
= save_target_globals_default_opts ();
}
}
}

View File

@ -2510,6 +2510,9 @@ extern void debug_dispatch_window (int);
#define IX86_HLE_ACQUIRE (1 << 16)
#define IX86_HLE_RELEASE (1 << 17)
/* For switching between functions with different target attributes. */
#define SWITCHABLE_TARGET 1
/*
Local variables:
version-control: t

View File

@ -37,6 +37,7 @@ extern struct target_builtins *this_target_builtins;
extern struct target_gcse *this_target_gcse;
extern struct target_bb_reorder *this_target_bb_reorder;
extern struct target_lower_subreg *this_target_lower_subreg;
#endif
struct GTY(()) target_globals {
struct target_flag_state *GTY((skip)) flag_state;
@ -57,6 +58,7 @@ struct GTY(()) target_globals {
struct target_lower_subreg *GTY((skip)) lower_subreg;
};
#if SWITCHABLE_TARGET
extern struct target_globals default_target_globals;
extern struct target_globals *save_target_globals (void);

View File

@ -1557,11 +1557,18 @@ struct GTY(()) tree_optimization_option {
struct target_optabs *GTY ((skip)) base_optabs;
};
/* Forward declaration, defined in target-globals.h. */
struct GTY(()) target_globals;
/* Target options used by a function. */
struct GTY(()) tree_target_option {
struct tree_common common;
/* Target globals for the corresponding target option. */
struct target_globals *globals;
/* The optimization options used by the user. */
struct cl_target_option opts;
};

View File

@ -11527,6 +11527,28 @@ build_target_option_node (struct gcc_options *opts)
return t;
}
/* Reset TREE_TARGET_GLOBALS cache for TARGET_OPTION_NODE.
Called through htab_traverse. */
static int
prepare_target_option_node_for_pch (void **slot, void *)
{
tree node = (tree) *slot;
if (TREE_CODE (node) == TARGET_OPTION_NODE)
TREE_TARGET_GLOBALS (node) = NULL;
return 1;
}
/* Clear TREE_TARGET_GLOBALS of all TARGET_OPTION_NODE trees,
so that they aren't saved during PCH writing. */
void
prepare_target_option_nodes_for_pch (void)
{
htab_traverse (cl_option_hash_table, prepare_target_option_node_for_pch,
NULL);
}
/* Determine the "ultimate origin" of a block. The block may be an inlined
instance of an inlined instance of a block which is local to an inline
function, so we have to trace all of the way back through the origin chain

View File

@ -2695,9 +2695,14 @@ extern tree build_optimization_node (struct gcc_options *opts);
#define TREE_TARGET_OPTION(NODE) \
(&TARGET_OPTION_NODE_CHECK (NODE)->target_option.opts)
#define TREE_TARGET_GLOBALS(NODE) \
(TARGET_OPTION_NODE_CHECK (NODE)->target_option.globals)
/* Return a tree node that encapsulates the target options in OPTS. */
extern tree build_target_option_node (struct gcc_options *opts);
extern void prepare_target_option_nodes_for_pch (void);
#if defined ENABLE_TREE_CHECKING && (GCC_VERSION >= 2007)
inline tree