Hi Iain > On 19 Nov 2021, at 08:32, Iain Buclaw <ibuc...@gdcproject.org> wrote:
> This patch fixes a stage2 bootstrap failure in the D front-end on > darwin due to libgphobos being dynamically linked despite > -static-libphobos being on the command line. > > In the gdc driver, this takes the previous fix for the Darwin D > bootstrap, and extends it to the -static-libphobos option as well. > Rather than pushing the -static-libphobos option back onto the command > line, the setting of SKIPOPT is instead conditionally removed. The same > change has been repeated for -static-libstdc++ so there is now no need > to call generate_option to re-add it. > > In the gcc driver, -static-libphobos has been added as a common option, > validated, and a new outfile substition added to config/darwin.h to > correctly replace -lgphobos with libgphobos.a. > > Bootstrapped and regression tested on x86_64-linux-gnu and > x86_64-apple-darwin20. > > OK for mainline? This would also be fine for gcc-11 release branch too, > as well as earlier releases with D support. the Darwin parts are fine, thanks The SKIPOPT in d-spec, presumably means “skip removing this opt”? otherwise the #ifndef looks odd (because of the static-libgcc|static-libphobos, darwin.h would do the substitution for -static-libgcc as well, so it’s not a 100% test). Iain > > Regards, > Iain. > > --- > gcc/ChangeLog: > > * common.opt (static-libphobos): Add option. > * config/darwin.h (LINK_SPEC): Substitute -lgphobos with libgphobos.a > when linking statically. > * gcc.c (driver_handle_option): Set -static-libphobos as always valid. > > gcc/d/ChangeLog: > > * d-spec.cc (lang_specific_driver): Set SKIPOPT on -static-libstdc++ > and -static-libphobos only when target supports LD_STATIC_DYNAMIC. > Remove generate_option to re-add -static-libstdc++. > --- > gcc/common.opt | 4 ++++ > gcc/config/darwin.h | 1 + > gcc/d/d-spec.cc | 18 +++++++++++------- > gcc/gcc.c | 6 ++++-- > 4 files changed, 20 insertions(+), 9 deletions(-) > > diff --git a/gcc/common.opt b/gcc/common.opt > index db6010e4e20..73c12d933f3 100644 > --- a/gcc/common.opt > +++ b/gcc/common.opt > @@ -3527,6 +3527,10 @@ static-libgfortran > Driver > ; Documented for Fortran, but always accepted by driver. > > +static-libphobos > +Driver > +; Documented for D, but always accepted by driver. > + > static-libstdc++ > Driver > > diff --git a/gcc/config/darwin.h b/gcc/config/darwin.h > index 7ed01efa694..c4ddd623e8b 100644 > --- a/gcc/config/darwin.h > +++ b/gcc/config/darwin.h > @@ -443,6 +443,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-libphobos:%:replace-outfile(-lgphobos > libgphobos.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)}\ > %{force_cpusubtype_ALL:-arch %(darwin_arch)} \ > diff --git a/gcc/d/d-spec.cc b/gcc/d/d-spec.cc > index b12d28f1047..73ecac3bbf1 100644 > --- a/gcc/d/d-spec.cc > +++ b/gcc/d/d-spec.cc > @@ -253,13 +253,23 @@ lang_specific_driver (cl_decoded_option > **in_decoded_options, > > case OPT_static_libstdc__: > saw_static_libcxx = true; > +#ifndef HAVE_LD_STATIC_DYNAMIC > + /* Remove -static-libstdc++ from the command only if target supports > + LD_STATIC_DYNAMIC. When not supported, it is left in so that a > + back-end target can use outfile substitution. */ > args[i] |= SKIPOPT; > +#endif > break; > > case OPT_static_libphobos: > if (phobos_library != PHOBOS_NOLINK) > phobos_library = PHOBOS_STATIC; > +#ifndef HAVE_LD_STATIC_DYNAMIC > + /* Remove -static-libphobos from the command only if target supports > + LD_STATIC_DYNAMIC. When not supported, it is left in so that a > + back-end target can use outfile substitution. */ > args[i] |= SKIPOPT; > +#endif > break; > > case OPT_shared_libphobos: > @@ -460,7 +470,7 @@ lang_specific_driver (cl_decoded_option > **in_decoded_options, > #endif > } > > - if (saw_libcxx || need_stdcxx) > + if (saw_libcxx || saw_static_libcxx || need_stdcxx) > { > #ifdef HAVE_LD_STATIC_DYNAMIC > if (saw_static_libcxx && !static_link) > @@ -468,12 +478,6 @@ lang_specific_driver (cl_decoded_option > **in_decoded_options, > generate_option (OPT_Wl_, LD_STATIC_OPTION, 1, CL_DRIVER, > &new_decoded_options[j++]); > } > -#else > - /* Push the -static-libstdc++ option back onto the command so that > - a target without LD_STATIC_DYNAMIC can use outfile substitution. */ > - if (saw_static_libcxx && !static_link) > - generate_option (OPT_static_libstdc__, NULL, 1, CL_DRIVER, > - &new_decoded_options[j++]); > #endif > if (saw_libcxx) > new_decoded_options[j++] = *saw_libcxx; > diff --git a/gcc/gcc.c b/gcc/gcc.c > index 506c2acc282..fea6d049183 100644 > --- a/gcc/gcc.c > +++ b/gcc/gcc.c > @@ -4576,10 +4576,12 @@ driver_handle_option (struct gcc_options *opts, > case OPT_static_libgcc: > case OPT_shared_libgcc: > case OPT_static_libgfortran: > + case OPT_static_libphobos: > case OPT_static_libstdc__: > /* These are always valid, since gcc.c itself understands the > - first two, gfortranspec.c understands -static-libgfortran and > - g++spec.c understands -static-libstdc++ */ > + first two, gfortranspec.c understands -static-libgfortran, > + d-spec.cc understands -static-libphobos, and g++spec.c > + understands -static-libstdc++ */ > validated = true; > break; > > -- > 2.30.2 >