kadircet created this revision. kadircet added a reviewer: adamcz. Herald added subscribers: usaxena95, arphaman. kadircet requested review of this revision. Herald added subscribers: cfe-commits, MaskRay, ilya-biryukov. Herald added a project: clang-tools-extra.
Clang would emit a fatal error when it encounters an unregistered PCH format. This change ensures clangd will always use raw format no matter what user specifies. As side effects: - serializing an AST in an unknown format might throw off build systems. I suppose this would only be an issue when build system and clangd are racing for same PCM modules, hopefully this should be rare and both clangd or the build system should recover on the next run. - whenever clang reads a serialized AST it seems to be checking for file signature and emitting non-fatal errors. so this should be fine again. The only other valid module format in clang is `obj` but it is part of codegen, i don't think it is worth the dependency. Hence chosing to not register it, at least yet. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D102418 Files: clang-tools-extra/clangd/Compiler.cpp clang-tools-extra/clangd/unittests/ModulesTests.cpp Index: clang-tools-extra/clangd/unittests/ModulesTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/ModulesTests.cpp +++ clang-tools-extra/clangd/unittests/ModulesTests.cpp @@ -92,6 +92,24 @@ TU.build(); } +// Unknown module formats are a fatal failure for clang. Ensure we don't crash. +TEST(Modules, UnknownFormat) { + TestTU TU = TestTU::withCode(R"(#include "modular.h")"); + TU.OverlayRealFileSystemForModules = true; + TU.ExtraArgs.push_back("-Xclang"); + TU.ExtraArgs.push_back("-fmodule-format=obj"); + TU.ExtraArgs.push_back("-fmodule-map-file=" + testPath("m.modulemap")); + TU.ExtraArgs.push_back("-fmodules"); + TU.ExtraArgs.push_back("-fimplicit-modules"); + TU.AdditionalFiles["modular.h"] = ""; + TU.AdditionalFiles["m.modulemap"] = R"modulemap( + module M { + header "modular.h" + })modulemap"; + + // Test that we do not crash. + TU.build(); +} } // namespace } // namespace clangd } // namespace clang Index: clang-tools-extra/clangd/Compiler.cpp =================================================================== --- clang-tools-extra/clangd/Compiler.cpp +++ clang-tools-extra/clangd/Compiler.cpp @@ -85,6 +85,11 @@ // Don't crash on `#pragma clang __debug parser_crash` CI->getPreprocessorOpts().DisablePragmaDebugCrash = true; + // Always default to raw container format as clangd doesn't registry any other + // and clang dies when faced with unknown formats. + CI->getHeaderSearchOpts().ModuleFormat = + PCHContainerOperations().getRawReader().getFormat().str(); + return CI; }
Index: clang-tools-extra/clangd/unittests/ModulesTests.cpp =================================================================== --- clang-tools-extra/clangd/unittests/ModulesTests.cpp +++ clang-tools-extra/clangd/unittests/ModulesTests.cpp @@ -92,6 +92,24 @@ TU.build(); } +// Unknown module formats are a fatal failure for clang. Ensure we don't crash. +TEST(Modules, UnknownFormat) { + TestTU TU = TestTU::withCode(R"(#include "modular.h")"); + TU.OverlayRealFileSystemForModules = true; + TU.ExtraArgs.push_back("-Xclang"); + TU.ExtraArgs.push_back("-fmodule-format=obj"); + TU.ExtraArgs.push_back("-fmodule-map-file=" + testPath("m.modulemap")); + TU.ExtraArgs.push_back("-fmodules"); + TU.ExtraArgs.push_back("-fimplicit-modules"); + TU.AdditionalFiles["modular.h"] = ""; + TU.AdditionalFiles["m.modulemap"] = R"modulemap( + module M { + header "modular.h" + })modulemap"; + + // Test that we do not crash. + TU.build(); +} } // namespace } // namespace clangd } // namespace clang Index: clang-tools-extra/clangd/Compiler.cpp =================================================================== --- clang-tools-extra/clangd/Compiler.cpp +++ clang-tools-extra/clangd/Compiler.cpp @@ -85,6 +85,11 @@ // Don't crash on `#pragma clang __debug parser_crash` CI->getPreprocessorOpts().DisablePragmaDebugCrash = true; + // Always default to raw container format as clangd doesn't registry any other + // and clang dies when faced with unknown formats. + CI->getHeaderSearchOpts().ModuleFormat = + PCHContainerOperations().getRawReader().getFormat().str(); + return CI; }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits