aboutsummaryrefslogtreecommitdiff
path: root/gcc/lto-wrapper.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/lto-wrapper.c
parent9069e9484cec2ff981c87c75b226ad738847ca07 (diff)
downloadgcc-f1a681a174cdfb82e62c246d6f4add9a25fc2e43.zip
gcc-f1a681a174cdfb82e62c246d6f4add9a25fc2e43.tar.gz
gcc-f1a681a174cdfb82e62c246d6f4add9a25fc2e43.tar.bz2
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/lto-wrapper.c')
-rw-r--r--gcc/lto-wrapper.c103
1 files changed, 71 insertions, 32 deletions
diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c
index fe8f292..6e3f294 100644
--- a/gcc/lto-wrapper.c
+++ b/gcc/lto-wrapper.c
@@ -73,6 +73,7 @@ static char *offload_objects_file_name;
static char *makefile;
static unsigned int num_deb_objs;
static const char **early_debug_object_names;
+static bool xassembler_options_error = false;
const char tool_name[] = "lto-wrapper";
@@ -137,42 +138,14 @@ get_options_from_collect_gcc_options (const char *collect_gcc,
unsigned int *decoded_options_count)
{
struct obstack argv_obstack;
- char *argv_storage;
const char **argv;
- int j, k, argc;
+ int argc;
- argv_storage = xstrdup (collect_gcc_options);
obstack_init (&argv_obstack);
obstack_ptr_grow (&argv_obstack, collect_gcc);
- 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 = obstack_object_size (&argv_obstack) / sizeof (void *) - 1;
+ parse_options_from_collect_gcc_options (collect_gcc_options,
+ &argv_obstack, &argc);
argv = XOBFINISH (&argv_obstack, const char **);
decode_cmdline_options_to_array (argc, (const char **)argv, CL_DRIVER,
@@ -512,6 +485,45 @@ merge_and_complain (struct cl_decoded_option **decoded_options,
}
else
j++;
+
+ if (!xassembler_options_error)
+ for (i = j = 0; ; i++, j++)
+ {
+ for (; i < *decoded_options_count; i++)
+ if ((*decoded_options)[i].opt_index == OPT_Xassembler)
+ break;
+
+ for (; j < fdecoded_options_count; j++)
+ if (fdecoded_options[j].opt_index == OPT_Xassembler)
+ break;
+
+ if (i == *decoded_options_count && j == fdecoded_options_count)
+ break;
+ else if (i < *decoded_options_count && j == fdecoded_options_count)
+ {
+ warning (0, "Extra option to -Xassembler: %s,"
+ " dropping all -Xassembler and -Wa options.",
+ (*decoded_options)[i].arg);
+ xassembler_options_error = true;
+ break;
+ }
+ else if (i == *decoded_options_count && j < fdecoded_options_count)
+ {
+ warning (0, "Extra option to -Xassembler: %s,"
+ " dropping all -Xassembler and -Wa options.",
+ fdecoded_options[j].arg);
+ xassembler_options_error = true;
+ break;
+ }
+ else if (strcmp ((*decoded_options)[i].arg, fdecoded_options[j].arg))
+ {
+ warning (0, "Options to Xassembler do not match: %s, %s,"
+ " dropping all -Xassembler and -Wa options.",
+ (*decoded_options)[i].arg, fdecoded_options[j].arg);
+ xassembler_options_error = true;
+ break;
+ }
+ }
}
/* Auxiliary function that frees elements of PTR and PTR itself.
@@ -626,6 +638,13 @@ append_compiler_options (obstack *argv_obstack, struct cl_decoded_option *opts,
case OPT_Os:
break;
+ case OPT_Xassembler:
+ /* When we detected a mismatch in assembler options between
+ the input TU's fall back to previous behavior of ignoring them. */
+ if (xassembler_options_error)
+ continue;
+ break;
+
default:
if (!(cl_options[option->opt_index].flags & CL_TARGET))
continue;
@@ -1251,7 +1270,8 @@ run_gcc (unsigned argc, char *argv[])
const char **argv_ptr;
char *list_option_full = NULL;
const char *linker_output = NULL;
- const char *collect_gcc, *collect_gcc_options;
+ const char *collect_gcc;
+ char *collect_gcc_options;
int parallel = 0;
int jobserver = 0;
int auto_parallel = 0;
@@ -1281,6 +1301,25 @@ run_gcc (unsigned argc, char *argv[])
if (!collect_gcc_options)
fatal_error (input_location,
"environment variable %<COLLECT_GCC_OPTIONS%> must be set");
+
+ char *collect_as_options = getenv ("COLLECT_AS_OPTIONS");
+
+ /* Prepend -Xassembler to each option, and append the string
+ to collect_gcc_options. */
+ if (collect_as_options)
+ {
+ obstack temporary_obstack;
+ obstack_init (&temporary_obstack);
+
+ prepend_xassembler_to_collect_as_options (collect_as_options,
+ &temporary_obstack);
+ obstack_1grow (&temporary_obstack, '\0');
+
+ char *xassembler_opts_string
+ = XOBFINISH (&temporary_obstack, char *);
+ strcat (collect_gcc_options, xassembler_opts_string);
+ }
+
get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options,
&decoded_options,
&decoded_options_count);