https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115761
Bug ID: 115761 Summary: Huge .o and compile times related to lambda debug strings Product: gcc Version: 14.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: antony at liquidinstruments dot com Target Milestone: --- Created attachment 58574 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=58574&action=edit Preprocessed minimal reproduction The minimal test case attached takes approx. 60s to compile into a 1.3 Gb object file when -g is used. I *think* that the way GCC chooses to represent the type of lambdas as text in debug_strs (and __PRETTY_FUNCTION__) is subject to exponential blowup in this use pattern. The test case is fine in GCC < 11, clang and MSVC, all of which use(d) a different strategy to stringify lambdas. $ time docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp gcc:latest gcc -v -save-temps -Wall -g -c bug.cpp Using built-in specs. COLLECT_GCC=gcc Target: aarch64-linux-gnu Configured with: /usr/src/gcc/configure --build=aarch64-linux-gnu --disable-multilib --enable-languages=c,c++,fortran,go Thread model: posix Supported LTO compression algorithms: zlib zstd gcc version 14.1.0 (GCC) COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-g' '-c' '-mlittle-endian' '-mabi=lp64' /usr/local/libexec/gcc/aarch64-linux-gnu/14.1.0/cc1plus -E -quiet -v -imultiarch aarch64-linux-gnu -D_GNU_SOURCE bug.cpp -mlittle-endian -mabi=lp64 -Wall -g -fworking-directory -fpch-preprocess -o bug.ii ignoring nonexistent directory "/usr/local/include/aarch64-linux-gnu" ignoring nonexistent directory "/usr/local/lib/gcc/aarch64-linux-gnu/14.1.0/include-fixed/aarch64-linux-gnu" ignoring nonexistent directory "/usr/local/lib/gcc/aarch64-linux-gnu/14.1.0/../../../../aarch64-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /usr/local/lib/gcc/aarch64-linux-gnu/14.1.0/../../../../include/c++/14.1.0 /usr/local/lib/gcc/aarch64-linux-gnu/14.1.0/../../../../include/c++/14.1.0/aarch64-linux-gnu /usr/local/lib/gcc/aarch64-linux-gnu/14.1.0/../../../../include/c++/14.1.0/backward /usr/local/lib/gcc/aarch64-linux-gnu/14.1.0/include /usr/local/include /usr/local/lib/gcc/aarch64-linux-gnu/14.1.0/include-fixed /usr/include/aarch64-linux-gnu /usr/include End of search list. COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-g' '-c' '-mlittle-endian' '-mabi=lp64' /usr/local/libexec/gcc/aarch64-linux-gnu/14.1.0/cc1plus -fpreprocessed bug.ii -quiet -dumpbase bug.cpp -dumpbase-ext .cpp -mlittle-endian -mabi=lp64 -g -Wall -version -o bug.s GNU C++17 (GCC) version 14.1.0 (aarch64-linux-gnu) compiled by GNU C version 14.1.0, GMP version 6.2.1, MPFR version 4.1.0, MPC version 1.2.1, isl version isl-0.24-GMP GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: e7e96b3dc8e1bdb1ff972ea9c82a477b COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-g' '-c' '-mlittle-endian' '-mabi=lp64' as -v --gdwarf-5 -EL -mabi=lp64 -o bug.o bug.s GNU assembler version 2.40 (aarch64-linux-gnu) using BFD version (GNU Binutils for Debian) 2.40 COMPILER_PATH=/usr/local/libexec/gcc/aarch64-linux-gnu/14.1.0/:/usr/local/libexec/gcc/aarch64-linux-gnu/14.1.0/:/usr/local/libexec/gcc/aarch64-linux-gnu/:/usr/local/lib/gcc/aarch64-linux-gnu/14.1.0/:/usr/local/lib/gcc/aarch64-linux-gnu/ LIBRARY_PATH=/usr/local/lib/gcc/aarch64-linux-gnu/14.1.0/:/usr/local/lib/gcc/aarch64-linux-gnu/14.1.0/../../../../lib64/:/lib/aarch64-linux-gnu/:/usr/lib/aarch64-linux-gnu/:/usr/local/lib/gcc/aarch64-linux-gnu/14.1.0/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-v' '-save-temps' '-Wall' '-g' '-c' '-mlittle-endian' '-mabi=lp64' docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp gcc:latest gcc -v 0.02s user 0.01s system 0% cpu 1:09.04 total $ ls -lh -rw-r--r-- 1 acsearle staff 160B 2 Jul 12:38 bug.cpp -rw-r--r-- 1 acsearle staff 311B 2 Jul 12:39 bug.ii -rw-r--r-- 1 acsearle staff 1.3G 2 Jul 12:40 bug.o -rw-r--r-- 1 acsearle staff 1.5G 2 Jul 12:39 bug.s