diff --git a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningService.h b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningService.h --- a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningService.h +++ b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningService.h @@ -40,12 +40,11 @@ Full, }; -/// The dependency scanning service contains the shared state that is used by -/// the invidual dependency scanning workers. +/// The dependency scanning service contains shared configuration and state that +/// is used by the individual dependency scanning workers. class DependencyScanningService { public: DependencyScanningService(ScanningMode Mode, ScanningOutputFormat Format, - bool ReuseFileManager = true, bool OptimizeArgs = false, bool EagerLoadModules = false); @@ -53,8 +52,6 @@ ScanningOutputFormat getFormat() const { return Format; } - bool canReuseFileManager() const { return ReuseFileManager; } - bool canOptimizeArgs() const { return OptimizeArgs; } bool shouldEagerLoadModules() const { return EagerLoadModules; } @@ -66,7 +63,6 @@ private: const ScanningMode Mode; const ScanningOutputFormat Format; - const bool ReuseFileManager; /// Whether to optimize the modules' command-line arguments. const bool OptimizeArgs; /// Whether to set up command-lines to load PCM files eagerly. diff --git a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h --- a/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h +++ b/clang/include/clang/Tooling/DependencyScanning/DependencyScanningWorker.h @@ -100,9 +100,6 @@ /// dependencies. This filesystem persists across multiple compiler /// invocations. llvm::IntrusiveRefCntPtr DepFS; - /// The file manager that is reused across multiple invocations by this - /// worker. If null, the file manager will not be reused. - llvm::IntrusiveRefCntPtr Files; ScanningOutputFormat Format; /// Whether to optimize the modules' command-line arguments. bool OptimizeArgs; diff --git a/clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp b/clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp --- a/clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningService.cpp @@ -14,10 +14,10 @@ using namespace dependencies; DependencyScanningService::DependencyScanningService( - ScanningMode Mode, ScanningOutputFormat Format, bool ReuseFileManager, - bool OptimizeArgs, bool EagerLoadModules) - : Mode(Mode), Format(Format), ReuseFileManager(ReuseFileManager), - OptimizeArgs(OptimizeArgs), EagerLoadModules(EagerLoadModules) { + ScanningMode Mode, ScanningOutputFormat Format, bool OptimizeArgs, + bool EagerLoadModules) + : Mode(Mode), Format(Format), OptimizeArgs(OptimizeArgs), + 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 --- a/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp +++ b/clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp @@ -270,8 +270,6 @@ Action = std::make_unique(); const bool Result = ScanInstance.ExecuteAction(*Action); - if (!DepFS) - FileMgr->clearStatCache(); if (Result) setLastCC1Arguments(std::move(OriginalInvocation)); @@ -336,8 +334,6 @@ if (Service.getMode() == ScanningMode::DependencyDirectivesScan) DepFS = new DependencyScanningWorkerFilesystem(Service.getSharedCache(), RealFS); - if (Service.canReuseFileManager()) - Files = new FileManager(FileSystemOptions(), RealFS); } llvm::Error DependencyScanningWorker::computeDependencies( @@ -398,11 +394,9 @@ llvm::Optional ModuleName) { // Reset what might have been modified in the previous worker invocation. RealFS->setCurrentWorkingDirectory(WorkingDirectory); - if (Files) - Files->setVirtualFileSystem(RealFS); - llvm::IntrusiveRefCntPtr CurrentFiles = - Files ? Files : new FileManager(FileSystemOptions(), RealFS); + auto FileMgr = + llvm::makeIntrusiveRefCnt(FileSystemOptions(), RealFS); Optional> ModifiedCommandLine; if (ModuleName) { @@ -426,7 +420,7 @@ // Although `Diagnostics` are used only for command-line parsing, the // custom `DiagConsumer` might expect a `SourceManager` to be present. - SourceManager SrcMgr(*Diags, *CurrentFiles); + SourceManager SrcMgr(*Diags, *FileMgr); Diags->setSourceManager(&SrcMgr); // DisableFree is modified by Tooling for running // in-process; preserve the original value, which is @@ -436,7 +430,7 @@ OptimizeArgs, EagerLoadModules, DisableFree, ModuleName); bool Success = forEachDriverJob( - FinalCommandLine, *Diags, *CurrentFiles, [&](const driver::Command &Cmd) { + FinalCommandLine, *Diags, *FileMgr, [&](const driver::Command &Cmd) { if (StringRef(Cmd.getCreator().getName()) != "clang") { // Non-clang command. Just pass through to the dependency // consumer. @@ -455,7 +449,7 @@ // system to ensure that any file system requests that // are made by the driver do not go through the // dependency scanning filesystem. - ToolInvocation Invocation(std::move(Argv), &Action, &*CurrentFiles, + ToolInvocation Invocation(std::move(Argv), &Action, &*FileMgr, PCHContainerOps); Invocation.setDiagnosticConsumer(Diags->getClient()); Invocation.setDiagnosticOptions(&Diags->getDiagnosticOptions()); diff --git a/clang/test/ClangScanDeps/modulemap-via-vfs.m b/clang/test/ClangScanDeps/modulemap-via-vfs.m --- a/clang/test/ClangScanDeps/modulemap-via-vfs.m +++ b/clang/test/ClangScanDeps/modulemap-via-vfs.m @@ -3,8 +3,7 @@ // RUN: sed -e "s|DIR|%/t.dir|g" %t.dir/build/compile-commands.json.in > %t.dir/build/compile-commands.json // RUN: sed -e "s|DIR|%/t.dir|g" %t.dir/build/vfs.yaml.in > %t.dir/build/vfs.yaml // RUN: clang-scan-deps -compilation-database %t.dir/build/compile-commands.json \ -// RUN: -reuse-filemanager=0 -j 1 -format experimental-full \ -// RUN: -mode preprocess-dependency-directives > %t.db +// RUN: -j 1 -format experimental-full -mode preprocess-dependency-directives > %t.db // RUN: %deps-to-rsp %t.db --module-name=A > %t.A.cc1.rsp // RUN: cat %t.A.cc1.rsp | sed 's:\\\\\?:/:g' | FileCheck %s diff --git a/clang/test/ClangScanDeps/subframework_header_dir_symlink.m b/clang/test/ClangScanDeps/subframework_header_dir_symlink.m --- a/clang/test/ClangScanDeps/subframework_header_dir_symlink.m +++ b/clang/test/ClangScanDeps/subframework_header_dir_symlink.m @@ -8,10 +8,7 @@ // RUN: cp -R %S/Inputs/frameworks %t.dir/Inputs/frameworks // RUN: ln -s %t.dir/Inputs/frameworks %t.dir/Inputs/frameworks_symlink // RUN: sed -e "s|DIR|%/t.dir|g" %S/Inputs/subframework_header_dir_symlink_cdb.json > %t.cdb -// RUN: clang-scan-deps -compilation-database %t.cdb -j 1 -reuse-filemanager=0 | \ -// RUN: FileCheck %s -// RUN: clang-scan-deps -compilation-database %t.cdb -j 1 -reuse-filemanager=1 | \ -// RUN: FileCheck %s +// RUN: clang-scan-deps -compilation-database %t.cdb -j 1 | FileCheck %s #ifndef EMPTY #include "Framework/Framework.h" diff --git a/clang/test/ClangScanDeps/symlink.cpp b/clang/test/ClangScanDeps/symlink.cpp --- a/clang/test/ClangScanDeps/symlink.cpp +++ b/clang/test/ClangScanDeps/symlink.cpp @@ -8,8 +8,7 @@ // RUN: cp %S/Inputs/header.h %t.dir/Inputs/header.h // RUN: ln -s %t.dir/Inputs/header.h %t.dir/Inputs/symlink.h // RUN: sed -e "s|DIR|%/t.dir|g" %S/Inputs/symlink_cdb.json > %t.cdb -// RUN: clang-scan-deps -compilation-database %t.cdb -j 1 -reuse-filemanager=0 | FileCheck %s -// RUN: clang-scan-deps -compilation-database %t.cdb -j 1 -reuse-filemanager=1 | FileCheck %s +// RUN: clang-scan-deps -compilation-database %t.cdb -j 1 | FileCheck %s #include "symlink.h" #include "header.h" diff --git a/clang/tools/clang-scan-deps/ClangScanDeps.cpp b/clang/tools/clang-scan-deps/ClangScanDeps.cpp --- a/clang/tools/clang-scan-deps/ClangScanDeps.cpp +++ b/clang/tools/clang-scan-deps/ClangScanDeps.cpp @@ -167,11 +167,6 @@ llvm::cl::desc("Compilation database"), llvm::cl::Required, llvm::cl::cat(DependencyScannerCategory)); -llvm::cl::opt ReuseFileManager( - "reuse-filemanager", - llvm::cl::desc("Reuse the file manager and its cache between invocations."), - llvm::cl::init(true), llvm::cl::cat(DependencyScannerCategory)); - llvm::cl::opt ModuleName( "module-name", llvm::cl::Optional, llvm::cl::desc("the module of which the dependencies are to be computed"), @@ -529,8 +524,8 @@ // Print out the dependency results to STDOUT by default. SharedStream DependencyOS(llvm::outs()); - DependencyScanningService Service(ScanMode, Format, ReuseFileManager, - OptimizeArgs, EagerLoadModules); + DependencyScanningService Service(ScanMode, Format, OptimizeArgs, + EagerLoadModules); llvm::ThreadPool Pool(llvm::hardware_concurrency(NumThreads)); std::vector> WorkerTools; for (unsigned I = 0; I < Pool.getThreadCount(); ++I)