aboutsummaryrefslogtreecommitdiff
path: root/gcc/opts.c
diff options
context:
space:
mode:
authorMartin Liska <marxin@gcc.gnu.org>2018-07-04 07:51:08 +0000
committerMartin Liska <marxin@gcc.gnu.org>2018-07-04 07:51:08 +0000
commitc518c1025b435e1c593a745036fc9b8ed04c5819 (patch)
tree75ee9f7156d26af39f332f3fab50c5012d340427 /gcc/opts.c
parentdd047c67e45c244c147a8244671154c77a9bda47 (diff)
downloadgcc-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.c108
1 files changed, 88 insertions, 20 deletions
diff --git a/gcc/opts.c b/gcc/opts.c
index ed102c0..e536607 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -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. */