summaryrefslogtreecommitdiff
path: root/gcc/opts-common.c
diff options
context:
space:
mode:
authorPrathamesh Kulkarni <prathamesh.kulkarni@linaro.org>2020-02-24 11:55:45 +0530
committerPrathamesh Kulkarni <prathamesh.kulkarni@linaro.org>2020-02-24 11:55:45 +0530
commitf1a681a174cdfb82e62c246d6f4add9a25fc2e43 (patch)
tree8c6d66f99473e10c0265b47eec8831eacc05392b /gcc/opts-common.c
parent9069e9484cec2ff981c87c75b226ad738847ca07 (diff)
PR47785: Add support for handling Xassembler/Wa options with LTO.
2020-02-24 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> Kugan Vivekandarajah <kugan.vivekanandarajah@linaro.org> PR driver/47785 * gcc.c (putenv_COLLECT_AS_OPTIONS): New function. (driver::main): Call putenv_COLLECT_AS_OPTIONS. * opts-common.c (parse_options_from_collect_gcc_options): New function. (prepend_xassembler_to_collect_as_options): Likewise. * opts.h (parse_options_from_collect_gcc_options): Declare prototype. (prepend_xassembler_to_collect_as_options): Likewise. * lto-opts.c (lto_write_options): Stream assembler options in COLLECT_AS_OPTIONS. * lto-wrapper.c (xassembler_options_error): New static variable. (get_options_from_collect_gcc_options): Move parsing options code to parse_options_from_collect_gcc_options and call it. (merge_and_complain): Validate -Xassembler options. (append_compiler_options): Handle OPT_Xassembler. (run_gcc): Append command line -Xassembler options to collect_gcc_options. * doc/invoke.texi: Add documentation about using Xassembler options with LTO. testsuite/ * gcc.target/arm/pr78353-1.c: New test. * gcc.target/arm/pr78353-2.c: Likewise.
Diffstat (limited to 'gcc/opts-common.c')
-rw-r--r--gcc/opts-common.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/gcc/opts-common.c b/gcc/opts-common.c
index 112de159cce..de9510abd64 100644
--- a/gcc/opts-common.c
+++ b/gcc/opts-common.c
@@ -1739,3 +1739,69 @@ control_warning_option (unsigned int opt_index, int kind, const char *arg,
}
}
}
+
+/* Parse options in COLLECT_GCC_OPTIONS and push them on ARGV_OBSTACK.
+ Store number of arguments into ARGC_P. */
+
+void
+parse_options_from_collect_gcc_options (const char *collect_gcc_options,
+ obstack *argv_obstack,
+ int *argc_p)
+{
+ char *argv_storage = xstrdup (collect_gcc_options);
+ int j, k;
+
+ for (j = 0, k = 0; argv_storage[j] != '\0'; ++j)
+ {
+ if (argv_storage[j] == '\'')
+ {
+ obstack_ptr_grow (argv_obstack, &argv_storage[k]);
+ ++j;
+ do
+ {
+ if (argv_storage[j] == '\0')
+ fatal_error (input_location,
+ "malformed %<COLLECT_GCC_OPTIONS%>");
+ else if (strncmp (&argv_storage[j], "'\\''", 4) == 0)
+ {
+ argv_storage[k++] = '\'';
+ j += 4;
+ }
+ else if (argv_storage[j] == '\'')
+ break;
+ else
+ argv_storage[k++] = argv_storage[j++];
+ }
+ while (1);
+ argv_storage[k++] = '\0';
+ }
+ }
+
+ obstack_ptr_grow (argv_obstack, NULL);
+ *argc_p = obstack_object_size (argv_obstack) / sizeof (void *) - 1;
+}
+
+/* Prepend -Xassembler for each option in COLLECT_AS_OPTIONS,
+ and push on O. */
+
+void prepend_xassembler_to_collect_as_options (const char *collect_as_options,
+ obstack *o)
+{
+ obstack opts_obstack;
+ int opts_count;
+
+ obstack_init (&opts_obstack);
+ parse_options_from_collect_gcc_options (collect_as_options,
+ &opts_obstack, &opts_count);
+ const char **assembler_opts = XOBFINISH (&opts_obstack, const char **);
+
+ for (int i = 0; i < opts_count; i++)
+ {
+ obstack_grow (o, " '-Xassembler' ",
+ strlen (" '-Xassembler' "));
+ const char *opt = assembler_opts[i];
+ obstack_1grow (o, '\'');
+ obstack_grow (o, opt, strlen (opt));
+ obstack_1grow (o, '\'');
+ }
+}