On Wed, Jan 10, 2007 at 06:26:09AM -0700, Tom Tromey wrote: > >>>>> "H.J." == H J Lu <[EMAIL PROTECTED]> writes: > > H.J.> With the new linker switches, -Bsymbolic-functions and > H.J.> --dynamic-list-cpp-new, we can improve shared library > H.J.> performance in gcc. This change will build libstdc++.so with > H.J.> -Bsymbolic-functions and --dynamic-list-cpp-new. I can expand it > H.J.> to other libraries. > > I prefer to see semi-generic helper code like this in a new .m4 file > in config. That makes it somewhat simpler for other target libraries > to reuse it. >
Here it is. If it is OK, I will extend it to Java and Fortran. H.J. --- config/ 2007-01-10 H.J. Lu <[EMAIL PROTECTED]> * lib-ld.m4 (AC_LIB_PROG_LD_GNU_SYMBOLIC): New. (AC_LIB_PROG_LD_GNU_DYNAMIC_LIST_CPP_NEW): Likewise. libstdc++-v3/ 2007-01-10 H.J. Lu <[EMAIL PROTECTED]> * aclocal.m4: Include ../config/lib-ld.m4. * configure.ac: Use AC_LIB_PROG_LD_GNU_DYNAMIC_LIST_CPP_NEW. * configure: Regenerated. * Makefile.in: Likewise. * src/Makefile.am (CXXLINK): Add $(DYNAMIC_LIST_CPP_NEW_LDFLAGS). * src/Makefile.in: Regenerated. --- gcc/config/lib-ld.m4.symbolic 2005-11-01 13:56:29.000000000 -0800 +++ gcc/config/lib-ld.m4 2007-01-10 10:49:49.000000000 -0800 @@ -108,3 +108,43 @@ fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) AC_LIB_PROG_LD_GNU ]) + +dnl Substitute SYMBOLIC_LDFLAGS with -Bsymbolic-functions for GNU linker +dnl if it is supported. +AC_DEFUN([AC_LIB_PROG_LD_GNU_SYMBOLIC], +[AC_CACHE_CHECK([if the GNU linker ($LD) supports -Bsymbolic-functions], +acl_cv_prog_gnu_ld_symbolic, [ +acl_cv_prog_gnu_ld_symbolic=no +if test x"$with_gnu_ld" = x"yes"; then + if $LD --help 2>&1 </dev/null | grep Bsymbolic-functions 1>&5; then + acl_cv_prog_gnu_ld_symbolic=yes + fi +fi]) +if test x"$acl_cv_prog_gnu_ld_symbolic" = x"yes"; then + SYMBOLIC_LDFLAGS="-Wl,-Bsymbolic-functions" +else + SYMBOLIC_LDFLAGS='' +fi +AC_SUBST(SYMBOLIC_LDFLAGS) +]) + +dnl Substitute DYNAMIC_LIST_CPP_NEW_LDFLAGS with --dynamic-list-cpp-new +dnl for GNU linker if it is supported. +AC_DEFUN([AC_LIB_PROG_LD_GNU_DYNAMIC_LIST_CPP_NEW], +[AC_CACHE_CHECK([if the GNU linker ($LD) supports --dynamic-list-cpp-new], +acl_cv_prog_gnu_ld_dynamic_list_cpp_new, [ +acl_cv_prog_gnu_ld_dynamic_list_cpp_new=no +if test x"$with_gnu_ld" = x"yes"; then + if $LD --help 2>&1 </dev/null | grep dynamic-list-cpp-new 1>&5; then + acl_cv_prog_gnu_ld_dynamic_list_cpp_new=yes + fi +fi]) +AC_LIB_PROG_LD_GNU_SYMBOLIC +if test x"$acl_cv_prog_gnu_ld_symbolic" = x"yes" -a \ + x"$acl_cv_prog_gnu_ld_dynamic_list_cpp_new" = x"yes"; then + DYNAMIC_LIST_CPP_NEW_LDFLAGS="$SYMBOLIC_LDFLAGS -Wl,--dynamic-list-cpp-new" +else + DYNAMIC_LIST_CPP_NEW_LDFLAGS='' +fi +AC_SUBST(DYNAMIC_LIST_CPP_NEW_LDFLAGS) +]) --- gcc/libstdc++-v3/Makefile.in.symbolic 2006-10-17 07:33:04.000000000 -0700 +++ gcc/libstdc++-v3/Makefile.in 2007-01-10 10:33:04.000000000 -0800 @@ -50,9 +50,10 @@ am__aclocal_m4_deps = $(top_srcdir)/../c $(top_srcdir)/../config/multi.m4 \ $(top_srcdir)/../config/no-executables.m4 \ $(top_srcdir)/../config/unwind_ipinfo.m4 \ - $(top_srcdir)/../libtool.m4 $(top_srcdir)/crossconfig.m4 \ - $(top_srcdir)/linkage.m4 $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/../config/tls.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/../config/lib-ld.m4 $(top_srcdir)/../libtool.m4 \ + $(top_srcdir)/crossconfig.m4 $(top_srcdir)/linkage.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/../config/tls.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ @@ -129,6 +130,7 @@ CYGPATH_W = @CYGPATH_W@ C_INCLUDE_DIR = @C_INCLUDE_DIR@ DEBUG_FLAGS = @DEBUG_FLAGS@ DEFS = @DEFS@ +DYNAMIC_LIST_CPP_NEW_LDFLAGS = @DYNAMIC_LIST_CPP_NEW_LDFLAGS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ @@ -193,6 +195,7 @@ SECTION_LDFLAGS = @SECTION_LDFLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ +SYMBOLIC_LDFLAGS = @SYMBOLIC_LDFLAGS@ SYMVER_FILE = @SYMVER_FILE@ TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@ USE_NLS = @USE_NLS@ --- gcc/libstdc++-v3/aclocal.m4.symbolic 2006-10-17 07:33:04.000000000 -0700 +++ gcc/libstdc++-v3/aclocal.m4 2007-01-10 10:19:35.000000000 -0800 @@ -585,6 +585,7 @@ m4_include([../config/lead-dot.m4]) m4_include([../config/multi.m4]) m4_include([../config/no-executables.m4]) m4_include([../config/unwind_ipinfo.m4]) +m4_include([../config/lib-ld.m4]) m4_include([../libtool.m4]) m4_include([crossconfig.m4]) m4_include([linkage.m4]) --- gcc/libstdc++-v3/configure.ac.symbolic 2006-11-16 09:57:24.000000000 -0800 +++ gcc/libstdc++-v3/configure.ac 2007-01-10 10:20:44.000000000 -0800 @@ -403,5 +403,7 @@ _EOF SUBDIRS="$SUBDIRS" ]) +AC_LIB_PROG_LD_GNU_DYNAMIC_LIST_CPP_NEW + dnl And this actually makes things happen: AC_OUTPUT --- gcc/libstdc++-v3/src/Makefile.am.symbolic 2006-07-30 22:39:24.000000000 -0700 +++ gcc/libstdc++-v3/src/Makefile.am 2007-01-10 10:31:21.000000000 -0800 @@ -254,7 +254,9 @@ LTLDFLAGS = $(shell $(SHELL) $(top_srcdi # directory to configure libstdc++-v3 to use gcc as the C++ # compilation driver. CXXLINK = $(LIBTOOL) --tag CXX --mode=link $(CXX) \ - $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@ + $(OPT_LDFLAGS) $(SECTION_LDFLAGS) \ + $(DYNAMIC_LIST_CPP_NEW_LDFLAGS) \ + $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@ # Added bits to build debug library. --- gcc/libstdc++-v3/src/Makefile.in.symbolic 2006-10-17 07:32:51.000000000 -0700 +++ gcc/libstdc++-v3/src/Makefile.in 2007-01-10 10:34:10.000000000 -0800 @@ -45,9 +45,10 @@ am__aclocal_m4_deps = $(top_srcdir)/../c $(top_srcdir)/../config/multi.m4 \ $(top_srcdir)/../config/no-executables.m4 \ $(top_srcdir)/../config/unwind_ipinfo.m4 \ - $(top_srcdir)/../libtool.m4 $(top_srcdir)/crossconfig.m4 \ - $(top_srcdir)/linkage.m4 $(top_srcdir)/acinclude.m4 \ - $(top_srcdir)/../config/tls.m4 $(top_srcdir)/configure.ac + $(top_srcdir)/../config/lib-ld.m4 $(top_srcdir)/../libtool.m4 \ + $(top_srcdir)/crossconfig.m4 $(top_srcdir)/linkage.m4 \ + $(top_srcdir)/acinclude.m4 $(top_srcdir)/../config/tls.m4 \ + $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) CONFIG_HEADER = $(top_builddir)/config.h @@ -147,6 +148,7 @@ CYGPATH_W = @CYGPATH_W@ C_INCLUDE_DIR = @C_INCLUDE_DIR@ DEBUG_FLAGS = @DEBUG_FLAGS@ DEFS = @DEFS@ +DYNAMIC_LIST_CPP_NEW_LDFLAGS = @DYNAMIC_LIST_CPP_NEW_LDFLAGS@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ @@ -211,6 +213,7 @@ SECTION_LDFLAGS = @SECTION_LDFLAGS@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ +SYMBOLIC_LDFLAGS = @SYMBOLIC_LDFLAGS@ SYMVER_FILE = @SYMVER_FILE@ TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@ USE_NLS = @USE_NLS@ @@ -437,7 +440,9 @@ LTLDFLAGS = $(shell $(SHELL) $(top_srcdi # directory to configure libstdc++-v3 to use gcc as the C++ # compilation driver. CXXLINK = $(LIBTOOL) --tag CXX --mode=link $(CXX) \ - $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@ + $(OPT_LDFLAGS) $(SECTION_LDFLAGS) \ + $(DYNAMIC_LIST_CPP_NEW_LDFLAGS) \ + $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@ debugdir = debug all: all-am