This patch workarounds bootstrapping on x86_64-w64-mingw32 targets with bootstrap-lto-lean and --enable-plugin enabled. Note that i686-w64-mingw32 targets still fails with bootstrap-lto-lean even without --enable-plugin due to segfault in lto1.exe.
--enable-plugin adds -Wl,--export-all-symbols and -Wl,[email protected] to PLUGINLIBS on mingw hosts, so that a plugin can resolve back into the compiler it is loaded by. These options are also passed to frontends that do not install compiler-proper import libraries. With bootstrap-lto-lean, their PE export tables can exceed the 16-bit ordinal limit and some LTO symbols cannot be exported with their resulting types. Define a backend library list without the mingw plugin export options and use it for gnat1, f951, lto1, lto-dump, cc1obj, and cc1objplus. Unlike the executables, libgccjit still needs its public import library. Generate a PE definition file from the existing libgccjit export list, disable automatic exports, and keep --out-implib for the public API. cc1 and cc1plus also still need to export their public APIs, so add -fno-lto to them, also add -ffat-lto-objects to the bootstrap-lto-lean config for mingw targets so that cc1 and cc1plus can be linked with LTO objects. config/ChangeLog: PR lto/115300 bootstrap-lto-lean.mk (STAGE3_CFLAGS): Add -ffat-lto-objects for mingw targets. (STAGEfeedback_CFLAGS): Likewise. gcc/ChangeLog: PR lto/115300 Makefile.in (BACKENDLIBS_NO_PLUGIN_EXPORTS): New variable, similar to BACKENDLIBS but without PLUGINLIBS. (PLUGIN_IMPLIB_LINKFLAGS): New variable, expands to -fno-lto if plugin_implib is yes and ALL_LINKERFLAGS contains -ffat-lto-objects. gcc/ada/ChangeLog: PR lto/115300 gcc-interface/Make-lang.in (gnat1): Use $(BACKENDLIBS_NO_PLUGIN_EXPORTS) instead of $(BACKENDLIBS). gcc/c/ChangeLog: PR lto/115300 Make-lang.in (cc1): Add $(PLUGIN_IMPLIB_LINKFLAGS) to the link command. gcc/cp/ChangeLog: PR lto/115300 Make-lang.in (cc1plus): Add $(PLUGIN_IMPLIB_LINKFLAGS) to the link command. gcc/fortran/ChangeLog: PR lto/115300 Make-lang.in (f951): Use $(BACKENDLIBS_NO_PLUGIN_EXPORTS) instead of $(BACKENDLIBS). gcc/jit/ChangeLog: PR lto/115300 Make-lang.in (LIBGCCJIT_DEF_FILE): New variable, dynamically generated from libgccjit.exports. (LIBGCCJIT_EXTRA_OPTS): Add $(LIBGCCJIT_DEF_FILE). (libgccjit): Add $(LIBGCCJIT_DEF_FILE) to the link command and use $(BACKENDLIBS_NO_PLUGIN_EXPORTS) instead of $(BACKENDLIBS). (jit.mostlyclean): Add cleanup of $(LIBGCCJIT_DEF_FILE). libgccjit.exports: Adjust comments. gcc/lto/ChangeLog: PR lto/115300 Make-lang.in (lto1): Use $(BACKENDLIBS_NO_PLUGIN_EXPORTS) instead of $(BACKENDLIBS). (lto-dump): Likewise. gcc/objc/ChangeLog: PR lto/115300 Make-lang.in (cc1obj): Use $(BACKENDLIBS_NO_PLUGIN_EXPORTS) instead of $(BACKENDLIBS). gcc/objcp/ChangeLog: PR lto/115300 Make-lang.in (cc1objplus): Use $(BACKENDLIBS_NO_PLUGIN_EXPORTS) instead of $(BACKENDLIBS). Signed-off-by: Zhongteng Gui <[email protected]> --- config/bootstrap-lto-lean.mk | 4 ++++ gcc/Makefile.in | 4 ++++ gcc/ada/gcc-interface/Make-lang.in | 2 +- gcc/c/Make-lang.in | 2 +- gcc/cp/Make-lang.in | 2 +- gcc/fortran/Make-lang.in | 2 +- gcc/jit/Make-lang.in | 15 +++++++++++---- gcc/jit/libgccjit.exports | 2 +- gcc/lto/Make-lang.in | 4 ++-- gcc/objc/Make-lang.in | 2 +- gcc/objcp/Make-lang.in | 2 +- 11 files changed, 28 insertions(+), 13 deletions(-) diff --git a/config/bootstrap-lto-lean.mk b/config/bootstrap-lto-lean.mk index 42cb3394c70..5f3d2b56fbf 100644 --- a/config/bootstrap-lto-lean.mk +++ b/config/bootstrap-lto-lean.mk @@ -5,6 +5,10 @@ STAGE3_CFLAGS += -flto=jobserver override STAGEtrain_CFLAGS := $(filter-out -flto=jobserver,$(STAGEtrain_CFLAGS)) STAGEtrain_GENERATOR_CFLAGS += -flto=jobserver STAGEfeedback_CFLAGS += -flto=jobserver +ifneq (,$(findstring mingw,$(host_os))) +STAGE3_CFLAGS += -ffat-lto-objects +STAGEfeedback_CFLAGS += -ffat-lto-objects +endif # assumes the host supports the linker plugin LTO_AR = $$r/$(HOST_SUBDIR)/prev-gcc/gcc-ar$(exeext) -B$$r/$(HOST_SUBDIR)/prev-gcc/ diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 8ecef4ccdc7..0a28272fb21 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1161,6 +1161,10 @@ LIBS = @LIBS@ libcommon.a $(CPPLIB) $(LIBINTL) $(LIBICONV) $(LIBBACKTRACE) \ $(LIBIBERTY) $(LIBDECNUMBER) $(HOST_LIBS) BACKENDLIBS = $(ISLLIBS) $(GMPLIBS) $(PLUGINLIBS) $(HOST_LIBS) \ $(ZLIB) $(ZSTD_LIB) +BACKENDLIBS_NO_PLUGIN_EXPORTS = $(if $(filter yes,$(plugin_implib)),\ + $(filter-out $(PLUGINLIBS),$(BACKENDLIBS)),$(BACKENDLIBS)) +PLUGIN_IMPLIB_LINKFLAGS = $(if $(and $(filter yes,$(plugin_implib)),\ + $(filter -ffat-lto-objects,$(ALL_LINKERFLAGS))),-fno-lto) # Any system libraries needed just for GNAT. SYSLIBS = @GNAT_LIBEXC@ diff --git a/gcc/ada/gcc-interface/Make-lang.in b/gcc/ada/gcc-interface/Make-lang.in index c0c1a0640f6..232d7546fa4 100644 --- a/gcc/ada/gcc-interface/Make-lang.in +++ b/gcc/ada/gcc-interface/Make-lang.in @@ -794,7 +794,7 @@ gnat1$(exeext): $(TARGET_ADA_SRCS) $(GNAT1_OBJS) $(ADA_BACKEND) $(EXTRA_HOST_OBJ $(EXTRA_HOST_OBJS) $(LIBDEPS) $(ada.prev) @$(call LINK_PROGRESS,$(INDEX.ada),start) +$(GCC_LLINK) -o $@ $(GNAT1_OBJS) $(ADA_BACKEND) $(EXTRA_HOST_OBJS) $(CFLAGS) \ - libcommon-target.a $(LIBS) $(SYSLIBS) $(BACKENDLIBS) $(GNATLIB) + libcommon-target.a $(LIBS) $(SYSLIBS) $(BACKENDLIBS_NO_PLUGIN_EXPORTS) $(GNATLIB) $(RM) stamp-gnatlib2-rts stamp-tools @$(call LINK_PROGRESS,$(INDEX.ada),end) diff --git a/gcc/c/Make-lang.in b/gcc/c/Make-lang.in index ecfa366afe3..3e49d488bf5 100644 --- a/gcc/c/Make-lang.in +++ b/gcc/c/Make-lang.in @@ -85,7 +85,7 @@ cc1-checksum.cc : build/genchecksum$(build_exeext) checksum-options \ cc1$(exeext): $(C_OBJS) cc1-checksum.o $(BACKEND) $(LIBDEPS) @$(call LINK_PROGRESS,$(INDEX.c),start) - +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ $(C_OBJS) \ + +$(LLINKER) $(ALL_LINKERFLAGS) $(PLUGIN_IMPLIB_LINKFLAGS) $(LDFLAGS) -o $@ $(C_OBJS) \ cc1-checksum.o $(BACKEND) $(LIBS) $(BACKENDLIBS) @$(call LINK_PROGRESS,$(INDEX.c),end) diff --git a/gcc/cp/Make-lang.in b/gcc/cp/Make-lang.in index e262854face..8aba89623a6 100644 --- a/gcc/cp/Make-lang.in +++ b/gcc/cp/Make-lang.in @@ -144,7 +144,7 @@ cc1plus-checksum.cc : build/genchecksum$(build_exeext) checksum-options \ cc1plus$(exeext): $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(CODYLIB) $(LIBDEPS) $(c++.prev) @$(call LINK_PROGRESS,$(INDEX.c++),start) - +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ + +$(LLINKER) $(ALL_LINKERFLAGS) $(PLUGIN_IMPLIB_LINKFLAGS) $(LDFLAGS) -o $@ \ $(CXX_OBJS) cc1plus-checksum.o $(BACKEND) $(CODYLIB) \ $(LIBS) $(BACKENDLIBS) @$(call LINK_PROGRESS,$(INDEX.c++),end) diff --git a/gcc/fortran/Make-lang.in b/gcc/fortran/Make-lang.in index 7dca21f8290..d6bd9c57492 100644 --- a/gcc/fortran/Make-lang.in +++ b/gcc/fortran/Make-lang.in @@ -97,7 +97,7 @@ f951$(exeext): $(F95_OBJS) $(BACKEND) $(LIBDEPS) attribs.o $(fortran.prev) @$(call LINK_PROGRESS,$(INDEX.fortran),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(F95_OBJS) $(BACKEND) $(ZLIB) $(LIBS) attribs.o \ - $(BACKENDLIBS) + $(BACKENDLIBS_NO_PLUGIN_EXPORTS) @$(call LINK_PROGRESS,$(INDEX.fortran),end) gt-fortran-trans.h : s-gtype; @true diff --git a/gcc/jit/Make-lang.in b/gcc/jit/Make-lang.in index b0c1294aa4a..9144dd4ba58 100644 --- a/gcc/jit/Make-lang.in +++ b/gcc/jit/Make-lang.in @@ -47,6 +47,7 @@ LIBGCCJIT_RELEASE_NUM = 1 ifneq (,$(findstring mingw,$(target))) LIBGCCJIT_FILENAME = libgccjit-$(LIBGCCJIT_VERSION_NUM).dll LIBGCCJIT_IMPORT_LIB = libgccjit.dll.a +LIBGCCJIT_DEF_FILE = libgccjit.def jit: $(LIBGCCJIT_FILENAME) \ $(FULL_DRIVER_NAME) @@ -156,7 +157,13 @@ jit-warn = $(STRICT_WARN) ifneq (,$(findstring mingw,$(target))) JIT_LDFLAGS = $(LDFLAGS) # Create import library -LIBGCCJIT_EXTRA_OPTS = -Wl,--out-implib,$(LIBGCCJIT_IMPORT_LIB) +LIBGCCJIT_EXTRA_OPTS = $(LIBGCCJIT_DEF_FILE) -Wl,--exclude-all-symbols \ + -Wl,--out-implib,$(LIBGCCJIT_IMPORT_LIB) + +$(LIBGCCJIT_DEF_FILE): $(srcdir)/jit/libgccjit.exports + echo EXPORTS > [email protected] + $(AWK) '/^_/ { sub(/^_/, ""); print }' $< >> [email protected] + $(SHELL) $(srcdir)/../move-if-change [email protected] $@ else ifneq (,$(findstring darwin,$(host))) LIBGCCJIT_VERS = $(LIBGCCJIT_CURRENT).$(LIBGCCJIT_REVISION).$(LIBGCCJIT_AGE) @@ -185,12 +192,12 @@ EXTRA_GCC_OBJS_EXCLUSIVE = $(foreach _obj1, $(EXTRA_GCC_OBJS), \ $(LIBGCCJIT_FILENAME): $(jit_OBJS) \ libbackend.a libcommon-target.a libcommon.a \ $(CPPLIB) $(LIBDECNUMBER) \ - $(LIBDEPS) $(srcdir)/jit/libgccjit.map \ + $(LIBDEPS) $(srcdir)/jit/libgccjit.map $(LIBGCCJIT_DEF_FILE) \ $(EXTRA_GCC_OBJS_EXCLUSIVE) $(jit.prev) @$(call LINK_PROGRESS,$(INDEX.jit),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(JIT_LDFLAGS) -o $@ -shared \ $(jit_OBJS) libbackend.a libcommon-target.a libcommon.a \ - $(CPPLIB) $(LIBDECNUMBER) $(EXTRA_GCC_LIBS) $(LIBS) $(BACKENDLIBS) \ + $(CPPLIB) $(LIBDECNUMBER) $(EXTRA_GCC_LIBS) $(LIBS) $(BACKENDLIBS_NO_PLUGIN_EXPORTS) \ $(EXTRA_GCC_OBJS_EXCLUSIVE) \ $(LIBGCCJIT_EXTRA_OPTS) @$(call LINK_PROGRESS,$(INDEX.jit),end) @@ -429,7 +436,7 @@ jit.uninstall: jit.mostlyclean: -rm -f $(LIBGCCJIT_FILENAME) $(LIBGCCJIT_SYMLINK) -rm -f $(LIBGCCJIT_LINKER_NAME_SYMLINK) $(FULL_DRIVER_NAME) - -rm -f $(LIBGCCJIT_SONAME) + -rm -f $(LIBGCCJIT_SONAME) $(LIBGCCJIT_DEF_FILE) $(LIBGCCJIT_DEF_FILE).tmp -rm -f $(jit_OBJS) jit.clean: diff --git a/gcc/jit/libgccjit.exports b/gcc/jit/libgccjit.exports index 17864c7010b..435d588c7d1 100644 --- a/gcc/jit/libgccjit.exports +++ b/gcc/jit/libgccjit.exports @@ -1,4 +1,4 @@ -# Linker export list for Darwin libgccjit.dylib +# Linker export list for libgccjit # Contributed by Iain Sandoe <[email protected]>. # diff --git a/gcc/lto/Make-lang.in b/gcc/lto/Make-lang.in index a54bdf63c64..d3a5e659482 100644 --- a/gcc/lto/Make-lang.in +++ b/gcc/lto/Make-lang.in @@ -91,13 +91,13 @@ lto-warn = $(STRICT_WARN) $(LTO_EXE): $(LTO_OBJS) $(BACKEND) $(LIBDEPS) $(lto1.prev) @$(call LINK_PROGRESS,$(INDEX.lto1),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ - $(LTO_OBJS) $(BACKEND) $(BACKENDLIBS) $(LIBS) + $(LTO_OBJS) $(BACKEND) $(BACKENDLIBS_NO_PLUGIN_EXPORTS) $(LIBS) @$(call LINK_PROGRESS,$(INDEX.lto1),end) $(LTO_DUMP_EXE): $(LTO_DUMP_OBJS) $(BACKEND) $(LIBDEPS) $(lto2.prev) @$(call LINK_PROGRESS,$(INDEX.lto2),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ - $(LTO_DUMP_OBJS) $(BACKEND) $(BACKENDLIBS) $(LIBS) + $(LTO_DUMP_OBJS) $(BACKEND) $(BACKENDLIBS_NO_PLUGIN_EXPORTS) $(LIBS) @$(call LINK_PROGRESS,$(INDEX.lto2),end) lto/lto-dump.o: $(LTO_OBJS) diff --git a/gcc/objc/Make-lang.in b/gcc/objc/Make-lang.in index 678ed9aa124..3015d96da22 100644 --- a/gcc/objc/Make-lang.in +++ b/gcc/objc/Make-lang.in @@ -77,7 +77,7 @@ cc1obj$(exeext): $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o $(BACKEND) \ @$(call LINK_PROGRESS,$(INDEX.objc),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(OBJC_OBJS) $(C_AND_OBJC_OBJS) cc1obj-checksum.o \ - $(BACKEND) $(LIBS) $(BACKENDLIBS) + $(BACKEND) $(LIBS) $(BACKENDLIBS_NO_PLUGIN_EXPORTS) @$(call LINK_PROGRESS,$(INDEX.objc),end) objc.srcextra: diff --git a/gcc/objcp/Make-lang.in b/gcc/objcp/Make-lang.in index 7beb9379817..c402a30a2b3 100644 --- a/gcc/objcp/Make-lang.in +++ b/gcc/objcp/Make-lang.in @@ -80,7 +80,7 @@ cc1objplus$(exeext): $(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) \ @$(call LINK_PROGRESS,$(INDEX.obj-c++),start) +$(LLINKER) $(ALL_LINKERFLAGS) $(LDFLAGS) -o $@ \ $(OBJCXX_OBJS) cc1objplus-checksum.o $(BACKEND) \ - $(CODYLIB) $(LIBS) $(BACKENDLIBS) + $(CODYLIB) $(LIBS) $(BACKENDLIBS_NO_PLUGIN_EXPORTS) @$(call LINK_PROGRESS,$(INDEX.obj-c++),end) # Objective C++ language specific files. -- 2.55.0.windows.3
