Hi Iain

> On 4 Oct 2021, at 17:00, Iain Buclaw via Gcc-patches 
> <gcc-patches@gcc.gnu.org> wrote:
> 
> Hi,
> 
> This patch adds handling of `-static-libstc++' to the gdc driver, so
> that libstdc++ is appropriately linked if it is either needed or seen on
> the command-line.
> 
> This is required for bootstrapping the self hosted D front-end, so will
> also be backported to all supported releases.
> 
> Bootstrapped and regression tested, and committed to mainline.
> 
> Regards
> Iain.
> 
> ---
>       PR d/102574
> 
> gcc/d/ChangeLog:
> 
>       * d-spec.cc (lang_specific_driver): Link libstdc++ statically if
>       -static-libstdc++ was given on command-line.
> ---
> gcc/d/d-spec.cc | 43 ++++++++++++++++++++++++++++++++++---------
> 1 file changed, 34 insertions(+), 9 deletions(-)
> 
> diff --git a/gcc/d/d-spec.cc b/gcc/d/d-spec.cc
> index 16ff1539e9f..5adc662c6f2 100644
> --- a/gcc/d/d-spec.cc
> +++ b/gcc/d/d-spec.cc
> @@ -83,6 +83,9 @@ lang_specific_driver (cl_decoded_option 
> **in_decoded_options,
>   /* "-lstdc++" if it appears on the command line.  */
>   const cl_decoded_option *saw_libcxx = 0;
> 
> +  /* True if we saw `-static-libstdc++'.  */
> +  bool saw_static_libcxx = false;
> +
>   /* Whether we need the C++ STD library.  */
>   bool need_stdcxx = false;
> 
> @@ -248,6 +251,11 @@ lang_specific_driver (cl_decoded_option 
> **in_decoded_options,
>         shared_libgcc = false;
>         break;
> 
> +     case OPT_static_libstdc__:
> +       saw_static_libcxx = true;
> +       args[i] |= SKIPOPT;
> +       break;
> +
>       case OPT_static_libphobos:
>         if (phobos_library != PHOBOS_NOLINK)
>           phobos_library = PHOBOS_STATIC;
> @@ -452,16 +460,33 @@ lang_specific_driver (cl_decoded_option 
> **in_decoded_options,
> #endif
>     }
> 
> -  if (saw_libcxx)
> -    new_decoded_options[j++] = *saw_libcxx;
> -  else if (need_stdcxx)
> +  if (saw_libcxx || need_stdcxx)
>     {
> -      generate_option (OPT_l,
> -                    (saw_profile_flag
> -                     ? LIBSTDCXX_PROFILE
> -                     : LIBSTDCXX),
> -                    1, CL_DRIVER, &new_decoded_options[j++]);
> -      added_libraries++;
> +#ifdef HAVE_LD_STATIC_DYNAMIC
> +      if (saw_static_libcxx && !static_link)
> +     {
> +       generate_option (OPT_Wl_, LD_STATIC_OPTION, 1, CL_DRIVER,
> +                        &new_decoded_options[j++]);
> +     }

For targets that don’t support HAVE_LD_STATIC_DYNAMIC it would be useful
to push the option back out, so that they can use that to substitute a static 
version
of the library using %:replace-outfile(-lxxxxx libxxxxx+.a%s) [ see darwin.h 
for 
examples. ] .. I suppose we could figure out a follow-on patch and test that on
Darwin?

so
#else
 … code to push the -libstdc++ out

(yes, we do have this problem also with the g++ driver… I posted a patch eons
 ago .. but suspect it was never applied)

Iain

> +#endif
> +      if (saw_libcxx)
> +     new_decoded_options[j++] = *saw_libcxx;
> +      else if (need_stdcxx)
> +     {
> +       generate_option (OPT_l,
> +                        (saw_profile_flag
> +                         ? LIBSTDCXX_PROFILE
> +                         : LIBSTDCXX),
> +                        1, CL_DRIVER, &new_decoded_options[j++]);
> +       added_libraries++;
> +     }
> +#ifdef HAVE_LD_STATIC_DYNAMIC
> +      if (saw_static_libcxx && !static_link)
> +     {
> +       generate_option (OPT_Wl_, LD_DYNAMIC_OPTION, 1, CL_DRIVER,
> +                        &new_decoded_options[j++]);
> +     }
> +#endif
>     }
> 
>   if (shared_libgcc && !static_link)
> -- 
> 2.30.2
> 

Reply via email to