This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Avoid invoking ranlib on libbackend.a
On Tue, Jul 19, 2016 at 1:20 AM, Richard Biener
<richard.guenther@gmail.com> wrote:
> On Tue, Jul 19, 2016 at 2:39 AM, Patrick Palka <patrick@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
>>