[clang-tools-extra] aa99026 - [NFC] [clangd] [Modules] Logging more if compilation failed
Chuanqi Xu via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 10 20:18:56 PDT 2025
Author: Chuanqi Xu
Date: 2025-07-11T11:18:21+08:00
New Revision: aa9902691db5cbb9db77270902f615f3c0877deb
URL: https://github.com/llvm/llvm-project/commit/aa9902691db5cbb9db77270902f615f3c0877deb
DIFF: https://github.com/llvm/llvm-project/commit/aa9902691db5cbb9db77270902f615f3c0877deb.diff
LOG: [NFC] [clangd] [Modules] Logging more if compilation failed
Coming from internal using experience.
The original log is just confusing... Users can't understand it unless
he reads the code.
This patch tries to make this more understandable.
Note that the mentioned module files in the logs might be removed
intentionally. We need another option to allow users to remain these
module files. Let's done this in another patch.
Added:
Modified:
clang-tools-extra/clangd/ModulesBuilder.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/ModulesBuilder.cpp b/clang-tools-extra/clangd/ModulesBuilder.cpp
index d88aa01aad05d..6658111d6c7b4 100644
--- a/clang-tools-extra/clangd/ModulesBuilder.cpp
+++ b/clang-tools-extra/clangd/ModulesBuilder.cpp
@@ -160,6 +160,16 @@ class ReusablePrerequisiteModules : public PrerequisiteModules {
RequiredModule->getModuleFilePath().str());
}
+ std::string getAsString() const {
+ std::string Result;
+ llvm::raw_string_ostream OS(Result);
+ for (const auto &ModuleFile : RequiredModules) {
+ OS << "-fmodule-file=" << ModuleFile->getModuleName() << "="
+ << ModuleFile->getModuleFilePath() << " ";
+ }
+ return Result;
+ }
+
bool canReuse(const CompilerInvocation &CI,
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>) const override;
@@ -296,8 +306,27 @@ buildModuleFile(llvm::StringRef ModuleName, PathRef ModuleUnitFileName,
GenerateReducedModuleInterfaceAction Action;
Clang->ExecuteAction(Action);
- if (Clang->getDiagnostics().hasErrorOccurred())
- return llvm::createStringError("Compilation failed");
+ if (Clang->getDiagnostics().hasErrorOccurred()) {
+ std::string Cmds;
+ for (const auto &Arg : Inputs.CompileCommand.CommandLine) {
+ if (!Cmds.empty())
+ Cmds += " ";
+ Cmds += Arg;
+ }
+
+ clangd::vlog("Failed to compile {0} with command: {1}.", ModuleUnitFileName,
+ Cmds);
+
+ std::string BuiltModuleFilesStr = BuiltModuleFiles.getAsString();
+ if (!BuiltModuleFilesStr.empty())
+ clangd::vlog("The actual used module files built by clangd is {0}",
+ BuiltModuleFilesStr);
+
+ return llvm::createStringError(
+ llvm::formatv("Failed to compile {0}. Use '--log=verbose' to view "
+ "detailed failure reasons.",
+ ModuleUnitFileName));
+ }
return ModuleFile{ModuleName, Inputs.CompileCommand.Output};
}
More information about the cfe-commits
mailing list