driver: Improve option diagnostics [PR103465]

Message ID caec5e5c-07f5-05e6-3f69-ce2fa731c741@suse.cz
State Committed
Headers
Series driver: Improve option diagnostics [PR103465] |

Commit Message

Martin Liška Dec. 10, 2021, 10:04 a.m. UTC
  It happens that options are parsed and various diagnostics happen
in finish_options. That's a proper place as the function is also called
for optimize/target attributes (pragmas). However, it is possible that
target overwrites an option from command line and so the diagnostics
does not happen. That's fixed in the patch.

- options are parsed and finish_options is called:

   if (opts->x_flag_unwind_tables
       && !targetm_common.unwind_tables_default
       && opts->x_flag_reorder_blocks_and_partition
       && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
     {
       if (opts_set->x_flag_reorder_blocks_and_partition)
         inform (loc,
		"%<-freorder-blocks-and-partition%> does not support "
		"unwind info on this architecture");
       opts->x_flag_reorder_blocks_and_partition = 0;
       opts->x_flag_reorder_blocks = 1;
     }

It's not triggered because of opts->x_flag_unwind_tables is false by default, but
the option is overwritten in target:

...
   if (TARGET_64BIT_P (opts->x_ix86_isa_flags))
     {
       if (opts->x_optimize >= 1)
	SET_OPTION_IF_UNSET (opts, opts_set, flag_omit_frame_pointer,
			     !USE_IX86_FRAME_POINTER);
       if (opts->x_flag_asynchronous_unwind_tables
	  && TARGET_64BIT_MS_ABI)
	SET_OPTION_IF_UNSET (opts, opts_set, flag_unwind_tables, 1);
...

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Thanks,
Martin

	PR driver/103465

gcc/ChangeLog:

	* opts.c (finish_options): More part of diagnostics to ...
	(diagnose_options): ... here. Call the function from both
	finish_options and process_options.
	* opts.h (diagnose_options): Declare.
	* toplev.c (process_options): Call diagnose_options.
---
  gcc/opts.c   | 125 ++++++++++++++++++++++++++++-----------------------
  gcc/opts.h   |   2 +
  gcc/toplev.c |   2 +
  3 files changed, 72 insertions(+), 57 deletions(-)
  

Comments

Jeff Law Dec. 23, 2021, 11:22 p.m. UTC | #1
On 12/10/2021 3:04 AM, Martin Liška wrote:
> It happens that options are parsed and various diagnostics happen
> in finish_options. That's a proper place as the function is also called
> for optimize/target attributes (pragmas). However, it is possible that
> target overwrites an option from command line and so the diagnostics
> does not happen. That's fixed in the patch.
>
> - options are parsed and finish_options is called:
>
>   if (opts->x_flag_unwind_tables
>       && !targetm_common.unwind_tables_default
>       && opts->x_flag_reorder_blocks_and_partition
>       && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
>     {
>       if (opts_set->x_flag_reorder_blocks_and_partition)
>         inform (loc,
>         "%<-freorder-blocks-and-partition%> does not support "
>         "unwind info on this architecture");
>       opts->x_flag_reorder_blocks_and_partition = 0;
>       opts->x_flag_reorder_blocks = 1;
>     }
>
> It's not triggered because of opts->x_flag_unwind_tables is false by 
> default, but
> the option is overwritten in target:
>
> ...
>   if (TARGET_64BIT_P (opts->x_ix86_isa_flags))
>     {
>       if (opts->x_optimize >= 1)
>     SET_OPTION_IF_UNSET (opts, opts_set, flag_omit_frame_pointer,
>                  !USE_IX86_FRAME_POINTER);
>       if (opts->x_flag_asynchronous_unwind_tables
>       && TARGET_64BIT_MS_ABI)
>     SET_OPTION_IF_UNSET (opts, opts_set, flag_unwind_tables, 1);
> ...
>
> Patch can bootstrap on x86_64-linux-gnu and survives regression tests.
>
> Ready to be installed?
> Thanks,
> Martin
>
>     PR driver/103465
>
> gcc/ChangeLog:
>
>     * opts.c (finish_options): More part of diagnostics to ...
>     (diagnose_options): ... here. Call the function from both
>     finish_options and process_options.
>     * opts.h (diagnose_options): Declare.
>     * toplev.c (process_options): Call diagnose_options.
OK.

Jeff
  

Patch

diff --git a/gcc/opts.c b/gcc/opts.c
index 870cceca85a..525640b2968 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -1005,8 +1005,6 @@  void
  finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
  		location_t loc)
  {
-  enum unwind_info_type ui_except;
-
    if (opts->x_dump_base_name
        && ! opts->x_dump_base_name_prefixed)
      {
@@ -1107,61 +1105,6 @@  finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
        opts->x_flag_no_inline = 1;
      }
  
-  /* The optimization to partition hot and cold basic blocks into separate
-     sections of the .o and executable files does not work (currently)
-     with exception handling.  This is because there is no support for
-     generating unwind info.  If opts->x_flag_exceptions is turned on
-     we need to turn off the partitioning optimization.  */
-
-  ui_except = targetm_common.except_unwind_info (opts);
-
-  if (opts->x_flag_exceptions
-      && opts->x_flag_reorder_blocks_and_partition
-      && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
-    {
-      if (opts_set->x_flag_reorder_blocks_and_partition)
-        inform (loc,
-		"%<-freorder-blocks-and-partition%> does not work "
-		"with exceptions on this architecture");
-      opts->x_flag_reorder_blocks_and_partition = 0;
-      opts->x_flag_reorder_blocks = 1;
-    }
-
-  /* If user requested unwind info, then turn off the partitioning
-     optimization.  */
-
-  if (opts->x_flag_unwind_tables
-      && !targetm_common.unwind_tables_default
-      && opts->x_flag_reorder_blocks_and_partition
-      && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
-    {
-      if (opts_set->x_flag_reorder_blocks_and_partition)
-        inform (loc,
-		"%<-freorder-blocks-and-partition%> does not support "
-		"unwind info on this architecture");
-      opts->x_flag_reorder_blocks_and_partition = 0;
-      opts->x_flag_reorder_blocks = 1;
-    }
-
-  /* If the target requested unwind info, then turn off the partitioning
-     optimization with a different message.  Likewise, if the target does not
-     support named sections.  */
-
-  if (opts->x_flag_reorder_blocks_and_partition
-      && (!targetm_common.have_named_sections
-	  || (opts->x_flag_unwind_tables
-	      && targetm_common.unwind_tables_default
-	      && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
-    {
-      if (opts_set->x_flag_reorder_blocks_and_partition)
-        inform (loc,
-		"%<-freorder-blocks-and-partition%> does not work "
-		"on this architecture");
-      opts->x_flag_reorder_blocks_and_partition = 0;
-      opts->x_flag_reorder_blocks = 1;
-    }
-
-
    /* Pipelining of outer loops is only possible when general pipelining
       capabilities are requested.  */
    if (!opts->x_flag_sel_sched_pipelining)
@@ -1397,6 +1340,74 @@  finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
  	 && debug_info_level >= DINFO_LEVEL_NORMAL
  	 && dwarf_debuginfo_p ()
  	 && !(flag_selective_scheduling || flag_selective_scheduling2));
+
+  diagnose_options (opts, opts_set, loc);
+}
+
+/* The function diagnoses incompatible combinations for provided options
+   (OPTS and OPTS_SET) at a given LOCation.  The function is called both
+   when command line is parsed (after the target optimization hook) and
+   when an optimize/target attribute (or pragma) is used.  */
+
+void diagnose_options (gcc_options *opts, gcc_options *opts_set,
+		       location_t loc)
+{
+  /* The optimization to partition hot and cold basic blocks into separate
+     sections of the .o and executable files does not work (currently)
+     with exception handling.  This is because there is no support for
+     generating unwind info.  If opts->x_flag_exceptions is turned on
+     we need to turn off the partitioning optimization.  */
+
+  enum unwind_info_type ui_except
+    = targetm_common.except_unwind_info (opts);
+
+  if (opts->x_flag_exceptions
+      && opts->x_flag_reorder_blocks_and_partition
+      && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
+    {
+      if (opts_set->x_flag_reorder_blocks_and_partition)
+	inform (loc,
+		"%<-freorder-blocks-and-partition%> does not work "
+		"with exceptions on this architecture");
+      opts->x_flag_reorder_blocks_and_partition = 0;
+      opts->x_flag_reorder_blocks = 1;
+    }
+
+  /* If user requested unwind info, then turn off the partitioning
+     optimization.  */
+
+  if (opts->x_flag_unwind_tables
+      && !targetm_common.unwind_tables_default
+      && opts->x_flag_reorder_blocks_and_partition
+      && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))
+    {
+      if (opts_set->x_flag_reorder_blocks_and_partition)
+	inform (loc,
+		"%<-freorder-blocks-and-partition%> does not support "
+		"unwind info on this architecture");
+      opts->x_flag_reorder_blocks_and_partition = 0;
+      opts->x_flag_reorder_blocks = 1;
+    }
+
+  /* If the target requested unwind info, then turn off the partitioning
+     optimization with a different message.  Likewise, if the target does not
+     support named sections.  */
+
+  if (opts->x_flag_reorder_blocks_and_partition
+      && (!targetm_common.have_named_sections
+	  || (opts->x_flag_unwind_tables
+	      && targetm_common.unwind_tables_default
+	      && (ui_except == UI_SJLJ || ui_except >= UI_TARGET))))
+    {
+      if (opts_set->x_flag_reorder_blocks_and_partition)
+	inform (loc,
+		"%<-freorder-blocks-and-partition%> does not work "
+		"on this architecture");
+      opts->x_flag_reorder_blocks_and_partition = 0;
+      opts->x_flag_reorder_blocks = 1;
+    }
+
+
  }
  
  #define LEFT_COLUMN	27
diff --git a/gcc/opts.h b/gcc/opts.h
index 4c2b77ec0f0..8003d26bda6 100644
--- a/gcc/opts.h
+++ b/gcc/opts.h
@@ -428,6 +428,8 @@  extern bool target_handle_option (struct gcc_options *opts,
  extern void finish_options (struct gcc_options *opts,
  			    struct gcc_options *opts_set,
  			    location_t loc);
+extern void diagnose_options (gcc_options *opts, gcc_options *opts_set,
+			      location_t loc);
  extern void print_help (struct gcc_options *opts, unsigned int lang_mask, const
  			char *help_option_argument);
  extern void default_options_optimization (struct gcc_options *opts,
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 99276bde87d..6727c9f314f 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -1718,6 +1718,8 @@  process_options (bool no_backend)
    if (flag_large_source_files)
      line_table->default_range_bits = 0;
  
+  diagnose_options (&global_options, &global_options_set, UNKNOWN_LOCATION);
+
    /* Please don't change global_options after this point, those changes won't
       be reflected in optimization_{default,current}_node.  */
  }