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(-)
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. */
}
--
2.34.1