[clang] [clang-scan-deps] Fix contention when updating `TrackingStatistic`s in hot code paths in `FileManager`. (PR #88427)
Alexandre Ganea via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 24 09:33:01 PDT 2024
https://github.com/aganea updated https://github.com/llvm/llvm-project/pull/88427
>From 1b11d526e2cde1df64c7c4e05b2698b6d40926c3 Mon Sep 17 00:00:00 2001
From: Alexandre Ganea <aganea at havenstudios.com>
Date: Thu, 11 Apr 2024 13:02:30 -0400
Subject: [PATCH 1/3] [clang-scan-deps] Fix atomic contention when updating
`TrackingStatistic`s in hot code paths in `FileManager`.
---
clang/include/clang/Basic/FileManager.h | 6 ++++-
.../DependencyScanningService.h | 6 ++++-
.../DependencyScanningWorker.h | 2 ++
clang/lib/Basic/FileManager.cpp | 23 ++++++++++++-------
clang/lib/Frontend/CompilerInstance.cpp | 3 ++-
.../DependencyScanningService.cpp | 4 ++--
.../DependencyScanningWorker.cpp | 6 +++--
clang/tools/clang-scan-deps/ClangScanDeps.cpp | 2 +-
8 files changed, 36 insertions(+), 16 deletions(-)
diff --git a/clang/include/clang/Basic/FileManager.h b/clang/include/clang/Basic/FileManager.h
index 2245fd78bfc9f0..24256a7368ccc8 100644
--- a/clang/include/clang/Basic/FileManager.h
+++ b/clang/include/clang/Basic/FileManager.h
@@ -114,6 +114,9 @@ class FileManager : public RefCountedBase<FileManager> {
///
unsigned NextFileUID;
+ /// Whether we want to print statistics. This impacts the collection of data.
+ bool EnablePrintStats;
+
// Caching.
std::unique_ptr<FileSystemStatCache> StatCache;
@@ -134,7 +137,8 @@ class FileManager : public RefCountedBase<FileManager> {
/// \param FS if non-null, the VFS to use. Otherwise uses
/// llvm::vfs::getRealFileSystem().
FileManager(const FileSystemOptions &FileSystemOpts,
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS = nullptr);
+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS = nullptr,
+ bool PrintStats = false);
~FileManager();
/// Installs the provided FileSystemStatCache object within
diff --git a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningService.h b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningService.h
index 557f0e547ab4a8..7b869bb7976f2a 100644
--- a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningService.h
+++ b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningService.h
@@ -76,7 +76,7 @@ class DependencyScanningService {
DependencyScanningService(
ScanningMode Mode, ScanningOutputFormat Format,
ScanningOptimizations OptimizeArgs = ScanningOptimizations::Default,
- bool EagerLoadModules = false);
+ bool EagerLoadModules = false, bool PrintStats = false);
ScanningMode getMode() const { return Mode; }
@@ -90,6 +90,8 @@ class DependencyScanningService {
return SharedCache;
}
+ bool getPrintStats() const { return PrintStats; }
+
private:
const ScanningMode Mode;
const ScanningOutputFormat Format;
@@ -97,6 +99,8 @@ class DependencyScanningService {
const ScanningOptimizations OptimizeArgs;
/// Whether to set up command-lines to load PCM files eagerly.
const bool EagerLoadModules;
+ /// Whether we should collect statistics during execution.
+ const bool PrintStats;
/// The global file system cache.
DependencyScanningFilesystemSharedCache SharedCache;
};
diff --git a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h
index 0f607862194b31..27b96c964ce83d 100644
--- a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h
+++ b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h
@@ -119,6 +119,8 @@ class DependencyScanningWorker {
ScanningOptimizations OptimizeArgs;
/// Whether to set up command-lines to load PCM files eagerly.
bool EagerLoadModules;
+ /// Whether we should collect statistics during execution.
+ bool PrintStats;
};
} // end namespace dependencies
diff --git a/clang/lib/Basic/FileManager.cpp b/clang/lib/Basic/FileManager.cpp
index cd520a6375e07e..1071f6ae53dd78 100644
--- a/clang/lib/Basic/FileManager.cpp
+++ b/clang/lib/Basic/FileManager.cpp
@@ -50,9 +50,10 @@ ALWAYS_ENABLED_STATISTIC(NumFileCacheMisses, "Number of file cache misses.");
//===----------------------------------------------------------------------===//
FileManager::FileManager(const FileSystemOptions &FSO,
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS)
+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS,
+ bool PrintStats)
: FS(std::move(FS)), FileSystemOpts(FSO), SeenDirEntries(64),
- SeenFileEntries(64), NextFileUID(0) {
+ SeenFileEntries(64), NextFileUID(0), EnablePrintStats(PrintStats) {
// If the caller doesn't provide a virtual file system, just grab the real
// file system.
if (!this->FS)
@@ -134,7 +135,8 @@ FileManager::getDirectoryRef(StringRef DirName, bool CacheFailure) {
}
}
- ++NumDirLookups;
+ if (EnablePrintStats)
+ ++NumDirLookups;
// See if there was already an entry in the map. Note that the map
// contains both virtual and real directories.
@@ -147,7 +149,8 @@ FileManager::getDirectoryRef(StringRef DirName, bool CacheFailure) {
}
// We've not seen this before. Fill it in.
- ++NumDirCacheMisses;
+ if (EnablePrintStats)
+ ++NumDirCacheMisses;
auto &NamedDirEnt = *SeenDirInsertResult.first;
assert(!NamedDirEnt.second && "should be newly-created");
@@ -202,7 +205,8 @@ FileManager::getFile(StringRef Filename, bool openFile, bool CacheFailure) {
llvm::Expected<FileEntryRef>
FileManager::getFileRef(StringRef Filename, bool openFile, bool CacheFailure) {
- ++NumFileLookups;
+ if (EnablePrintStats)
+ ++NumFileLookups;
// See if there is already an entry in the map.
auto SeenFileInsertResult =
@@ -215,7 +219,8 @@ FileManager::getFileRef(StringRef Filename, bool openFile, bool CacheFailure) {
}
// We've not seen this before. Fill it in.
- ++NumFileCacheMisses;
+ if (EnablePrintStats)
+ ++NumFileCacheMisses;
auto *NamedFileEnt = &*SeenFileInsertResult.first;
assert(!NamedFileEnt->second && "should be newly-created");
@@ -377,7 +382,8 @@ const FileEntry *FileManager::getVirtualFile(StringRef Filename, off_t Size,
FileEntryRef FileManager::getVirtualFileRef(StringRef Filename, off_t Size,
time_t ModificationTime) {
- ++NumFileLookups;
+ if (EnablePrintStats)
+ ++NumFileLookups;
// See if there is already an entry in the map for an existing file.
auto &NamedFileEnt = *SeenFileEntries.insert(
@@ -390,7 +396,8 @@ FileEntryRef FileManager::getVirtualFileRef(StringRef Filename, off_t Size,
}
// We've not seen this before, or the file is cached as non-existent.
- ++NumFileCacheMisses;
+ if (EnablePrintStats)
+ ++NumFileCacheMisses;
addAncestorsAsVirtualDirs(Filename);
FileEntry *UFE = nullptr;
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index 6e3baf83864415..d29bc92a953d66 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -381,7 +381,8 @@ FileManager *CompilerInstance::createFileManager(
: createVFSFromCompilerInvocation(getInvocation(),
getDiagnostics());
assert(VFS && "FileManager has no VFS?");
- FileMgr = new FileManager(getFileSystemOpts(), std::move(VFS));
+ FileMgr = new FileManager(getFileSystemOpts(), std::move(VFS),
+ getFrontendOpts().ShowStats);
return FileMgr.get();
}
diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp
index 7458ef484b16c4..584066df85aa66 100644
--- a/clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp
+++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp
@@ -15,9 +15,9 @@ using namespace dependencies;
DependencyScanningService::DependencyScanningService(
ScanningMode Mode, ScanningOutputFormat Format,
- ScanningOptimizations OptimizeArgs, bool EagerLoadModules)
+ ScanningOptimizations OptimizeArgs, bool EagerLoadModules, bool PrintStats)
: Mode(Mode), Format(Format), OptimizeArgs(OptimizeArgs),
- EagerLoadModules(EagerLoadModules) {
+ EagerLoadModules(EagerLoadModules), PrintStats(PrintStats) {
// Initialize targets for object file support.
llvm::InitializeAllTargets();
llvm::InitializeAllTargetMCs();
diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
index 32850f5eea92a9..a684ba9cf5ca0e 100644
--- a/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
+++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
@@ -501,6 +501,8 @@ DependencyScanningWorker::DependencyScanningWorker(
BaseFS = FS;
break;
}
+
+ PrintStats = Service.getPrintStats();
}
llvm::Error DependencyScanningWorker::computeDependencies(
@@ -623,8 +625,8 @@ bool DependencyScanningWorker::computeDependencies(
ModifiedCommandLine ? *ModifiedCommandLine : CommandLine;
auto &FinalFS = ModifiedFS ? ModifiedFS : BaseFS;
- auto FileMgr =
- llvm::makeIntrusiveRefCnt<FileManager>(FileSystemOptions{}, FinalFS);
+ auto FileMgr = llvm::makeIntrusiveRefCnt<FileManager>(FileSystemOptions{},
+ FinalFS, PrintStats);
std::vector<const char *> FinalCCommandLine(FinalCommandLine.size(), nullptr);
llvm::transform(FinalCommandLine, FinalCCommandLine.begin(),
diff --git a/clang/tools/clang-scan-deps/ClangScanDeps.cpp b/clang/tools/clang-scan-deps/ClangScanDeps.cpp
index eaa76dd43e41dd..bef96213cd6e54 100644
--- a/clang/tools/clang-scan-deps/ClangScanDeps.cpp
+++ b/clang/tools/clang-scan-deps/ClangScanDeps.cpp
@@ -973,7 +973,7 @@ int clang_scan_deps_main(int argc, char **argv, const llvm::ToolContext &) {
};
DependencyScanningService Service(ScanMode, Format, OptimizeArgs,
- EagerLoadModules);
+ EagerLoadModules, PrintTiming);
llvm::Timer T;
T.startTimer();
>From f9c5316225f6f017c7ee822d9a2feb02423b47e7 Mon Sep 17 00:00:00 2001
From: Alexandre Ganea <aganea at havenstudios.com>
Date: Wed, 17 Apr 2024 08:37:00 -0400
Subject: [PATCH 2/3] Revert some changes and make statistics members of the
FileManager
---
clang/include/clang/Basic/FileManager.h | 14 +++++---
.../DependencyScanningService.h | 6 +---
.../DependencyScanningWorker.h | 2 --
clang/lib/Basic/FileManager.cpp | 36 ++++++++-----------
clang/lib/Frontend/CompilerInstance.cpp | 7 ++--
.../DependencyScanningService.cpp | 4 +--
.../DependencyScanningWorker.cpp | 9 ++---
clang/tools/clang-scan-deps/ClangScanDeps.cpp | 2 +-
8 files changed, 39 insertions(+), 41 deletions(-)
diff --git a/clang/include/clang/Basic/FileManager.h b/clang/include/clang/Basic/FileManager.h
index 24256a7368ccc8..8b4206e52cd482 100644
--- a/clang/include/clang/Basic/FileManager.h
+++ b/clang/include/clang/Basic/FileManager.h
@@ -114,8 +114,11 @@ class FileManager : public RefCountedBase<FileManager> {
///
unsigned NextFileUID;
- /// Whether we want to print statistics. This impacts the collection of data.
- bool EnablePrintStats;
+ /// Statistics gathered during the lifetime of the FileManager.
+ unsigned NumDirLookups = 0;
+ unsigned NumFileLookups = 0;
+ unsigned NumDirCacheMisses = 0;
+ unsigned NumFileCacheMisses = 0;
// Caching.
std::unique_ptr<FileSystemStatCache> StatCache;
@@ -137,8 +140,7 @@ class FileManager : public RefCountedBase<FileManager> {
/// \param FS if non-null, the VFS to use. Otherwise uses
/// llvm::vfs::getRealFileSystem().
FileManager(const FileSystemOptions &FileSystemOpts,
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS = nullptr,
- bool PrintStats = false);
+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS = nullptr);
~FileManager();
/// Installs the provided FileSystemStatCache object within
@@ -345,6 +347,10 @@ class FileManager : public RefCountedBase<FileManager> {
public:
void PrintStats() const;
+
+ /// Import statistics from a child FileManager and add them to this current
+ /// FileManager.
+ void AddStats(const FileManager &Other);
};
} // end namespace clang
diff --git a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningService.h b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningService.h
index 7b869bb7976f2a..557f0e547ab4a8 100644
--- a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningService.h
+++ b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningService.h
@@ -76,7 +76,7 @@ class DependencyScanningService {
DependencyScanningService(
ScanningMode Mode, ScanningOutputFormat Format,
ScanningOptimizations OptimizeArgs = ScanningOptimizations::Default,
- bool EagerLoadModules = false, bool PrintStats = false);
+ bool EagerLoadModules = false);
ScanningMode getMode() const { return Mode; }
@@ -90,8 +90,6 @@ class DependencyScanningService {
return SharedCache;
}
- bool getPrintStats() const { return PrintStats; }
-
private:
const ScanningMode Mode;
const ScanningOutputFormat Format;
@@ -99,8 +97,6 @@ class DependencyScanningService {
const ScanningOptimizations OptimizeArgs;
/// Whether to set up command-lines to load PCM files eagerly.
const bool EagerLoadModules;
- /// Whether we should collect statistics during execution.
- const bool PrintStats;
/// The global file system cache.
DependencyScanningFilesystemSharedCache SharedCache;
};
diff --git a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h
index 27b96c964ce83d..0f607862194b31 100644
--- a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h
+++ b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h
@@ -119,8 +119,6 @@ class DependencyScanningWorker {
ScanningOptimizations OptimizeArgs;
/// Whether to set up command-lines to load PCM files eagerly.
bool EagerLoadModules;
- /// Whether we should collect statistics during execution.
- bool PrintStats;
};
} // end namespace dependencies
diff --git a/clang/lib/Basic/FileManager.cpp b/clang/lib/Basic/FileManager.cpp
index 1071f6ae53dd78..3486e59e826aaf 100644
--- a/clang/lib/Basic/FileManager.cpp
+++ b/clang/lib/Basic/FileManager.cpp
@@ -39,21 +39,14 @@ using namespace clang;
#define DEBUG_TYPE "file-search"
-ALWAYS_ENABLED_STATISTIC(NumDirLookups, "Number of directory lookups.");
-ALWAYS_ENABLED_STATISTIC(NumFileLookups, "Number of file lookups.");
-ALWAYS_ENABLED_STATISTIC(NumDirCacheMisses,
- "Number of directory cache misses.");
-ALWAYS_ENABLED_STATISTIC(NumFileCacheMisses, "Number of file cache misses.");
-
//===----------------------------------------------------------------------===//
// Common logic.
//===----------------------------------------------------------------------===//
FileManager::FileManager(const FileSystemOptions &FSO,
- IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS,
- bool PrintStats)
+ IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS)
: FS(std::move(FS)), FileSystemOpts(FSO), SeenDirEntries(64),
- SeenFileEntries(64), NextFileUID(0), EnablePrintStats(PrintStats) {
+ SeenFileEntries(64), NextFileUID(0) {
// If the caller doesn't provide a virtual file system, just grab the real
// file system.
if (!this->FS)
@@ -135,8 +128,7 @@ FileManager::getDirectoryRef(StringRef DirName, bool CacheFailure) {
}
}
- if (EnablePrintStats)
- ++NumDirLookups;
+ ++NumDirLookups;
// See if there was already an entry in the map. Note that the map
// contains both virtual and real directories.
@@ -149,8 +141,7 @@ FileManager::getDirectoryRef(StringRef DirName, bool CacheFailure) {
}
// We've not seen this before. Fill it in.
- if (EnablePrintStats)
- ++NumDirCacheMisses;
+ ++NumDirCacheMisses;
auto &NamedDirEnt = *SeenDirInsertResult.first;
assert(!NamedDirEnt.second && "should be newly-created");
@@ -205,8 +196,7 @@ FileManager::getFile(StringRef Filename, bool openFile, bool CacheFailure) {
llvm::Expected<FileEntryRef>
FileManager::getFileRef(StringRef Filename, bool openFile, bool CacheFailure) {
- if (EnablePrintStats)
- ++NumFileLookups;
+ ++NumFileLookups;
// See if there is already an entry in the map.
auto SeenFileInsertResult =
@@ -219,8 +209,7 @@ FileManager::getFileRef(StringRef Filename, bool openFile, bool CacheFailure) {
}
// We've not seen this before. Fill it in.
- if (EnablePrintStats)
- ++NumFileCacheMisses;
+ ++NumFileCacheMisses;
auto *NamedFileEnt = &*SeenFileInsertResult.first;
assert(!NamedFileEnt->second && "should be newly-created");
@@ -382,8 +371,7 @@ const FileEntry *FileManager::getVirtualFile(StringRef Filename, off_t Size,
FileEntryRef FileManager::getVirtualFileRef(StringRef Filename, off_t Size,
time_t ModificationTime) {
- if (EnablePrintStats)
- ++NumFileLookups;
+ ++NumFileLookups;
// See if there is already an entry in the map for an existing file.
auto &NamedFileEnt = *SeenFileEntries.insert(
@@ -396,8 +384,7 @@ FileEntryRef FileManager::getVirtualFileRef(StringRef Filename, off_t Size,
}
// We've not seen this before, or the file is cached as non-existent.
- if (EnablePrintStats)
- ++NumFileCacheMisses;
+ ++NumFileCacheMisses;
addAncestorsAsVirtualDirs(Filename);
FileEntry *UFE = nullptr;
@@ -663,6 +650,13 @@ StringRef FileManager::getCanonicalName(const void *Entry, StringRef Name) {
return CanonicalName;
}
+void FileManager::AddStats(const FileManager &Other) {
+ NumDirLookups += Other.NumDirLookups;
+ NumFileLookups += Other.NumFileLookups;
+ NumDirCacheMisses += Other.NumDirCacheMisses;
+ NumFileCacheMisses += Other.NumFileCacheMisses;
+}
+
void FileManager::PrintStats() const {
llvm::errs() << "\n*** File Manager Stats:\n";
llvm::errs() << UniqueRealFiles.size() << " real files found, "
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index d29bc92a953d66..e567086dce1e5f 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -381,8 +381,7 @@ FileManager *CompilerInstance::createFileManager(
: createVFSFromCompilerInvocation(getInvocation(),
getDiagnostics());
assert(VFS && "FileManager has no VFS?");
- FileMgr = new FileManager(getFileSystemOpts(), std::move(VFS),
- getFrontendOpts().ShowStats);
+ FileMgr = new FileManager(getFileSystemOpts(), std::move(VFS));
return FileMgr.get();
}
@@ -1294,6 +1293,10 @@ compileModuleImpl(CompilerInstance &ImportingInstance, SourceLocation ImportLoc,
diag::remark_module_build_done)
<< ModuleName;
+ // Propagate the statistics to the parent FileManager.
+ if (FrontendOpts.ModulesShareFileManager)
+ ImportingInstance.getFileManager().AddStats(Instance.getFileManager());
+
if (Crashed) {
// Clear the ASTConsumer if it hasn't been already, in case it owns streams
// that must be closed before clearing output files.
diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp
index 584066df85aa66..7458ef484b16c4 100644
--- a/clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp
+++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp
@@ -15,9 +15,9 @@ using namespace dependencies;
DependencyScanningService::DependencyScanningService(
ScanningMode Mode, ScanningOutputFormat Format,
- ScanningOptimizations OptimizeArgs, bool EagerLoadModules, bool PrintStats)
+ ScanningOptimizations OptimizeArgs, bool EagerLoadModules)
: Mode(Mode), Format(Format), OptimizeArgs(OptimizeArgs),
- EagerLoadModules(EagerLoadModules), PrintStats(PrintStats) {
+ EagerLoadModules(EagerLoadModules) {
// Initialize targets for object file support.
llvm::InitializeAllTargets();
llvm::InitializeAllTargetMCs();
diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
index a684ba9cf5ca0e..0c047b6c5da2f8 100644
--- a/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
+++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp
@@ -439,6 +439,9 @@ class DependencyScanningAction : public tooling::ToolAction {
if (Result)
setLastCC1Arguments(std::move(OriginalInvocation));
+ // Propagate the statistics to the parent FileManager.
+ DriverFileMgr->AddStats(ScanInstance.getFileManager());
+
return Result;
}
@@ -501,8 +504,6 @@ DependencyScanningWorker::DependencyScanningWorker(
BaseFS = FS;
break;
}
-
- PrintStats = Service.getPrintStats();
}
llvm::Error DependencyScanningWorker::computeDependencies(
@@ -625,8 +626,8 @@ bool DependencyScanningWorker::computeDependencies(
ModifiedCommandLine ? *ModifiedCommandLine : CommandLine;
auto &FinalFS = ModifiedFS ? ModifiedFS : BaseFS;
- auto FileMgr = llvm::makeIntrusiveRefCnt<FileManager>(FileSystemOptions{},
- FinalFS, PrintStats);
+ auto FileMgr =
+ llvm::makeIntrusiveRefCnt<FileManager>(FileSystemOptions{}, FinalFS);
std::vector<const char *> FinalCCommandLine(FinalCommandLine.size(), nullptr);
llvm::transform(FinalCommandLine, FinalCCommandLine.begin(),
diff --git a/clang/tools/clang-scan-deps/ClangScanDeps.cpp b/clang/tools/clang-scan-deps/ClangScanDeps.cpp
index bef96213cd6e54..eaa76dd43e41dd 100644
--- a/clang/tools/clang-scan-deps/ClangScanDeps.cpp
+++ b/clang/tools/clang-scan-deps/ClangScanDeps.cpp
@@ -973,7 +973,7 @@ int clang_scan_deps_main(int argc, char **argv, const llvm::ToolContext &) {
};
DependencyScanningService Service(ScanMode, Format, OptimizeArgs,
- EagerLoadModules, PrintTiming);
+ EagerLoadModules);
llvm::Timer T;
T.startTimer();
>From 183e149d28bfae18077e59b4e5932411f299521e Mon Sep 17 00:00:00 2001
From: Alexandre Ganea <aganea at havenstudios.com>
Date: Wed, 24 Apr 2024 12:32:43 -0400
Subject: [PATCH 3/3] Fix condition.
---
clang/lib/Basic/FileManager.cpp | 1 +
clang/lib/Frontend/CompilerInstance.cpp | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Basic/FileManager.cpp b/clang/lib/Basic/FileManager.cpp
index 3486e59e826aaf..143c04309d0753 100644
--- a/clang/lib/Basic/FileManager.cpp
+++ b/clang/lib/Basic/FileManager.cpp
@@ -651,6 +651,7 @@ StringRef FileManager::getCanonicalName(const void *Entry, StringRef Name) {
}
void FileManager::AddStats(const FileManager &Other) {
+ assert(&Other != this && "Collecting stats into the same FileManager");
NumDirLookups += Other.NumDirLookups;
NumFileLookups += Other.NumFileLookups;
NumDirCacheMisses += Other.NumDirCacheMisses;
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index e567086dce1e5f..66a45b888f15cc 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -1294,7 +1294,7 @@ compileModuleImpl(CompilerInstance &ImportingInstance, SourceLocation ImportLoc,
<< ModuleName;
// Propagate the statistics to the parent FileManager.
- if (FrontendOpts.ModulesShareFileManager)
+ if (!FrontendOpts.ModulesShareFileManager)
ImportingInstance.getFileManager().AddStats(Instance.getFileManager());
if (Crashed) {
More information about the cfe-commits
mailing list