Excerpts from Iain Sandoe's message of November 19, 2021 10:21 am: > 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). >
The inverse. SKIPOPT means "skip this option", so previously it was being removed by the driver when constructing the new_decoded_options, hence why your generate_option addition was necessary before. Iain. > 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 >> > >