From d78006d9504c41f96a476457754563c2aa100b7a Mon Sep 17 00:00:00 2001 From: Kyrylo Tkachov Date: Tue, 4 Aug 2015 10:10:28 +0000 Subject: [PATCH] [AArch64][7/14] Implement TARGET_SET_CURRENT_FUNCTION * config/aarch64/aarch64.h (SWITCHABLE_TARGET): Define. * config/aarch64/aarch64.c: Include target-globals.h (aarch64_previous_fndecl): New variable. (aarch64_set_current_function): New function. (TARGET_SET_CURRENT_FUNCTION): Define. From-SVN: r226559 --- gcc/ChangeLog | 8 ++++++ gcc/config/aarch64/aarch64.c | 56 ++++++++++++++++++++++++++++++++++++ gcc/config/aarch64/aarch64.h | 3 ++ 3 files changed, 67 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 985d7df8a80..cb019c9b7e9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-08-04 Kyrylo Tkachov + + * config/aarch64/aarch64.h (SWITCHABLE_TARGET): Define. + * config/aarch64/aarch64.c: Include target-globals.h + (aarch64_previous_fndecl): New variable. + (aarch64_set_current_function): New function. + (TARGET_SET_CURRENT_FUNCTION): Define. + 2015-08-04 Kyrylo Tkachov * config/aarch64/aarch64.opt (explicit_tune_core): New TargetVariable. diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index caf50ea70e7..d0d62e7b7f7 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -73,6 +73,7 @@ #include "tm-constrs.h" #include "sched-int.h" #include "cortex-a57-fma-steering.h" +#include "target-globals.h" /* This file should be included last. */ #include "target-def.h" @@ -7910,6 +7911,58 @@ aarch64_option_print (FILE *file, int indent, struct cl_target_option *ptr) aarch64_print_extension (file, isa_flags); } +static GTY(()) tree aarch64_previous_fndecl; + +/* Implement TARGET_SET_CURRENT_FUNCTION. Unpack the codegen decisions + like tuning and ISA features from the DECL_FUNCTION_SPECIFIC_TARGET + of the function, if such exists. This function may be called multiple + times on a single function so use aarch64_previous_fndecl to avoid + setting up identical state. */ + +static void +aarch64_set_current_function (tree fndecl) +{ + tree old_tree = (aarch64_previous_fndecl + ? DECL_FUNCTION_SPECIFIC_TARGET (aarch64_previous_fndecl) + : NULL_TREE); + + tree new_tree = (fndecl + ? DECL_FUNCTION_SPECIFIC_TARGET (fndecl) + : NULL_TREE); + + + if (fndecl && fndecl != aarch64_previous_fndecl) + { + aarch64_previous_fndecl = fndecl; + if (old_tree == new_tree) + ; + + else if (new_tree && new_tree != target_option_default_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 + TREE_TARGET_GLOBALS (new_tree) + = save_target_globals_default_opts (); + } + + else if (old_tree && old_tree != target_option_default_node) + { + 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 (); + } + } +} /* Return true if SYMBOL_REF X binds locally. */ @@ -12425,6 +12478,9 @@ aarch64_promoted_type (const_tree t) #undef TARGET_OPTION_PRINT #define TARGET_OPTION_PRINT aarch64_option_print +#undef TARGET_SET_CURRENT_FUNCTION +#define TARGET_SET_CURRENT_FUNCTION aarch64_set_current_function + #undef TARGET_PASS_BY_REFERENCE #define TARGET_PASS_BY_REFERENCE aarch64_pass_by_reference diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h index 9333bdc1d50..41f50fed7d5 100644 --- a/gcc/config/aarch64/aarch64.h +++ b/gcc/config/aarch64/aarch64.h @@ -919,6 +919,9 @@ do { \ #define HARD_REGNO_CALL_PART_CLOBBERED(REGNO, MODE) \ (FP_REGNUM_P (REGNO) && GET_MODE_SIZE (MODE) > 8) +#undef SWITCHABLE_TARGET +#define SWITCHABLE_TARGET 1 + /* Check TLS Descriptors mechanism is selected. */ #define TARGET_TLS_DESC (aarch64_tls_dialect == TLS_DESCRIPTORS) -- 2.30.2