diff options
author | Martin Liska <marxin@gcc.gnu.org> | 2018-07-04 07:51:08 +0000 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2018-07-04 07:51:08 +0000 |
commit | c518c1025b435e1c593a745036fc9b8ed04c5819 (patch) | |
tree | 75ee9f7156d26af39f332f3fab50c5012d340427 /gcc/opts.c | |
parent | dd047c67e45c244c147a8244671154c77a9bda47 (diff) | |
download | gcc-c518c1025b435e1c593a745036fc9b8ed04c5819.zip gcc-c518c1025b435e1c593a745036fc9b8ed04c5819.tar.gz gcc-c518c1025b435e1c593a745036fc9b8ed04c5819.tar.bz2 |
[multiple changes]
2018-07-04 Denys Vlasenko <dvlasenk@redhat.com>
Martin Liska <mliska@suse.cz>
PR middle-end/66240
PR target/45996
PR c/84100
* common.opt: Rename align options with 'str_' prefix.
* common/config/i386/i386-common.c (set_malign_value): New
function.
(ix86_handle_option): Use it to set -falign-* options/
* config/aarch64/aarch64-protos.h (struct tune_params): Change
type from int to string.
* config/aarch64/aarch64.c: Update default values from int
to string.
* config/alpha/alpha.c (alpha_override_options_after_change):
Likewise.
* config/arm/arm.c (arm_override_options_after_change_1): Likewise.
* config/i386/dragonfly.h (ASM_OUTPUT_MAX_SKIP_ALIGN): Print
max skip conditionally.
* config/i386/freebsd.h (SUBALIGN_LOG): New.
(ASM_OUTPUT_MAX_SKIP_ALIGN): Print
max skip conditionally.
* config/i386/gas.h (ASM_OUTPUT_MAX_SKIP_ALIGN): Print
max skip conditionally.
* config/i386/gnu-user.h (SUBALIGN_LOG): New.
(ASM_OUTPUT_MAX_SKIP_ALIGN): Print
max skip conditionally.
* config/i386/i386.c (struct ptt): Change type from int to
string.
(ix86_default_align): Set default values.
* config/i386/i386.h (ASM_OUTPUT_MAX_SKIP_PAD): Print
max skip conditionally.
* config/i386/iamcu.h (SUBALIGN_LOG): New.
(ASM_OUTPUT_MAX_SKIP_ALIGN):
* config/i386/lynx.h (ASM_OUTPUT_MAX_SKIP_ALIGN):
* config/i386/netbsd-elf.h (ASM_OUTPUT_MAX_SKIP_ALIGN): Print
max skip conditionally.
* config/i386/openbsdelf.h (SUBALIGN_LOG): New.
(ASM_OUTPUT_MAX_SKIP_ALIGN) Print max skip conditionally.:
* config/i386/x86-64.h (SUBALIGN_LOG): New.
(ASM_OUTPUT_MAX_SKIP_ALIGN): Print
max skip conditionally.
(ASM_OUTPUT_MAX_SKIP_PAD): Likewise.
* config/ia64/ia64.c (ia64_option_override): Set default values
for alignment options.
* config/m68k/m68k.c: Handle new str_align_* options.
* config/mips/mips.c (mips_set_compression_mode): Change
type of constants.
(mips_option_override): Set default values for options.
* config/powerpcspe/powerpcspe.c (rs6000_option_override_internal):
Likewise.
* config/rs6000/rs6000.c (rs6000_option_override_internal):
Likewise.
* config/rx/rx.c (rx_option_override): Likewise.
* config/rx/rx.h (JUMP_ALIGN): Use align_jumps_log.
(LABEL_ALIGN): Use align_labels_log.
(LOOP_ALIGN): Use align_loops_align.
* config/s390/s390.c (s390_asm_output_function_label): Use new
macros.
* config/sh/sh.c (sh_override_options_after_change):
Change type of constants.
* config/spu/spu.c (spu_sched_init): Likewise.
* config/sparc/sparc.c (sparc_option_override): Set default
values for options.
* config/visium/visium.c (visium_option_override): Likewise.
* config/visium/visium.h (ASM_OUTPUT_MAX_SKIP_ALIGN): Do not
emit p2align format with last argument if it's not needed.
* doc/invoke.texi: Document extended format of -falign-*.
* final.c: Use align_labels alignment.
* flags.h (struct target_flag_state): Change type to use
align_flags.
(struct align_flags_tuple): New.
(struct align_flags): Likewise.
(align_loops_log): Redefine macro to use new types.
(align_loops_max_skip): Redefine macro to use new types.
(align_jumps_log): Redefine macro to use new types.
(align_jumps_max_skip): Redefine macro to use new types.
(align_labels_log): Redefine macro to use new types.
(align_labels_max_skip): Redefine macro to use new types.
(align_functions_log): Redefine macro to use new types.
(align_loops): Redefine macro to use new types.
(align_jumps): Redefine macro to use new types.
(align_labels): Redefine macro to use new types.
(align_functions): Redefine macro to use new types.
(align_functions_max_skip): Redefine macro to use new types.
(align_loops_value): New macro.
(align_jumps_value): New macro.
(align_labels_value): New macro.
(align_functions_value): New macro.
* function.c (invoke_set_current_function_hook): Propagate
alignment values from flags to global variables default in
topleev.h.
* ipa-icf.c (sem_function::equals_wpa): Use
cl_optimization_option_eq instead of memcmp.
* lto-streamer.h (cl_optimization_stream_out): Support streaming
of string types.
(cl_optimization_stream_in): Likewise.
* optc-save-gen.awk: Support strings in cl_optimization.
* opth-gen.awk: Likewise.
* opts.c (finish_options): Remove error checking of invalid
value ranges.
(MAX_CODE_ALIGN): Remove.
(MAX_CODE_ALIGN_VALUE): Likewise.
(parse_and_check_align_values): New function.
(check_alignment_argument): Likewise.
(common_handle_option): Use check_alignment_argument.
* opts.h (parse_and_check_align_values): Declare.
* toplev.c (init_alignments): Remove.
(read_log_maxskip): New.
(parse_N_M): Likewise.
(parse_alignment_opts): Likewise.
(backend_init_target): Remove usage of init_alignments.
* toplev.h (parse_alignment_opts): Declare.
* tree-streamer-in.c (streamer_read_tree_bitfields): Add new
argument.
* tree-streamer-out.c (streamer_write_tree_bitfields): Likewise.
* tree.c (cl_option_hasher::equal): New.
* varasm.c: Use new global macros.
2018-07-04 Martin Liska <mliska@suse.cz>
PR middle-end/66240
PR target/45996
PR c/84100
* lto.c (compare_tree_sccs_1): Use cl_optimization_option_eq
instead of memcmp.
2018-07-04 Martin Liska <mliska@suse.cz>
PR middle-end/66240
PR target/45996
PR c/84100
* gcc.dg/pr84100.c (foo):
* gcc.target/i386/falign-functions-2.c: New test.
* gcc.target/i386/falign-functions.c: New test.
From-SVN: r262375
Diffstat (limited to 'gcc/opts.c')
-rw-r--r-- | gcc/opts.c | 108 |
1 files changed, 88 insertions, 20 deletions
@@ -1039,26 +1039,6 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set, if ((opts->x_flag_sanitize & SANITIZE_KERNEL_ADDRESS) && opts->x_flag_tm) sorry ("transactional memory is not supported with " "%<-fsanitize=kernel-address%>"); - - /* Comes from final.c -- no real reason to change it. */ -#define MAX_CODE_ALIGN 16 -#define MAX_CODE_ALIGN_VALUE (1 << MAX_CODE_ALIGN) - - if (opts->x_align_loops > MAX_CODE_ALIGN_VALUE) - error_at (loc, "-falign-loops=%d is not between 0 and %d", - opts->x_align_loops, MAX_CODE_ALIGN_VALUE); - - if (opts->x_align_jumps > MAX_CODE_ALIGN_VALUE) - error_at (loc, "-falign-jumps=%d is not between 0 and %d", - opts->x_align_jumps, MAX_CODE_ALIGN_VALUE); - - if (opts->x_align_functions > MAX_CODE_ALIGN_VALUE) - error_at (loc, "-falign-functions=%d is not between 0 and %d", - opts->x_align_functions, MAX_CODE_ALIGN_VALUE); - - if (opts->x_align_labels > MAX_CODE_ALIGN_VALUE) - error_at (loc, "-falign-labels=%d is not between 0 and %d", - opts->x_align_labels, MAX_CODE_ALIGN_VALUE); } #define LEFT_COLUMN 27 @@ -1779,6 +1759,78 @@ parse_no_sanitize_attribute (char *value) return flags; } +/* Parse -falign-NAME format for a FLAG value. Return individual + parsed integer values into RESULT_VALUES array. If REPORT_ERROR is + set, print error message at LOC location. */ + +bool +parse_and_check_align_values (const char *flag, + const char *name, + auto_vec<unsigned> &result_values, + bool report_error, + location_t loc) +{ + char *str = xstrdup (flag); + for (char *p = strtok (str, ":"); p; p = strtok (NULL, ":")) + { + char *end; + int v = strtol (p, &end, 10); + if (*end != '\0' || v < 0) + { + if (report_error) + error_at (loc, "invalid arguments for %<-falign-%s%> option: %qs", + name, flag); + + return false; + } + + result_values.safe_push ((unsigned)v); + } + + free (str); + + /* Check that we have a correct number of values. */ +#ifdef SUBALIGN_LOG + unsigned max_valid_values = 4; +#else + unsigned max_valid_values = 2; +#endif + + if (result_values.is_empty () + || result_values.length () > max_valid_values) + { + if (report_error) + error_at (loc, "invalid number of arguments for %<-falign-%s%> " + "option: %qs", name, flag); + return false; + } + + /* Comes from final.c -- no real reason to change it. */ +#define MAX_CODE_ALIGN 16 +#define MAX_CODE_ALIGN_VALUE (1 << MAX_CODE_ALIGN) + + for (unsigned i = 0; i < result_values.length (); i++) + if (result_values[i] > MAX_CODE_ALIGN_VALUE) + { + if (report_error) + error_at (loc, "%<-falign-%s%> is not between 0 and %d", + name, MAX_CODE_ALIGN_VALUE); + return false; + } + + return true; +} + +/* Check that alignment value FLAG for -falign-NAME is valid at a given + location LOC. */ + +static void +check_alignment_argument (location_t loc, const char *flag, const char *name) +{ + auto_vec<unsigned> align_result; + parse_and_check_align_values (flag, name, align_result, true, loc); +} + /* Handle target- and language-independent options. Return zero to generate an "unknown option" message. Only options that need extra handling need to be listed here; if you simply want @@ -2501,6 +2553,22 @@ common_handle_option (struct gcc_options *opts, opts->x_flag_ipa_icf_variables = value; break; + case OPT_falign_loops_: + check_alignment_argument (loc, arg, "loops"); + break; + + case OPT_falign_jumps_: + check_alignment_argument (loc, arg, "jumps"); + break; + + case OPT_falign_labels_: + check_alignment_argument (loc, arg, "labels"); + break; + + case OPT_falign_functions_: + check_alignment_argument (loc, arg, "functions"); + break; + default: /* If the flag was handled in a standard way, assume the lack of processing here is intentional. */ |