On Tue, Jul 19, 2016 at 1:20 AM, Richard Biener <richard.guent...@gmail.com> wrote: > On Tue, Jul 19, 2016 at 2:39 AM, Patrick Palka <patr...@parcs.ath.cx> wrote: >> On Mon, 18 Jul 2016, Segher Boessenkool wrote: >> >>> On Mon, Jul 18, 2016 at 06:35:11AM -0500, Segher Boessenkool wrote: >>> > Or, if using GNU ar, you can even use -S, if that helps (after testing >>> > for it in configure, of course). >>> >>> I meant -T. Some day I will learn how to type, promise! >> >> According to the documentation of GNU ar, >> >> "gnu ar can optionally create a thin archive, which contains a symbol >> index and references to the original copies of the member files of the >> archive. This is useful for building libraries for use within a local >> build tree, where the relocatable objects are expected to remain >> available, and copying the contents of each object would only waste time >> and space." >> >> Since the objects which libbackend.a is composed of remain available >> throughout the build process I think it should be safe to make >> libbackend.a a thin archive. >> >> So here's a patch which builds libbackend.a as a thin archive if the >> toolchain supports it. The time it takes to rebuild a >> --disable-bootstrap tree after touching a single source file is now 7.5s >> instead of 35+s -- a much better speedup than when simply eliding the >> call to ranlib since the archive is now 1-5MB in size instead of 450MB. >> >> Instead of changing AR_FLAGS, only the invocation of ar on libbackend.a >> is changed because that is by far the largest archive (by a factor of >> 20x) and it seems less risky this way. >> >> One thing that was not clear to me is whether the object file paths >> stored in a thin archive are relative or absolute paths. If they are >> absolute paths then that would be a problem due to how the build system >> moves build directories in between stages (gcc/ -> prev-gcc/ etc). But >> it looks like the object file paths are relative to the location of the >> archive which is compatible. >> >> Bootstrapped on x86_64-pc-linux-gnu. Thoughts? > > I like it. Improving re-build time in my dev tree is very much > welcome, and yes, > libbackend build time is a big part of it usually (plus of course cc1 > link time).
I like it too because a lot is spent of my builds are spent creating libbackend and linking. I usually go and grab coffee during that time due to the disk usage and the kernel likes to grind to a halt during the build at this point. Thanks, Andrew > > Richard. > >> -- >8 -- >> >> Subject: [PATCH] Build libbackend.a as a thin archive if possible >> >> gcc/ChangeLog: >> >> * configure.ac (thin_archive_support): New variable. AC_SUBST it. >> * configure: Regenerate. >> * Makefile.in (THIN_ARCHIVE_SUPPORT): New variable. >> (USE_THIN_ARCHIVES): New variable. >> (libbackend.a): If USE_THIN_ARCHIVES then pass T to ar to build >> this archive as a thin archive. >> --- >> gcc/Makefile.in | 17 +++++++++++++++++ >> gcc/configure | 20 ++++++++++++++++++-- >> gcc/configure.ac | 13 +++++++++++++ >> 3 files changed, 48 insertions(+), 2 deletions(-) >> >> diff --git a/gcc/Makefile.in b/gcc/Makefile.in >> index 0786fa3..15a879b 100644 >> --- a/gcc/Makefile.in >> +++ b/gcc/Makefile.in >> @@ -275,6 +275,17 @@ else >> LLINKER = $(LINKER) >> endif >> >> +THIN_ARCHIVE_SUPPORT = @thin_archive_support@ >> + >> +USE_THIN_ARCHIVES = no >> +ifeq ($(THIN_ARCHIVE_SUPPORT),yes) >> +ifeq ($(AR_FLAGS),rc) >> +ifeq ($(RANLIB_FLAGS),) >> +USE_THIN_ARCHIVES = yes >> +endif >> +endif >> +endif >> + >> # ------------------------------------------- >> # Programs which operate on the build machine >> # ------------------------------------------- >> @@ -1882,8 +1893,14 @@ compilations: $(BACKEND) >> # This archive is strictly for the host. >> libbackend.a: $(OBJS) >> -rm -rf libbackend.a >> + @# Build libbackend.a as a thin archive if possible, as doing so >> + @# significantly reduces build times. >> +ifeq ($(USE_THIN_ARCHIVES),yes) >> + $(AR) $(AR_FLAGS)T libbackend.a $(OBJS) >> +else >> $(AR) $(AR_FLAGS) libbackend.a $(OBJS) >> -$(RANLIB) $(RANLIB_FLAGS) libbackend.a >> +endif >> >> libcommon-target.a: $(OBJS-libcommon-target) >> -rm -rf libcommon-target.a >> diff --git a/gcc/configure b/gcc/configure >> index ed44472..81c81b3 100755 >> --- a/gcc/configure >> +++ b/gcc/configure >> @@ -679,6 +679,7 @@ zlibinc >> zlibdir >> HOST_LIBS >> enable_default_ssp >> +thin_archive_support >> libgcc_visibility >> gcc_cv_readelf >> gcc_cv_objdump >> @@ -18475,7 +18476,7 @@ else >> lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 >> lt_status=$lt_dlunknown >> cat > conftest.$ac_ext <<_LT_EOF >> -#line 18478 "configure" >> +#line 18479 "configure" >> #include "confdefs.h" >> >> #if HAVE_DLFCN_H >> @@ -18581,7 +18582,7 @@ else >> lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 >> lt_status=$lt_dlunknown >> cat > conftest.$ac_ext <<_LT_EOF >> -#line 18584 "configure" >> +#line 18585 "configure" >> #include "confdefs.h" >> >> #if HAVE_DLFCN_H >> @@ -27846,6 +27847,21 @@ $as_echo "#define HAVE_AS_LINE_ZERO 1" >>confdefs.h >> >> fi >> >> +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking support for thin >> archives" >&5 >> +$as_echo_n "checking support for thin archives... " >&6; } >> +thin_archive_support=no >> +echo 'int main (void) { return 0; }' > conftest.c >> +if ($AR --version | sed 1q | grep "GNU ar" \ >> + && $CC $CFLAGS -c conftest.c \ >> + && $AR rcT conftest.a conftest.o \ >> + && $CC -o conftest conftest.a) >/dev/null 2>&1; then >> + thin_archive_support=yes >> +fi >> +rm -f conftest.c conftest.o conftest.a conftest >> +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $thin_archive_support" >&5 >> +$as_echo "$thin_archive_support" >&6; } >> + >> + >> { $as_echo "$as_me:${as_lineno-$LINENO}: checking linker PT_GNU_EH_FRAME >> support" >&5 >> $as_echo_n "checking linker PT_GNU_EH_FRAME support... " >&6; } >> gcc_cv_ld_eh_frame_hdr=no >> diff --git a/gcc/configure.ac b/gcc/configure.ac >> index 086d0fc..63052ba 100644 >> --- a/gcc/configure.ac >> +++ b/gcc/configure.ac >> @@ -4899,6 +4899,19 @@ if test "x$gcc_cv_as_line_zero" = xyes; then >> [Define if the assembler won't complain about a line such as # 0 "" 2.]) >> fi >> >> +AC_MSG_CHECKING(support for thin archives) >> +thin_archive_support=no >> +echo 'int main (void) { return 0; }' > conftest.c >> +if ($AR --version | sed 1q | grep "GNU ar" \ >> + && $CC $CFLAGS -c conftest.c \ >> + && $AR rcT conftest.a conftest.o \ >> + && $CC -o conftest conftest.a) >/dev/null 2>&1; then >> + thin_archive_support=yes >> +fi >> +rm -f conftest.c conftest.o conftest.a conftest >> +AC_MSG_RESULT($thin_archive_support) >> +AC_SUBST(thin_archive_support) >> + >> AC_MSG_CHECKING(linker PT_GNU_EH_FRAME support) >> gcc_cv_ld_eh_frame_hdr=no >> if test $in_tree_ld = yes ; then >> -- >> 2.9.2.321.g3e7e728 >>