Hi FX, On 4 Oct 2014, at 14:51, FX wrote:
> We have a -static-libgfortran option, but on targets where we support > quad-prec math through libquadmath, we didn’t have an equivalent > -static-libquadmath so far. This patch adds it, in what I think is a rather > straightforward manner. > > The only minor complication comes from the fact that previously, linking > libquadmath was conditionally through libgfortran.spec. So the spec was > modified: when we use -static-libquadmath, the driver itself includes the > -lquadmath (surrounded by the necessary static linking directives), so that > libgfortran.spec shouldn’t do it again. > > Bootstrapped and regtested on x86_64 linux. OK to commit? If one gives -static-libquadmath on darwin (or presumably any other platform that doesn't support Bstatic/dynamic) then this now breaks linking because the libgfortran.spec then suppresses the addition of "-lquadmath". Two possible solutions: 1. don't use -static-libquadmath on darwin ;) .. 2. make it work for darwin and other platforms without Bstatic/dynamic by using spec substitution (as we do with other -static-xxxx cases). To do this the library to be substituted needs to appear in "outfiles" (I wonder if one day someone will find time to write a driver substitution method for libraries, the need for them to appear in "outfiles" is odd and inconvenient). * Patch modifications to achieve this below * You might also want to double-check for trailing spaces on a couple of lines. * If you want the (relevant parts of the) test-suite to work with "-static-libquadmath" and spec substitution, then the driver .exp files need to append a -B path/to/libquadmath - if they don't do this already. --- I tested that the patch mods below DTRT on x86-64-apple-darwin12 (10.8.5) with otool -Lv showing that the referenced lib is no longer present with -static-libquadmath. NOTE: on darwin I think it is wise to force static runtimes *any* time that -static-libgcc is given. Otherwise, you can have a situation where part of the executable is refering to state in libgcc (static) but the runtimes are refering to state in libgcc_s. This can really mess up TLS emulation and/or unwinding (on earlier darwin versions). cheers Iain Part 1 - does the spec substitution. Part 2 - We note the -static-libquadmath for all platforms. - for Bstatic/dysnamic, we use this - for others we push "-lquadmath" so that it will be found by the %replace-outfile() spec substitution. the rest as per your patch. ---- diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h index 059da35..205afad 100644 --- a/gcc/config/darwin.h +++ b/gcc/config/darwin.h @@ -229,6 +229,7 @@ extern GTY(()) int darwin_ms_struct; %:replace-outfile(-lobjc libobjc-gnu.a%s); \ :%:replace-outfile(-lobjc -lobjc-gnu ) } }\ %{static|static-libgcc|static-libgfortran:%:replace-outfile(-lgfortran libgfortran.a%s)}\ + %{static|static-libgcc|static-libquadmath:%:replace-outfile(-lquadmath libquadmath.a%s)}\ %{static|static-libgcc|static-libstdc++|static-libgfortran:%:replace-outfile(-lgomp libgomp.a%s)}\ %{static|static-libgcc|static-libstdc++:%:replace-outfile(-lstdc++ libstdc++.a%s)}\ %{!Zdynamiclib: \ === diff --git a/gcc/fortran/gfortranspec.c b/gcc/fortran/gfortranspec.c index 9d27698..8b9db22 100644 --- a/gcc/fortran/gfortranspec.c +++ b/gcc/fortran/gfortranspec.c @@ -61,6 +61,10 @@ along with GCC; see the file COPYING3. If not see #define FORTRAN_LIBRARY "gfortran" #endif +#ifndef QUADMATH_LIBRARY +#define QUADMATH_LIBRARY "quadmath" +#endif + /* Name of the spec file. */ #define SPEC_FILE "libgfortran.spec" @@ -160,19 +164,28 @@ append_option (size_t opt_index, const char *arg, int value) } /* Append a libgfortran argument to the list being built. If - FORCE_STATIC, ensure the library is linked statically. */ + FORCE_STATIC, ensure the library is linked statically. If + FORCE_STATIC_LIBQUADMATH, also link the quadmath library statically. */ static void -add_arg_libgfortran (bool force_static ATTRIBUTE_UNUSED) +add_arg_libgfortran (bool force_static ATTRIBUTE_UNUSED, + bool force_static_libquadmath ATTRIBUTE_UNUSED) { #ifdef HAVE_LD_STATIC_DYNAMIC if (force_static) append_option (OPT_Wl_, LD_STATIC_OPTION, 1); #endif + append_option (OPT_l, FORTRAN_LIBRARY, 1); + #ifdef HAVE_LD_STATIC_DYNAMIC + if (force_static_libquadmath) + append_option (OPT_l, QUADMATH_LIBRARY, 1); if (force_static) append_option (OPT_Wl_, LD_DYNAMIC_OPTION, 1); +#else + if (force_static_libquadmath) + append_option (OPT_l, QUADMATH_LIBRARY, 1); #endif } @@ -198,8 +211,9 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options, /* By default, we throw on the math library if we have one. */ int need_math = (MATH_LIBRARY[0] != '\0'); - /* Whether we should link a static libgfortran. */ - int static_lib = 0; + /* Whether we should link a static libgfortran / libquadmath. */ + int static_libgfortran = 0; + int static_libquadmath = 0; /* Whether we need to link statically. */ int static_linking = 0; @@ -247,15 +261,19 @@ lang_specific_driver (struct cl_decoded_option **in_decoded_options, case OPT_E: /* These options disable linking entirely or linking of the standard libraries. */ - library = 0; + library = NULL; break; case OPT_static_libgfortran: #ifdef HAVE_LD_STATIC_DYNAMIC - static_lib = 1; + static_libgfortran = 1; #endif break; + case OPT_static_libquadmath: + static_libquadmath = 1; + break; + case OPT_static: #ifdef HAVE_LD_STATIC_DYNAMIC static_linking = 1; @@ -300,7 +318,7 @@ For more information about these matters, see the file named COPYING\n\n")); /* If there are no input files, no need for the library. */ if (n_infiles == 0) - library = 0; + library = NULL; /* Second pass through arglist, transforming arguments as appropriate. */ @@ -364,13 +382,15 @@ For more information about these matters, see the file named COPYING\n\n")); if (saw_library == 1) saw_library = 2; /* -l<library> -lm. */ else - add_arg_libgfortran (static_lib && !static_linking); + add_arg_libgfortran (static_libgfortran && !static_linking, + static_libquadmath && !static_linking); } else if (decoded_options[i].opt_index == OPT_l && strcmp (decoded_options[i].arg, FORTRAN_LIBRARY) == 0) { saw_library = 1; /* -l<library>. */ - add_arg_libgfortran (static_lib && !static_linking); + add_arg_libgfortran (static_libgfortran && !static_linking, + static_libquadmath && !static_linking); continue; } else @@ -393,7 +413,8 @@ For more information about these matters, see the file named COPYING\n\n")); switch (saw_library) { case 0: - add_arg_libgfortran (static_lib && !static_linking); + add_arg_libgfortran (static_libgfortran && !static_linking, + static_libquadmath && !static_linking); /* Fall through. */ case 1: