aboutsummaryrefslogtreecommitdiff
path: root/gcc/opts.c
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2021-12-10 09:58:52 +0100
committerMartin Liska <mliska@suse.cz>2021-12-28 11:05:28 +0100
commita187edd2b437fc9571d57f771a624963fcce08f8 (patch)
tree83c77c68b2e65bf43d69b0c319bef974636d14fe /gcc/opts.c
parent786973ce33dfbbd1fe64e16654dbe5881c9b1ebf (diff)
downloadgcc-a187edd2b437fc9571d57f771a624963fcce08f8.zip
gcc-a187edd2b437fc9571d57f771a624963fcce08f8.tar.gz
gcc-a187edd2b437fc9571d57f771a624963fcce08f8.tar.bz2
driver: Improve option diagnostics [PR103465]
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); ... 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.
Diffstat (limited to 'gcc/opts.c')
-rw-r--r--gcc/opts.c125
1 files changed, 68 insertions, 57 deletions
diff --git a/gcc/opts.c b/gcc/opts.c
index cdd6463..e4e47ff 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -1014,8 +1014,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)
{
@@ -1116,61 +1114,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)
@@ -1406,6 +1349,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