Skip to content

[Clang] [Serialization] Crash when the number of chained PCHs exceeds 6 #131448

Closed
@16bit-ykiko

Description

@16bit-ykiko

I am trying to use 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.

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

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, 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    clang:PCHPrecompiled headersclang:modulesC++20 modules and Clang Header ModulescrashPrefer [crash-on-valid] or [crash-on-invalid]

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions