On Wed, 4 Feb 2026, Jakub Jelinek wrote: > Hi! > > The following patch saves ~ 2.4GiB of disk space in x86_64-linux > bootstrapped object directory: > find obj80 -name \*.gch -a -type f | xargs du -shc | grep total > 3.7G total > find obj82 -name \*.gch -a -type f | xargs du -shc | grep total > 1.3G total > and ~ 800MiB for i686-linux: > find obj81 -name \*.gch -a -type f | xargs du -shc | grep total > 1.2G total > find obj83 -name \*.gch -a -type f | xargs du -shc | grep total > 409M total > by disabling PCH in stage1/stage2/stageprofile builds, so only > building it in stage3/stagefeedback etc. > I think in stage1/stage2 it is a pure waste of bootstrap time and disk > space, for profiledbootstrap I'd say PCH isn't used commonly enough > in the wild that it is worth training GCC on that (but if you disagree, > I can surely take out that single line in there).
I didn't know PCH'd stdc++.h is so big! I'll continue using --disable-libstdcxx-pch during development to avoid wearing down my SSD (and avoid the slowdown of make having to rebuild the PCH after every library header change). I wonder whether using PCH'd stdc++.h is still faster anymore given how big the standard library is nowadays. Is the overhead of deserializing the entire library AST, keeping it in memory, slowing down parts of the front end that are >=linear in the size of the TU (including GC which is frequent in checking mode) less than the overhead of not using PCH and just parsing the subset of the library that's actually needed, for our average libstdc++ testcase? > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > 2026-02-04 Jakub Jelinek <[email protected]> > > * Makefile.tpl (STAGE1_CONFIGURE_FLAGS, STAGE2_CONFIGURE_FLAGS, > STAGEprofile_CONFIGURE_FLAGS): Append --disable-libstdcxx-pch if > target-libstdc++-v3-bootstrap. > * Makefile.in: Regenerate. > > --- Makefile.tpl.jj 2026-01-01 18:33:49.674983619 +0100 > +++ Makefile.tpl 2026-02-03 23:54:37.609444020 +0100 > @@ -556,6 +556,12 @@ STAGE1_CONFIGURE_FLAGS = $(STAGE1_CHECKI > --disable-coverage --enable-languages="$(STAGE1_LANGUAGES)" \ > --disable-build-format-warnings > > +@if target-libstdc++-v3-bootstrap > +STAGE1_CONFIGURE_FLAGS += --disable-libstdcxx-pch > +STAGE2_CONFIGURE_FLAGS += --disable-libstdcxx-pch > +STAGEprofile_CONFIGURE_FLAGS += --disable-libstdcxx-pch > +@endif target-libstdc++-v3-bootstrap > + > @if target-libphobos-bootstrap > STAGE1_CONFIGURE_FLAGS += --with-libphobos-druntime-only > STAGE2_CONFIGURE_FLAGS += --with-libphobos-druntime-only > --- Makefile.in.jj 2026-01-01 18:33:49.673983636 +0100 > +++ Makefile.in 2026-02-03 23:55:15.755489944 +0100 > @@ -633,6 +633,12 @@ STAGE1_CONFIGURE_FLAGS = $(STAGE1_CHECKI > --disable-coverage --enable-languages="$(STAGE1_LANGUAGES)" \ > --disable-build-format-warnings > > +@if target-libstdc++-v3-bootstrap > +STAGE1_CONFIGURE_FLAGS += --disable-libstdcxx-pch > +STAGE2_CONFIGURE_FLAGS += --disable-libstdcxx-pch > +STAGEprofile_CONFIGURE_FLAGS += --disable-libstdcxx-pch > +@endif target-libstdc++-v3-bootstrap > + > @if target-libphobos-bootstrap > STAGE1_CONFIGURE_FLAGS += --with-libphobos-druntime-only > STAGE2_CONFIGURE_FLAGS += --with-libphobos-druntime-only > > Jakub > >
