diff options
author | Martin Liska <mliska@suse.cz> | 2021-12-10 09:58:52 +0100 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2021-12-28 11:05:28 +0100 |
commit | a187edd2b437fc9571d57f771a624963fcce08f8 (patch) | |
tree | 83c77c68b2e65bf43d69b0c319bef974636d14fe /gcc/opts.c | |
parent | 786973ce33dfbbd1fe64e16654dbe5881c9b1ebf (diff) | |
download | gcc-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.c | 125 |
1 files changed, 68 insertions, 57 deletions
@@ -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 |