On 2/8/24 12:12, Jason Merrill wrote:
On 2/8/24 10:04, Iain Sandoe wrote:
Hi Jason,

I have tested this on modern Darwin (with libc++ as the system library) and on older Darwin, where we do see the issue - because the system linker is written in C++ and links with libstdc++ (so sometimes we get a crash, or worse unpredictable
beahviour).

Thank you!

-----

For modern Darwin [ >  macOS 10.11] , there’s no issue seen so far, but for older Darwin….

On 8 Feb 2024, at 05:36, Alexandre Oliva <ol...@adacore.com> wrote:

On Feb  6, 2024, Jason Merrill <ja...@redhat.com> wrote:

Reverting that hunk of the change fixed my problem with bubblestrapping GCC
12 with ccache on a host with a newer system libstdc++.

Did you have libcc1, gnattools and gotools enabled in your testing?

… I have done all but “go” since that’s not supported on Darwin.

The patch breaks bootstrap on older Darwin because:

   Ada uses exceptions.
   gnat1 pulls in system libraries that link with the system unwinder
   - so we have to link gnat1 “-shared-libgcc”
   - which means we need to be able to find the just-built one when building the target libs.

Hmm.  In stage 1, when we build with the system gcc, I'd think we want the just-built gnat1 to find the system libgcc.

In stage 2, when we build with the stage 1 gcc, we want the just-built gnat1 to find the stage 1 libgcc.

In neither case do we want it to find the libgcc from the current stage.

So it seems to me that what we want is for stage2+ LD_LIBRARY_PATH to include the TARGET_LIB_PATH from the previous stage.  Something like the below, on top of the earlier patch.

Does this make sense?  Does it work on Darwin?

Oops, that was broken, please consider this one instead:

From 4c9558e7f82f95fb7583892c18401bc2ba98ec4d Mon Sep 17 00:00:00 2001
From: Jason Merrill <ja...@redhat.com>
Date: Thu, 8 Feb 2024 11:58:11 -0500
Subject: [PATCH] build: add prev target libs to rpath
To: gcc-patches@gcc.gnu.org

ChangeLog:

	* Makefile.tpl (POSTSTAGE1_HOST_EXPORTS): Add TARGET_PREV_LIB_PATH
	to RPATH_ENVVAR.
	* Makefile.in: Regenerate.
---
 Makefile.in  | 14 +++++++++++++-
 Makefile.tpl |  8 +++++++-
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/Makefile.in b/Makefile.in
index c2843d5df89..4b168cb2087 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -266,6 +266,7 @@ POSTSTAGE1_CXX_EXPORT = \
 # Similar, for later GCC stages.
 POSTSTAGE1_HOST_EXPORTS = \
 	$(HOST_EXPORTS) \
+	$(RPATH_ENVVAR)=`echo "$(TARGET_PREV_LIB_PATH)$$$(RPATH_ENVVAR)" | sed 's,::*,:,g;s,^:*,,;s,:*$$,,'`; export $(RPATH_ENVVAR); \
 	CC="$(STAGE_CC_WRAPPER) $$r/$(HOST_SUBDIR)/prev-gcc/xgcc$(exeext) \
 	  -B$$r/$(HOST_SUBDIR)/prev-gcc/ -B$(build_tooldir)/bin/ \
 	  $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CC; \
@@ -727,41 +728,51 @@ all:
 # This is the list of directories that may be needed in RPATH_ENVVAR
 # so that programs built for the target machine work.
 TARGET_LIB_PATH = $(TARGET_LIB_PATH_libstdc++-v3)$(TARGET_LIB_PATH_libsanitizer)$(TARGET_LIB_PATH_libvtv)$(TARGET_LIB_PATH_libssp)$(TARGET_LIB_PATH_libphobos)$(TARGET_LIB_PATH_libgm2)$(TARGET_LIB_PATH_libgomp)$(TARGET_LIB_PATH_libitm)$(TARGET_LIB_PATH_libatomic)$(HOST_LIB_PATH_gcc)
+TARGET_PREV_LIB_PATH = $(TARGET_PREV_LIB_PATH_libstdc++-v3)$(TARGET_PREV_LIB_PATH_libsanitizer)$(TARGET_PREV_LIB_PATH_libvtv)$(TARGET_PREV_LIB_PATH_libssp)$(TARGET_PREV_LIB_PATH_libphobos)$(TARGET_PREV_LIB_PATH_libgm2)$(TARGET_PREV_LIB_PATH_libgomp)$(TARGET_PREV_LIB_PATH_libitm)$(TARGET_PREV_LIB_PATH_libatomic)$(HOST_PREV_LIB_PATH_gcc)
 
 @if target-libstdc++-v3
 TARGET_LIB_PATH_libstdc++-v3 = $$r/$(TARGET_SUBDIR)/libstdc++-v3/src/.libs:
+TARGET_PREV_LIB_PATH_libstdc++-v3 = $$r/prev-$(TARGET_SUBDIR)/libstdc++-v3/src/.libs:
 @endif target-libstdc++-v3
 
 @if target-libsanitizer
 TARGET_LIB_PATH_libsanitizer = $$r/$(TARGET_SUBDIR)/libsanitizer/.libs:
+TARGET_PREV_LIB_PATH_libsanitizer = $$r/prev-$(TARGET_SUBDIR)/libsanitizer/.libs:
 @endif target-libsanitizer
 
 @if target-libvtv
 TARGET_LIB_PATH_libvtv = $$r/$(TARGET_SUBDIR)/libvtv/.libs:
+TARGET_PREV_LIB_PATH_libvtv = $$r/prev-$(TARGET_SUBDIR)/libvtv/.libs:
 @endif target-libvtv
 
 @if target-libssp
 TARGET_LIB_PATH_libssp = $$r/$(TARGET_SUBDIR)/libssp/.libs:
+TARGET_PREV_LIB_PATH_libssp = $$r/prev-$(TARGET_SUBDIR)/libssp/.libs:
 @endif target-libssp
 
 @if target-libphobos
 TARGET_LIB_PATH_libphobos = $$r/$(TARGET_SUBDIR)/libphobos/src/.libs:
+TARGET_PREV_LIB_PATH_libphobos = $$r/prev-$(TARGET_SUBDIR)/libphobos/src/.libs:
 @endif target-libphobos
 
 @if target-libgm2
 TARGET_LIB_PATH_libgm2 = $$r/$(TARGET_SUBDIR)/libgm2/.libs:
+TARGET_PREV_LIB_PATH_libgm2 = $$r/prev-$(TARGET_SUBDIR)/libgm2/.libs:
 @endif target-libgm2
 
 @if target-libgomp
 TARGET_LIB_PATH_libgomp = $$r/$(TARGET_SUBDIR)/libgomp/.libs:
+TARGET_PREV_LIB_PATH_libgomp = $$r/prev-$(TARGET_SUBDIR)/libgomp/.libs:
 @endif target-libgomp
 
 @if target-libitm
 TARGET_LIB_PATH_libitm = $$r/$(TARGET_SUBDIR)/libitm/.libs:
+TARGET_PREV_LIB_PATH_libitm = $$r/prev-$(TARGET_SUBDIR)/libitm/.libs:
 @endif target-libitm
 
 @if target-libatomic
 TARGET_LIB_PATH_libatomic = $$r/$(TARGET_SUBDIR)/libatomic/.libs:
+TARGET_PREV_LIB_PATH_libatomic = $$r/prev-$(TARGET_SUBDIR)/libatomic/.libs:
 @endif target-libatomic
 
 
@@ -772,7 +783,8 @@ HOST_LIB_PATH = $(HOST_LIB_PATH_gmp)$(HOST_LIB_PATH_mpfr)$(HOST_LIB_PATH_mpc)$(H
 
 # Define HOST_LIB_PATH_gcc here, for the sake of TARGET_LIB_PATH, ouch
 @if gcc
-HOST_LIB_PATH_gcc = $$r/$(HOST_SUBDIR)/gcc$(GCC_SHLIB_SUBDIR):$$r/$(HOST_SUBDIR)/prev-gcc$(GCC_SHLIB_SUBDIR):
+HOST_LIB_PATH_gcc = $$r/$(HOST_SUBDIR)/gcc$(GCC_SHLIB_SUBDIR)
+HOST_PREV_LIB_PATH_gcc = $$r/$(HOST_SUBDIR)/prev-gcc$(GCC_SHLIB_SUBDIR)
 @endif gcc
 
 
diff --git a/Makefile.tpl b/Makefile.tpl
index cb39fbd0434..193cea6d803 100644
--- a/Makefile.tpl
+++ b/Makefile.tpl
@@ -269,6 +269,7 @@ POSTSTAGE1_CXX_EXPORT = \
 # Similar, for later GCC stages.
 POSTSTAGE1_HOST_EXPORTS = \
 	$(HOST_EXPORTS) \
+	$(RPATH_ENVVAR)=`echo "$(TARGET_PREV_LIB_PATH)$$$(RPATH_ENVVAR)" | sed 's,::*,:,g;s,^:*,,;s,:*$$,,'`; export $(RPATH_ENVVAR); \
 	CC="$(STAGE_CC_WRAPPER) $$r/$(HOST_SUBDIR)/prev-gcc/xgcc$(exeext) \
 	  -B$$r/$(HOST_SUBDIR)/prev-gcc/ -B$(build_tooldir)/bin/ \
 	  $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CC; \
@@ -652,9 +653,13 @@ all:
 TARGET_LIB_PATH = [+ FOR target_modules +][+
   IF lib_path +]$(TARGET_LIB_PATH_[+module+])[+ ENDIF lib_path +][+
   ENDFOR target_modules +]$(HOST_LIB_PATH_gcc)
+TARGET_PREV_LIB_PATH = [+ FOR target_modules +][+
+  IF lib_path +]$(TARGET_PREV_LIB_PATH_[+module+])[+ ENDIF lib_path +][+
+  ENDFOR target_modules +]$(HOST_PREV_LIB_PATH_gcc)
 [+ FOR target_modules +][+ IF lib_path +]
 @if target-[+module+]
 TARGET_LIB_PATH_[+module+] = $$r/$(TARGET_SUBDIR)/[+module+]/[+lib_path+]:
+TARGET_PREV_LIB_PATH_[+module+] = $$r/prev-$(TARGET_SUBDIR)/[+module+]/[+lib_path+]:
 @endif target-[+module+]
 [+ ENDIF lib_path +][+ ENDFOR target_modules +]
 
@@ -667,7 +672,8 @@ HOST_LIB_PATH = [+ FOR host_modules +][+
 
 # Define HOST_LIB_PATH_gcc here, for the sake of TARGET_LIB_PATH, ouch
 @if gcc
-HOST_LIB_PATH_gcc = $$r/$(HOST_SUBDIR)/gcc$(GCC_SHLIB_SUBDIR):$$r/$(HOST_SUBDIR)/prev-gcc$(GCC_SHLIB_SUBDIR):
+HOST_LIB_PATH_gcc = $$r/$(HOST_SUBDIR)/gcc$(GCC_SHLIB_SUBDIR)
+HOST_PREV_LIB_PATH_gcc = $$r/$(HOST_SUBDIR)/prev-gcc$(GCC_SHLIB_SUBDIR)
 @endif gcc
 
 [+ FOR host_modules +][+ IF lib_path +]
-- 
2.43.0

Reply via email to