Hi, As mentioned in the PR, attached patch adds COLLECT_AS_OPTIONS for passing assembler options specified with -Wa, to the link-time driver.
The proposed solution only works for uniform -Wa options across all TUs. As mentioned by Richard Biener, supporting non-uniform -Wa flags would require either adjusting partitioning according to flags or emitting multiple object files from a single LTRANS CU. We could consider this as a follow up. Bootstrapped and regression tests on arm-linux-gcc. Is this OK for trunk? Thanks, Kugan gcc/ChangeLog: 2019-10-02 kugan.vivekanandarajah <kugan.vivekanandara...@linaro.org> PR lto/78353 * gcc.c (putenv_COLLECT_AS_OPTION): New to set COLLECT_AS_OPTION in env. (driver::main): Call putenv_COLLECT_AS_OPTION. * lto-wrapper.c (run_gcc): use COLLECT_AS_OPTION from env. gcc/testsuite/ChangeLog: 2019-10-02 kugan.vivekanandarajah <kugan.vivekanandara...@linaro.org> PR lto/78353 * gcc.target/arm/pr78353-1.c: New test. * gcc.target/arm/pr78353-2.c: New test.
From 6968d4343b2442736946a07df4eca969c916ccd3 Mon Sep 17 00:00:00 2001 From: Kugan <kugan.vivekanandarajah@linaro.org> Date: Sat, 28 Sep 2019 02:11:49 +1000 Subject: [PATCH] COLLECT_AS support --- gcc/gcc.c | 29 ++++++++++++++++++++++++ gcc/lto-wrapper.c | 6 ++++- gcc/testsuite/gcc.target/arm/pr78353-1.c | 9 ++++++++ gcc/testsuite/gcc.target/arm/pr78353-2.c | 9 ++++++++ 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.target/arm/pr78353-1.c create mode 100644 gcc/testsuite/gcc.target/arm/pr78353-2.c diff --git a/gcc/gcc.c b/gcc/gcc.c index 1216cdd505a..058f612d1f4 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -5239,6 +5239,34 @@ do_specs_vec (vec<char_p> vec) } } +/* Store switches specified for as with -Wa in COLLECT_AS_OPTIONS + and place that in the environment. */ +static void +putenv_COLLECT_AS_OPTION (vec<char_p> vec) +{ + unsigned ix; + char *opt; + int len = vec.length (); + + if (!len) + return; + + obstack_init (&collect_obstack); + obstack_grow (&collect_obstack, "COLLECT_AS_OPTION=", + sizeof ("COLLECT_AS_OPTION=") - 1); + obstack_grow (&collect_obstack, "-Wa,", strlen ("-Wa,")); + + FOR_EACH_VEC_ELT (vec, ix, opt) + { + obstack_grow (&collect_obstack, opt, strlen (opt)); + --len; + if (len) + obstack_grow (&collect_obstack, ",", strlen (",")); + } + + xputenv (XOBFINISH (&collect_obstack, char *)); +} + /* Process the sub-spec SPEC as a portion of a larger spec. This is like processing a whole spec except that we do not initialize at the beginning and we do not supply a @@ -7360,6 +7388,7 @@ driver::main (int argc, char **argv) global_initializations (); build_multilib_strings (); set_up_specs (); + putenv_COLLECT_AS_OPTION (assembler_options); putenv_COLLECT_GCC (argv[0]); maybe_putenv_COLLECT_LTO_WRAPPER (); maybe_putenv_OFFLOAD_TARGETS (); diff --git a/gcc/lto-wrapper.c b/gcc/lto-wrapper.c index 9a7bbd0c022..64dfabc202a 100644 --- a/gcc/lto-wrapper.c +++ b/gcc/lto-wrapper.c @@ -1250,7 +1250,7 @@ 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, *collect_gcc_options, *collect_as_option; int parallel = 0; int jobserver = 0; int auto_parallel = 0; @@ -1283,6 +1283,7 @@ run_gcc (unsigned argc, char *argv[]) get_options_from_collect_gcc_options (collect_gcc, collect_gcc_options, &decoded_options, &decoded_options_count); + collect_as_option = getenv ("COLLECT_AS_OPTION"); /* Allocate array for input object files with LTO IL, and for possible preceding arguments. */ @@ -1345,6 +1346,9 @@ run_gcc (unsigned argc, char *argv[]) obstack_init (&argv_obstack); obstack_ptr_grow (&argv_obstack, collect_gcc); obstack_ptr_grow (&argv_obstack, "-xlto"); + if (collect_as_option) + obstack_ptr_grow (&argv_obstack, collect_as_option); + obstack_ptr_grow (&argv_obstack, "-c"); append_compiler_options (&argv_obstack, fdecoded_options, diff --git a/gcc/testsuite/gcc.target/arm/pr78353-1.c b/gcc/testsuite/gcc.target/arm/pr78353-1.c new file mode 100644 index 00000000000..bba81ee50c3 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr78353-1.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-march=armv7-a -mthumb -O2 -flto -Wa,-mimplicit-it=always" } */ + +int main(int x) +{ + asm("teq %0, #0; addne %0, %0, #1" : "=r" (x)); + return x; +} + diff --git a/gcc/testsuite/gcc.target/arm/pr78353-2.c b/gcc/testsuite/gcc.target/arm/pr78353-2.c new file mode 100644 index 00000000000..776eb64b8c7 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr78353-2.c @@ -0,0 +1,9 @@ +/* { dg-do compile } */ +/* { dg-options "-march=armv7-a -mthumb -O2 -flto -Wa,-mimplicit-it=always,-mthumb" } */ + +int main(int x) +{ + asm("teq %0, #0; addne %0, %0, #1" : "=r" (x)); + return x; +} + -- 2.17.1