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 <aga...@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 <aga...@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 <aga...@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) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits