Patchwork RFC automatic linkage of libquadmath with gfortran: PR driver/46516; libgfortran.spec, multilib search path

login
register
mail settings
Submitter Tobias Burnus
Date Nov. 20, 2010, 7:33 p.m.
Message ID <4CE8229E.9050600@net-b.de>
Download mbox | patch
Permalink /patch/72360/
State New
Headers show

Comments

Tobias Burnus - Nov. 20, 2010, 7:33 p.m.
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
Tobias Burnus - Nov. 21, 2010, 8:04 a.m.
Tobias Burnus wrote:
> 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?

Bootstrapped, regtested and committed after approval on #gfortran by 
Steve and Jerry.

Michael: Thanks again for the patch (the words could be trivially 
translated into a real patch).

Tobias

Patch

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;
 }