diff options
author | sje <sje@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-10-29 16:44:02 +0000 |
---|---|---|
committer | sje <sje@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-10-29 16:44:02 +0000 |
commit | 4bec06b342e6165f527b4d8b6e5c8645d3e12888 (patch) | |
tree | 4c4f74fb7f7c6c8fe0a62100be5c7ce3bf5175c4 | |
parent | 42a868cd5053099a2780f28969be964fabf9e8bc (diff) | |
download | gcc-4bec06b342e6165f527b4d8b6e5c8645d3e12888.tar.gz |
2009-10-29 Steve Ellcey <sje@cup.hp.com>
PR middle-end/37565
PR target/38018
* doc/tm.texi (OVERRIDE_OPTIONS): Update.
(TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): New.
* optc-gen.awk (cl_target_option_restore): Include call to
targetm.override_options_after_change.
* target-def.h (TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): New.
* target.h (override_options_after_change): New.
* c-common.c (parse_optimize_options): Call
targetm.override_options_after_change.
* config/ia64/ia64.c (TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): New.
(ia64_override_options_after_change): New.
(ia64_override_options) Add call to above.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@153714 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/c-common.c | 2 | ||||
-rw-r--r-- | gcc/config/ia64/ia64.c | 35 | ||||
-rw-r--r-- | gcc/doc/tm.texi | 14 | ||||
-rw-r--r-- | gcc/optc-gen.awk | 1 | ||||
-rw-r--r-- | gcc/target-def.h | 3 | ||||
-rw-r--r-- | gcc/target.h | 5 |
7 files changed, 64 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e6c56b160fd..8a2b539358b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2009-10-29 Steve Ellcey <sje@cup.hp.com> + + PR middle-end/37565 + PR target/38018 + * doc/tm.texi (OVERRIDE_OPTIONS): Update. + (TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): New. + * optc-gen.awk (cl_target_option_restore): Include call to + targetm.override_options_after_change. + * target-def.h (TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): New. + * target.h (override_options_after_change): New. + * c-common.c (parse_optimize_options): Call + targetm.override_options_after_change. + * config/ia64/ia64.c (TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE): New. + (ia64_override_options_after_change): New. + (ia64_override_options) Add call to above. + 2009-10-29 Michael Matz <matz@suse.de> * tree-ssa-math-opts.c (execute_convert_to_rsqrt): Remove. diff --git a/gcc/c-common.c b/gcc/c-common.c index 1f30d06f4c7..8b85f66a2ad 100644 --- a/gcc/c-common.c +++ b/gcc/c-common.c @@ -7825,6 +7825,8 @@ parse_optimize_options (tree args, bool attr_p) /* Now parse the options. */ decode_options (opt_argc, opt_argv); + targetm.override_options_after_change(); + /* Don't allow changing -fstrict-aliasing. */ flag_strict_aliasing = saved_flag_strict_aliasing; diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index 23fc7540ec0..8460475bddb 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -303,6 +303,7 @@ static enum machine_mode ia64_promote_function_mode (const_tree, const_tree, int); static void ia64_trampoline_init (rtx, tree, rtx); +static void ia64_override_options_after_change (void); /* Table of valid machine attributes. */ static const struct attribute_spec ia64_attribute_table[] = @@ -536,6 +537,9 @@ static const struct attribute_spec ia64_attribute_table[] = #undef TARGET_TRAMPOLINE_INIT #define TARGET_TRAMPOLINE_INIT ia64_trampoline_init +#undef TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE +#define TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE ia64_override_options_after_change + struct gcc_target targetm = TARGET_INITIALIZER; typedef enum @@ -5504,6 +5508,25 @@ ia64_override_options (void) flag_ira_loop_pressure = 1; + ia64_section_threshold = g_switch_set ? g_switch_value : IA64_DEFAULT_GVALUE; + + init_machine_status = ia64_init_machine_status; + + if (align_functions <= 0) + align_functions = 64; + if (align_loops <= 0) + align_loops = 32; + if (TARGET_ABI_OPEN_VMS) + flag_no_common = 1; + + ia64_override_options_after_change(); +} + +/* Implement targetm.override_options_after_change. */ + +static void +ia64_override_options_after_change (void) +{ ia64_flag_schedule_insns2 = flag_schedule_insns_after_reload; flag_schedule_insns_after_reload = 0; @@ -5525,18 +5548,6 @@ ia64_override_options (void) a transformation. */ flag_auto_inc_dec = 0; } - - ia64_section_threshold = g_switch_set ? g_switch_value : IA64_DEFAULT_GVALUE; - - init_machine_status = ia64_init_machine_status; - - if (align_functions <= 0) - align_functions = 64; - if (align_loops <= 0) - align_loops = 32; - - if (TARGET_ABI_OPEN_VMS) - flag_no_common = 1; } /* Initialize the record of emitted frame related registers. */ diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 0f33d3d1a8d..984bbd70c1e 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -814,8 +814,22 @@ parsed. Don't use this macro to turn on various extra optimizations for @option{-O}. That is what @code{OPTIMIZATION_OPTIONS} is for. + +If you need to do something whenever the optimization level is +changed via the optimize attribute or pragma, see +@code{TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE} @end defmac +@deftypefn {Target Hook} void TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE (void) +This target function is similar to the macro @code{OVERRIDE_OPTIONS} +but is called when the optimize level is changed via an attribute or +pragma or when it is reset at the end of the code affected by the +attribute or pragma. It is not called at the beginning of compilation +when @code{OVERRIDE_OPTIONS} is called so if you want to perform these +actions then, you should have @code{OVERRIDE_OPTIONS} call +@code{TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE}. +@end deftypefn + @defmac C_COMMON_OVERRIDE_OPTIONS This is similar to @code{OVERRIDE_OPTIONS} but is only used in the C language frontends (C, Objective-C, C++, Objective-C++) and so can be diff --git a/gcc/optc-gen.awk b/gcc/optc-gen.awk index 2117150f4d1..992e4d316ac 100644 --- a/gcc/optc-gen.awk +++ b/gcc/optc-gen.awk @@ -327,6 +327,7 @@ for (i = 0; i < n_opt_char; i++) { print " " var_opt_char[i] " = ptr->" var_opt_char[i] ";"; } +print " targetm.override_options_after_change ();"; print "}"; print ""; diff --git a/gcc/target-def.h b/gcc/target-def.h index c5a73216780..e76e8621175 100644 --- a/gcc/target-def.h +++ b/gcc/target-def.h @@ -410,6 +410,8 @@ #define TARGET_DEFAULT_TARGET_FLAGS 0 +#define TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE hook_void_void + #define TARGET_HANDLE_OPTION hook_bool_size_t_constcharptr_int_true #define TARGET_HELP NULL @@ -905,6 +907,7 @@ TARGET_SCHED, \ TARGET_VECTORIZE, \ TARGET_DEFAULT_TARGET_FLAGS, \ + TARGET_OVERRIDE_OPTIONS_AFTER_CHANGE, \ TARGET_HANDLE_OPTION, \ TARGET_HELP, \ TARGET_EH_RETURN_FILTER_MODE, \ diff --git a/gcc/target.h b/gcc/target.h index 31a54f321df..6d62d5207e5 100644 --- a/gcc/target.h +++ b/gcc/target.h @@ -500,6 +500,11 @@ struct gcc_target /* The initial value of target_flags. */ int default_target_flags; + /* Allow target specific overriding of option settings after options have + been changed by an attribute or pragma or when it is reset at the + end of the code affected by an attribute or pragma. */ + void (* override_options_after_change) (void); + /* Handle target switch CODE (an OPT_* value). ARG is the argument passed to the switch; it is NULL if no argument was. VALUE is the value of ARG if CODE specifies a UInteger option, otherwise it is |