+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
+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
(*debug_hooks->handle_pch) (1);
+ prepare_target_option_nodes_for_pch ();
+
cpp_write_pch_deps (parse_in, pch_outfile);
gt_pch_save (pch_outfile);
#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);
{
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 ();
}
}
}
#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
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;
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);
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;
};
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
#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