public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [patch, ping] PR 38018 & 37565 - Option pragma and attribute handling
@ 2009-10-22 16:49 Steve Ellcey
  2009-10-28 14:10 ` Ian Lance Taylor
  0 siblings, 1 reply; 3+ messages in thread
From: Steve Ellcey @ 2009-10-22 16:49 UTC (permalink / raw)
  To: gcc-patches

This is a resubmission / ping for a patch to fix PR target/38018 and
PR middle-end/37565.  The original patch was submitted back in June here:

http://gcc.gnu.org/ml/gcc-patches/2009-06/msg00348.html

I have updated it so it would apply to the ToT but otherwise made
no changes to it.  I got no approval or rejection last time so
any comments would be welcome.

--------

This patch fixes PR target/38018, where GCC aborts on IA64 because we
don't (can't) override options after changing them via an optimize
attribute or pragma.  It also addresses PR middle-end/37565, though
other targets may need to define OVERRIDE_OPTIONS_AFTER_CHANGE to work
correctly.

I used HJ's idea of having a new macro but it is a little different in
that the new macro, OVERRIDE_OPTIONS_AFTER_CHANGE, is only called when
changing the opt level via an attribute or pragma (and when changing it
back after reaching the end of the affected code).  It is not called
directly at the beginning of the program, but if you want the code
executed then you can have OVERRIDE_OPTIONS call the same code.  This is
what I did for IA64 (ia64_override_options calls
ia64_override_options_after_change).

The tricky part here was realizing that I had to have
cl_target_option_restore call this macro in addition to having
parse_optimize_options call it so that we are still OK after restoring
the options after changing them via the attribute.

Tested on IA64 HP-UX and Linux with no regressions.

OK for checkin?

Steve Ellcey
sje@cup.hp.com

2009-10-22  Steve Ellcey  <sje@cup.hp.com>

	PR middle-end/37565
	PR target/38018
	* doc/tm.texi (OVERRIDE_OPTIONS): Update.
	(OVERRIDE_OPTIONS_AFTER_CHANGE): New.
	* optc-gen.awk (cl_target_option_restore): Include call to 
	OVERRIDE_OPTIONS_AFTER_CHANGE.
	* c-common.c (parse_optimize_options): Call
	OVERRIDE_OPTIONS_AFTER_CHANGE.
	* ia64-protos.h (ia64_override_options_after_change): New.
	* ia64.h (OVERRIDE_OPTIONS_AFTER_CHANGE): New.
	* ia64.c (ia64_override_options_after_change): New.
	(ia64_override_options) Add call to above.


Index: doc/tm.texi
===================================================================
--- doc/tm.texi	(revision 153444)
+++ doc/tm.texi	(working copy)
@@ -813,6 +813,20 @@ 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{OVERRIDE_OPTIONS_AFTER_CHANGE}
+@end defmac
+
+@defmac OVERRIDE_OPTIONS_AFTER_CHANGE
+This macro is like @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{OVERRIDE_OPTIONS_AFTER_CHANGE}.
 @end defmac
 
 @defmac C_COMMON_OVERRIDE_OPTIONS
Index: c-common.c
===================================================================
--- c-common.c	(revision 153444)
+++ c-common.c	(working copy)
@@ -7797,6 +7797,10 @@ parse_optimize_options (tree args, bool 
   /* Now parse the options.  */
   decode_options (opt_argc, opt_argv);
 
+#ifdef OVERRIDE_OPTIONS_AFTER_CHANGE
+  OVERRIDE_OPTIONS_AFTER_CHANGE;
+#endif
+
   /* Don't allow changing -fstrict-aliasing.  */
   flag_strict_aliasing = saved_flag_strict_aliasing;
 
Index: config/ia64/ia64-protos.h
===================================================================
--- config/ia64/ia64-protos.h	(revision 153444)
+++ config/ia64/ia64-protos.h	(working copy)
@@ -89,6 +89,7 @@ extern int ia64_eh_uses (int);
 extern void emit_safe_across_calls (void);
 extern void ia64_init_builtins (void);
 extern void ia64_override_options (void);
+extern void ia64_override_options_after_change (void);
 extern int ia64_dbx_register_number (int);
 
 extern rtx ia64_return_addr_rtx (HOST_WIDE_INT, rtx);
Index: config/ia64/ia64.h
===================================================================
--- config/ia64/ia64.h	(revision 153444)
+++ config/ia64/ia64.h	(working copy)
@@ -123,6 +123,13 @@ extern enum processor_type ia64_tune;
 
 #define OVERRIDE_OPTIONS ia64_override_options ()
 
+/* Since options can be changed by attributes or pragmas
+   OVERRIDE_OPTIONS_AFTER_CHANGE is called after the options are
+   changed in order to reset anything that needs to be fixed
+   for a particular target machine.  */
+
+#define OVERRIDE_OPTIONS_AFTER_CHANGE ia64_override_options_after_change ()
+
 /* Some machines may desire to change what optimizations are performed for
    various optimization levels.  This macro, if defined, is executed once just
    after the optimization level is determined and before the remainder of the
Index: config/ia64/ia64.c
===================================================================
--- config/ia64/ia64.c	(revision 153444)
+++ config/ia64/ia64.c	(working copy)
@@ -5496,6 +5496,25 @@ ia64_override_options (void)
   if (TARGET_AUTO_PIC)
     target_flags |= MASK_CONST_GP;
 
+  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 OVERRIDE_OPTIONS_AFTER_CHANGE.  */
+
+void
+ia64_override_options_after_change (void)
+{
   ia64_flag_schedule_insns2 = flag_schedule_insns_after_reload;
   flag_schedule_insns_after_reload = 0;
 
@@ -5517,18 +5536,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.  */

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2009-10-28 21:04 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-10-22 16:49 [patch, ping] PR 38018 & 37565 - Option pragma and attribute handling Steve Ellcey
2009-10-28 14:10 ` Ian Lance Taylor
2009-10-28 21:09   ` Steve Ellcey

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).