This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: RFC automatic linkage of libquadmath with gfortran: PR driver/46516; libgfortran.spec, multilib search path
- From: Tobias Burnus <burnus at net-b dot de>
- To: Michael Matz <matz at suse dot de>
- Cc: gcc patches <gcc-patches at gcc dot gnu dot org>, "Joseph S. Myers" <joseph at codesourcery dot com>, Jakub Jelinek <jakub at redhat dot com>, gfortran <fortran at gcc dot gnu dot org>
- Date: Sat, 20 Nov 2010 20:33:50 +0100
- Subject: Re: RFC automatic linkage of libquadmath with gfortran: PR driver/46516; libgfortran.spec, multilib search path
- References: <4CE80CA9.9050205@net-b.de> <Pine.LNX.4.64.1011201912510.29956@wotan.suse.de>
Michael Matz wrote:
Oh right. I didn't consider that the lang-specs.h files are all included
together, and not just for the lang-specific driver :-/
There's currently one language specific hook coming right before linking
that you might be able to use: lang_specific_pre_link(). It might work if
you just do 'do_spec ("%:include(libgfortran.spec)")' in there (with the
current contents of libgfortran.spec, i.e. replacing '*lib:') in case
libgfortran.spec wasn't found in one of the -L paths in
lang_specific_driver() function (that is, you'll have to remember state
from lang_specific_driver to lang_specific_pre_link).
Awesome! The attached patch seems to work as it should! I will do some
bootstrapping tests, but I think should be fine.
Assuming that no issue pops up: Is this patch OK for committal?
Tobias
diff --git a/gcc/fortran/gfortranspec.c b/gcc/fortran/gfortranspec.c
index 24c9093..d8d9fc2 100644
--- a/gcc/fortran/gfortranspec.c
+++ b/gcc/fortran/gfortranspec.c
@@ -75,6 +75,9 @@ static void append_arg (const struct cl_decoded_option *);
static unsigned int g77_newargc;
static struct cl_decoded_option *g77_new_decoded_options;
+/* The path to the spec file. */
+char *spec_file = NULL;
+
/* Return full path name of spec file if it is in DIR, or NULL if
not. */
@@ -223,9 +226,6 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options,
/* Whether we should link a static libgfortran. */
int static_lib = 0;
- /* The path to the spec file. */
- char *spec_file = NULL;
-
/* Whether we need to link statically. */
int static_linking = 0;
@@ -447,9 +447,10 @@ For more information about these matters, see the file named COPYING\n\n"));
#endif
/* Read the specs file corresponding to libgfortran.
- If we didn't find the spec file on the -L path, then we hope it
- is somewhere in the standard install areas. */
- append_option (OPT_specs_, spec_file == NULL ? SPEC_FILE : spec_file, 1);
+ If we didn't find the spec file on the -L path, we load it
+ via lang_specific_pre_link. */
+ if (spec_file)
+ append_option (OPT_specs_, spec_file, 1);
if (verbose && g77_new_decoded_options != g77_x_decoded_options)
{
@@ -467,8 +468,13 @@ For more information about these matters, see the file named COPYING\n\n"));
/* Called before linking. Returns 0 on success and -1 on failure. */
int
-lang_specific_pre_link (void) /* Not used for F77. */
+lang_specific_pre_link (void)
{
+ if (spec_file)
+ free (spec_file);
+ else
+ do_spec ("%:include(libgfortran.spec)");
+
return 0;
}