Issue 131448
Summary [Clang] [Serialization] Crash when the number of chained PCHs exceeds 6
Labels clang
Assignees
Reporter 16bit-ykiko
    I am trying to use [Chained precompiled headers](https://clang.llvm.org/docs/PCHInternals.html#chained-precompiled-headers) to reduce the granularity of incremental compilation in the IDE. But once the number of chained PCHs exceeds 6, the clang compiler will crash.

```shell
Running command: clang++-19 -x c++-header ./header0.cxx -Xclang -emit-pch -o ./header0.pch
Running command: clang++-19 -x c++-header ./header1.cxx -Xclang -emit-pch -o ./header1.pch -include-pch ./header0.pch
Running command: clang++-19 -x c++-header ./header2.cxx -Xclang -emit-pch -o ./header2.pch -include-pch ./header1.pch
Running command: clang++-19 -x c++-header ./header3.cxx -Xclang -emit-pch -o ./header3.pch -include-pch ./header2.pch
Running command: clang++-19 -x c++-header ./header4.cxx -Xclang -emit-pch -o ./header4.pch -include-pch ./header3.pch
Running command: clang++-19 -x c++-header ./header5.cxx -Xclang -emit-pch -o ./header5.pch -include-pch ./header4.pch
Running command: clang++-19 -x c++-header ./header6.cxx -Xclang -emit-pch -o ./header6.pch -include-pch ./header5.pch
Running command: clang++-19 -x c++-header ./header7.cxx -Xclang -emit-pch -o ./header7.pch -include-pch ./header6.pch
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: clang++-19 -x c++-header ./header7.cxx -Xclang -emit-pch -o ./header7.pch -include-pch ./header6.pch
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0  libLLVM.so.19.1      0x00007fbbfc1c842f llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 63
1  libLLVM.so.19.1      0x00007fbbfc1c6139 llvm::sys::RunSignalHandlers() + 89
2  libLLVM.so.19.1      0x00007fbbfc10f227
3  libc.so.6            0x00007fbbfad9f330
4  libclang-cpp.so.19.1 0x00007fbc059ac289 clang::ASTReader::getLocalModuleFile(clang::serialization::ModuleFile&, unsigned int) const + 313
5  libclang-cpp.so.19.1 0x00007fbc05a2ddcb
6  libclang-cpp.so.19.1 0x00007fbc05a2c9ba clang::ASTReader::loadDeclUpdateRecords(clang::ASTReader::PendingUpdateRecord&) + 1594
7  libclang-cpp.so.19.1 0x00007fbc059df986 clang::ASTReader::finishPendingActions() + 2454
8  libclang-cpp.so.19.1 0x00007fbc059e337b clang::ASTReader::FinishedDeserializing() + 59
9  libclang-cpp.so.19.1 0x00007fbc059c7999 clang::ASTReader::ReadAST(llvm::StringRef, clang::serialization::ModuleKind, clang::SourceLocation, unsigned int, clang::serialization::ModuleFile**) + 537
10 libclang-cpp.so.19.1 0x00007fbc05b8e1ce clang::CompilerInstance::createPCHExternalASTSource(llvm::StringRef, llvm::StringRef, clang::DisableValidationForModuleKind, bool, clang::Preprocessor&, clang::InMemoryModuleCache&, clang::ASTContext&, clang::PCHContainerReader const&, llvm::ArrayRef<std::shared_ptr<clang::ModuleFileExtension>>, llvm::ArrayRef<std::shared_ptr<clang::DependencyCollector>>, void*, bool, bool, bool) + 574
11 libclang-cpp.so.19.1 0x00007fbc05b8df1c clang::CompilerInstance::createPCHExternalASTSource(llvm::StringRef, clang::DisableValidationForModuleKind, bool, void*, bool) + 316
12 libclang-cpp.so.19.1 0x00007fbc05c1bab7 clang::FrontendAction::BeginSourceFile(clang::CompilerInstance&, clang::FrontendInputFile const&) + 10343
13 libclang-cpp.so.19.1 0x00007fbc05b909e5 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) + 981
14 libclang-cpp.so.19.1 0x00007fbc05c9cd2c clang::ExecuteCompilerInvocation(clang::CompilerInstance*) + 700
15 clang++-19           0x000055878448f1d2 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) + 5586
16 clang++-19           0x000055878448c1a4
17 libclang-cpp.so.19.1 0x00007fbc0581f272
18 libLLVM.so.19.1      0x00007fbbfc10ef77 llvm::CrashRecoveryContext::RunSafely(llvm::function_ref<void ()>) + 151
19 libclang-cpp.so.19.1 0x00007fbc0581eb06 clang::driver::CC1Command::Execute(llvm::ArrayRef<std::optional<llvm::StringRef>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>*, bool*) const + 406
20 libclang-cpp.so.19.1 0x00007fbc057e3f89 clang::driver::Compilation::ExecuteCommand(clang::driver::Command const&, clang::driver::Command const*&, bool) const + 921
21 libclang-cpp.so.19.1 0x00007fbc057e41ff clang::driver::Compilation::ExecuteJobs(clang::driver::JobList const&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&, bool) const + 159
22 libclang-cpp.so.19.1 0x00007fbc058014d0 clang::driver::Driver::ExecuteCompilation(clang::driver::Compilation&, llvm::SmallVectorImpl<std::pair<int, clang::driver::Command const*>>&) + 352
23 clang++-19           0x000055878448bbcb clang_main(int, char**, llvm::ToolContext const&) + 6699
24 clang++-19           0x0000558784499703 main + 131
25 libc.so.6            0x00007fbbfad841ca
26 libc.so.6            0x00007fbbfad8428b __libc_start_main + 139
27 clang++-19           0x0000558784489da5 _start + 37
clang++-19: error: clang frontend command failed with exit code 139 (use -v to see invocation)
Ubuntu clang version 19.1.7 (++20250114103332+cd708029e0b2-1~exp1~20250114103446.78)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-19/bin
clang++-19: error: unable to execute command: Segmentation fault (core dumped)
clang++-19: note: diagnostic msg: Error generating preprocessed source(s).
Error compiling ./header7.cxx: Command '['clang++-19', '-x', 'c++-header', './header7.cxx', '-Xclang', '-emit-pch', '-o', './header7.pch', '-include-pch', './header6.pch']' returned non-zero exit status 1.
```

It also crash on windows

```shell
Running command: clang++ -x c++-header ./header0.cxx -Xclang -emit-pch -o ./header0.pch
Running command: clang++ -x c++-header ./header1.cxx -Xclang -emit-pch -o ./header1.pch -include-pch ./header0.pch
Running command: clang++ -x c++-header ./header2.cxx -Xclang -emit-pch -o ./header2.pch -include-pch ./header1.pch
Running command: clang++ -x c++-header ./header3.cxx -Xclang -emit-pch -o ./header3.pch -include-pch ./header2.pch
Running command: clang++ -x c++-header ./header4.cxx -Xclang -emit-pch -o ./header4.pch -include-pch ./header3.pch
Running command: clang++ -x c++-header ./header5.cxx -Xclang -emit-pch -o ./header5.pch -include-pch ./header4.pch
Running command: clang++ -x c++-header ./header6.cxx -Xclang -emit-pch -o ./header6.pch -include-pch ./header5.pch
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: clang++ -x c++-header ./header6.cxx -Xclang -emit-pch -o ./header6.pch -include-pch ./header5.pch
Exception Code: 0xC0000005
 #0 0x00007ff6a800d7a6 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x23cd7a6)
 #1 0x00007ff6a8c355d5 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x2ff55d5)
 #2 0x00007ff6a8c343db (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x2ff43db)
 #3 0x00007ff6a8038ed3 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x23f8ed3)
 #4 0x00007ff6a803c157 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x23fc157)
 #5 0x00007ff6a8024c91 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x23e4c91)
 #6 0x00007ff6a7ae14cd (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x1ea14cd)
 #7 0x00007ff6a7ae122a (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x1ea122a)
 #8 0x00007ff6a6217c89 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x5d7c89)
 #9 0x00007ff6a62035e3 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x5c35e3)
#10 0x00007ff6a6200366 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x5c0366)
#11 0x00007ff6a61fd325 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x5bd325)
#12 0x00007ff6a61fbcbe (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x5bbcbe)
#13 0x00007ff6a69155cd (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0xcd55cd)
#14 0x00007ff6a6384175 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x744175)
#15 0x00007ff6a6383f68 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x743f68)
#16 0x00007ff6a608c0c8 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x44c0c8)
#17 0x00007ff6a608b44e (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x44b44e)
#18 0x00007ff6a608afc7 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x44afc7)
#19 0x00007ff6a6082756 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x442756)
#20 0x00007ff6a607fed3 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x43fed3)
#21 0x00007ff6a7842bc8 (C:\Users\13511\scoop\apps\llvm\current\bin\clang++.exe+0x1c02bc8)
#22 0x00007ff97a0ce8d7 (C:\WINDOWS\System32\KERNEL32.DLL+0x2e8d7)
#23 0x00007ff97bb9bf6c (C:\WINDOWS\SYSTEM32\ntdll.dll+0xbbf6c)
clang++: error: clang frontend command failed due to signal (use -v to see invocation)
clang version 19.1.7
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Users\13511\scoop\apps\llvm\19.1.7\bin
clang++: note: diagnostic msg: Error generating preprocessed source(s).
Error compiling ./header6.cxx: Command '['clang++', '-x', 'c++-header', './header6.cxx', '-Xclang', '-emit-pch', '-o', './header6.pch', '-include-pch', './header5.pch']' returned non-zero exit status 1.
```

But sadly I cannot reproduce it on [godbolt](https://godbolt.org/z/8os1G5j7d), it works well. I sent the test code to others—some experienced crashes while others didn't—so this might be quite a tricky issue. Moreover, chained PCH doesn't seem to have been widely used, and related test cases might be rather scarce.

Test sources:

[test.zip](https://github.com/user-attachments/files/19260652/test.zip)
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to