[clang] [NFC] [C++20] [Modules] [P1689] [Scanner] Don't use thread pool in P1689 per file mode (PR #84285)
Jan Svoboda via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 7 11:24:26 PST 2024
================
@@ -893,102 +889,118 @@ int clang_scan_deps_main(int argc, char **argv, const llvm::ToolContext &) {
if (Format == ScanningOutputFormat::Full)
FD.emplace(ModuleName.empty() ? Inputs.size() : 0);
- if (Verbose) {
- llvm::outs() << "Running clang-scan-deps on " << Inputs.size()
- << " files using " << Pool.getMaxConcurrency() << " workers\n";
- }
-
- llvm::Timer T;
- T.startTimer();
-
- for (unsigned I = 0; I < Pool.getMaxConcurrency(); ++I) {
- Pool.async([&, I]() {
- llvm::DenseSet<ModuleID> AlreadySeenModules;
- while (auto MaybeInputIndex = GetNextInputIndex()) {
- size_t LocalIndex = *MaybeInputIndex;
- const tooling::CompileCommand *Input = &Inputs[LocalIndex];
- std::string Filename = std::move(Input->Filename);
- std::string CWD = std::move(Input->Directory);
-
- std::optional<StringRef> MaybeModuleName;
- if (!ModuleName.empty())
- MaybeModuleName = ModuleName;
-
- std::string OutputDir(ModuleFilesDir);
- if (OutputDir.empty())
- OutputDir = getModuleCachePath(Input->CommandLine);
- auto LookupOutput = [&](const ModuleID &MID, ModuleOutputKind MOK) {
- return ::lookupModuleOutput(MID, MOK, OutputDir);
- };
-
- // Run the tool on it.
- if (Format == ScanningOutputFormat::Make) {
- auto MaybeFile =
- WorkerTools[I]->getDependencyFile(Input->CommandLine, CWD);
- if (handleMakeDependencyToolResult(Filename, MaybeFile, DependencyOS,
- Errs))
- HadErrors = true;
- } else if (Format == ScanningOutputFormat::P1689) {
- // It is useful to generate the make-format dependency output during
- // the scanning for P1689. Otherwise the users need to scan again for
- // it. We will generate the make-format dependency output if we find
- // `-MF` in the command lines.
- std::string MakeformatOutputPath;
- std::string MakeformatOutput;
-
- auto MaybeRule = WorkerTools[I]->getP1689ModuleDependencyFile(
- *Input, CWD, MakeformatOutput, MakeformatOutputPath);
-
- if (handleP1689DependencyToolResult(Filename, MaybeRule, PD, Errs))
- HadErrors = true;
+ std::vector<std::unique_ptr<DependencyScanningTool>> WorkerTools;
- if (!MakeformatOutputPath.empty() && !MakeformatOutput.empty() &&
- !HadErrors) {
- static std::mutex Lock;
- // With compilation database, we may open different files
- // concurrently or we may write the same file concurrently. So we
- // use a map here to allow multiple compile commands to write to the
- // same file. Also we need a lock here to avoid data race.
- static llvm::StringMap<llvm::raw_fd_ostream> OSs;
- std::unique_lock<std::mutex> LockGuard(Lock);
-
- auto OSIter = OSs.find(MakeformatOutputPath);
- if (OSIter == OSs.end()) {
- std::error_code EC;
- OSIter = OSs.try_emplace(MakeformatOutputPath,
- MakeformatOutputPath, EC)
- .first;
- if (EC)
- llvm::errs()
- << "Failed to open P1689 make format output file \""
- << MakeformatOutputPath << "\" for " << EC.message()
- << "\n";
- }
+ auto ScanningTask = [&](unsigned I) {
----------------
jansvoboda11 wrote:
IIUC `I` is only used to index into `WorkerTools`. Could we just directly take `WorkerTools &`? Makes this a bit clearer IMO - for a second I thought `I` is an input index.
https://github.com/llvm/llvm-project/pull/84285
More information about the cfe-commits
mailing list