Using gccgo -S without -o did not work correctly because it generated BASE.o rather than BASE.s. This happened because the gccgo driver adds an explicit -o option, but did not take -S into account. A cleaner approach here would be some gcc driver interface to set combine_inputs, but this approach works fine for now. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian 2012-01-17 Ian Lance Taylor <i...@google.com> * gospec.c (lang_specific_driver): If we see -S without -o, add -o BASE.s rather than -o BASE.o.
Index: gcc/go/gospec.c =================================================================== --- gcc/go/gospec.c (revision 183119) +++ gcc/go/gospec.c (working copy) @@ -1,5 +1,5 @@ /* gospec.c -- Specific flags and argument handling of the gcc Go front end. - Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 2009, 2010, 2011, 2012 Free Software Foundation, Inc. This file is part of GCC. @@ -109,6 +109,9 @@ lang_specific_driver (struct cl_decoded_ /* Whether the -o option was used. */ bool saw_opt_o = false; + /* Whether the -S option was used. */ + bool saw_opt_S = false; + /* The first input file with an extension of .go. */ const char *first_go_file = NULL; @@ -163,7 +166,6 @@ lang_specific_driver (struct cl_decoded_ break; case OPT_c: - case OPT_S: case OPT_E: case OPT_M: case OPT_MM: @@ -173,6 +175,11 @@ lang_specific_driver (struct cl_decoded_ library = -1; break; + case OPT_S: + saw_opt_S = true; + library = -1; + break; + case OPT_o: saw_opt_o = true; break; @@ -280,10 +287,13 @@ lang_specific_driver (struct cl_decoded_ alen = baselen + 3; out = XNEWVEC (char, alen); memcpy (out, base, baselen); - /* The driver will convert .o to some other suffix if - appropriate. */ + /* The driver will convert .o to some other suffix (e.g., .obj) + if appropriate. */ out[baselen] = '.'; - out[baselen + 1] = 'o'; + if (saw_opt_S) + out[baselen + 1] = 's'; + else + out[baselen + 1] = 'o'; out[baselen + 2] = '\0'; generate_option (OPT_o, out, 1, CL_DRIVER, &new_decoded_options[j]);