Skip to content

Commit 2836060

Browse files
Merge pull request #81720 from cachemeifyoucan/eng/PR-release-148752988-151339073-151395300
[6.2][Caching] Swift Caching Dependency Scanning Improvements
2 parents bc7e953 + db85088 commit 2836060

27 files changed

+293
-599
lines changed

include/swift/AST/DiagnosticsFrontend.def

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,7 +520,7 @@ REMARK(matching_output_produced,none,
520520

521521
// Caching related diagnostics
522522
ERROR(error_caching_no_cas_fs, none,
523-
"caching is enabled without -cas-fs option, input is not immutable", ())
523+
"caching is enabled without CAS file-system options, input is not immutable", ())
524524
ERROR(error_prefix_mapping, none, "cannot create scanner prefix mapping: '%0'", (StringRef))
525525

526526
REMARK(replay_output, none, "replay output file '%0': key '%1'", (StringRef, StringRef))
@@ -534,6 +534,7 @@ ERROR(error_cache_key_creation, none, "cannot create cache key for compilation %
534534
ERROR(error_cas_file_ref, none, "cannot load file %0 from CAS filesystem", (StringRef))
535535
ERROR(error_cas_conflict_options, none, "cannot setup CAS due to conflicting '-cas-*' options", ())
536536
ERROR(error_cas_initialization, none, "CAS cannot be initialized from the specified '-cas-*' options: %0", (StringRef))
537+
ERROR(error_cas_malformed_input, none, "CAS input '%0' is malformed: %1", (StringRef, StringRef))
537538
WARNING(cache_replay_failed, none, "cache replay failed: %0", (StringRef))
538539

539540
ERROR(error_failed_cached_diag, none, "failed to serialize cached diagnostics: %0", (StringRef))

include/swift/AST/ModuleDependencies.h

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,7 +1005,7 @@ using ModuleDependenciesKindMap =
10051005
/// Track swift dependency
10061006
class SwiftDependencyTracker {
10071007
public:
1008-
SwiftDependencyTracker(llvm::cas::CachingOnDiskFileSystem &FS,
1008+
SwiftDependencyTracker(std::shared_ptr<llvm::cas::ObjectStore> CAS,
10091009
llvm::PrefixMapper *Mapper,
10101010
const CompilerInvocation &CI);
10111011

@@ -1014,7 +1014,8 @@ class SwiftDependencyTracker {
10141014
llvm::Expected<llvm::cas::ObjectProxy> createTreeFromDependencies();
10151015

10161016
private:
1017-
llvm::IntrusiveRefCntPtr<llvm::cas::CachingOnDiskFileSystem> FS;
1017+
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> FS;
1018+
std::shared_ptr<llvm::cas::ObjectStore> CAS;
10181019
llvm::PrefixMapper *Mapper;
10191020

10201021
struct FileEntry {
@@ -1040,10 +1041,7 @@ class SwiftDependencyScanningService {
10401041
ClangScanningService;
10411042

10421043
/// CachingOnDiskFileSystem for dependency tracking.
1043-
llvm::IntrusiveRefCntPtr<llvm::cas::CachingOnDiskFileSystem> CacheFS;
1044-
1045-
/// If use clang include tree.
1046-
bool UseClangIncludeTree = false;
1044+
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> CacheFS;
10471045

10481046
/// CAS Instance.
10491047
std::shared_ptr<llvm::cas::ObjectStore> CAS;
@@ -1081,8 +1079,8 @@ class SwiftDependencyScanningService {
10811079
return *SharedFilesystemCache;
10821080
}
10831081

1084-
llvm::cas::CachingOnDiskFileSystem &getSharedCachingFS() const {
1085-
assert(CacheFS && "Expect CachingOnDiskFileSystem");
1082+
llvm::vfs::FileSystem &getSharedCachingFS() const {
1083+
assert(CacheFS && "Expect a CASFileSystem");
10861084
return *CacheFS;
10871085
}
10881086

@@ -1093,20 +1091,17 @@ class SwiftDependencyScanningService {
10931091

10941092
std::optional<SwiftDependencyTracker>
10951093
createSwiftDependencyTracker(const CompilerInvocation &CI) {
1096-
if (!CacheFS)
1094+
if (!CAS)
10971095
return std::nullopt;
10981096

1099-
return SwiftDependencyTracker(*CacheFS, Mapper.get(), CI);
1097+
return SwiftDependencyTracker(CAS, Mapper.get(), CI);
11001098
}
11011099

11021100
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> getClangScanningFS() const {
1103-
if (UseClangIncludeTree)
1101+
if (CAS)
11041102
return llvm::cas::createCASProvidingFileSystem(
11051103
CAS, llvm::vfs::createPhysicalFileSystem());
11061104

1107-
if (CacheFS)
1108-
return CacheFS->createProxyFS();
1109-
11101105
return llvm::vfs::createPhysicalFileSystem();
11111106
}
11121107

include/swift/Basic/CASOptions.h

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,11 @@ class CASOptions final {
3737
/// CASOptions
3838
clang::CASOptions CASOpts;
3939

40-
/// CASFS Root.
41-
std::vector<std::string> CASFSRootIDs;
42-
4340
/// Clang Include Trees.
44-
std::vector<std::string> ClangIncludeTrees;
41+
std::string ClangIncludeTree;
4542

4643
/// Clang Include Tree FileList.
47-
std::vector<std::string> ClangIncludeTreeFileList;
44+
std::string ClangIncludeTreeFileList;
4845

4946
/// CacheKey for input file.
5047
std::string InputFileKey;
@@ -62,9 +59,8 @@ class CASOptions final {
6259
/// Check to see if a CASFileSystem is required.
6360
bool requireCASFS() const {
6461
return EnableCaching &&
65-
(!CASFSRootIDs.empty() || !ClangIncludeTrees.empty() ||
66-
!ClangIncludeTreeFileList.empty() || !InputFileKey.empty() ||
67-
!BridgingHeaderPCHCacheKey.empty());
62+
(!ClangIncludeTree.empty() || !ClangIncludeTreeFileList.empty() ||
63+
!InputFileKey.empty() || !BridgingHeaderPCHCacheKey.empty());
6864
}
6965

7066
/// Return a hash code of any components from these options that should

include/swift/Basic/LangOptions.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,12 +1094,6 @@ namespace swift {
10941094
/// built and provided to the compiler invocation.
10951095
bool DisableImplicitClangModules = false;
10961096

1097-
/// Enable ClangIncludeTree for explicit module builds scanning.
1098-
bool UseClangIncludeTree = false;
1099-
1100-
/// Using ClangIncludeTreeRoot for compilation.
1101-
bool HasClangIncludeTreeRoot = false;
1102-
11031097
/// Whether the dependency scanner should construct all swift-frontend
11041098
/// invocations directly from clang cc1 args.
11051099
bool ClangImporterDirectCC1Scan = false;

include/swift/ClangImporter/ClangImporter.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -472,11 +472,6 @@ class ClangImporter final : public ClangModuleLoader {
472472
/// Reads the original source file name from PCH.
473473
std::string getOriginalSourceFile(StringRef PCHFilename);
474474

475-
/// Add clang dependency file names.
476-
///
477-
/// \param files The list of file to append dependencies to.
478-
void addClangInvovcationDependencies(std::vector<std::string> &files);
479-
480475
/// Makes a temporary replica of the ClangImporter's CompilerInstance, reads a
481476
/// module map into the replica and emits a PCM file for one of the modules it
482477
/// declares. Delegates to clang for everything except construction of the

include/swift/Frontend/CachingUtils.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ std::unique_ptr<llvm::MemoryBuffer> loadCachedCompileResultFromCacheKey(
7070
llvm::StringRef Filename = "");
7171

7272
llvm::Expected<llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>>
73-
createCASFileSystem(llvm::cas::ObjectStore &CAS, ArrayRef<std::string> FSRoots,
74-
ArrayRef<std::string> IncludeTreeRoots,
75-
ArrayRef<std::string> IncludeTreeFileList);
73+
createCASFileSystem(llvm::cas::ObjectStore &CAS,
74+
const std::string &IncludeTreeRoot,
75+
const std::string &IncludeTreeFileList);
7676

7777
std::vector<std::string> remapPathsFromCommandLine(
7878
ArrayRef<std::string> Args,

include/swift/Option/FrontendOptions.td

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,9 +1454,6 @@ def bridging_header_pch_key : Separate<["-"], "bridging-header-pch-key">,
14541454
def no_clang_include_tree: Flag<["-"], "no-clang-include-tree">,
14551455
HelpText<"Do not use clang include tree, fallback to use CAS filesystem to build clang modules">;
14561456

1457-
def cas_fs: Separate<["-"], "cas-fs">,
1458-
HelpText<"Root CASID for CAS FileSystem">, MetaVarName<"<cas-id>">;
1459-
14601457
def clang_include_tree_root: Separate<["-"], "clang-include-tree-root">,
14611458
HelpText<"Clang Include Tree CASID">, MetaVarName<"<cas-id>">;
14621459
def clang_include_tree_filelist: Separate<["-"], "clang-include-tree-filelist">,

lib/AST/ModuleDependencies.cpp

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
#include "swift/Strings.h"
2626
#include "clang/CAS/IncludeTree.h"
2727
#include "llvm/CAS/CASProvidingFileSystem.h"
28-
#include "llvm/CAS/CachingOnDiskFileSystem.h"
2928
#include "llvm/Config/config.h"
3029
#include "llvm/Support/FileSystem.h"
3130
#include "llvm/Support/Path.h"
@@ -602,13 +601,16 @@ swift::dependencies::registerBackDeployLibraries(
602601
}
603602

604603
SwiftDependencyTracker::SwiftDependencyTracker(
605-
llvm::cas::CachingOnDiskFileSystem &FS, llvm::PrefixMapper *Mapper,
604+
std::shared_ptr<llvm::cas::ObjectStore> CAS, llvm::PrefixMapper *Mapper,
606605
const CompilerInvocation &CI)
607-
: FS(FS.createProxyFS()), Mapper(Mapper) {
606+
: CAS(CAS), Mapper(Mapper) {
608607
auto &SearchPathOpts = CI.getSearchPathOptions();
609608

609+
FS = llvm::cas::createCASProvidingFileSystem(
610+
CAS, llvm::vfs::createPhysicalFileSystem());
611+
610612
auto addCommonFile = [&](StringRef path) {
611-
auto file = FS.openFileForRead(path);
613+
auto file = FS->openFileForRead(path);
612614
if (!file)
613615
return;
614616
auto status = (*file)->status();
@@ -679,7 +681,7 @@ SwiftDependencyTracker::createTreeFromDependencies() {
679681
llvm::SmallVector<clang::cas::IncludeTree::FileList::FileEntry> Files;
680682
for (auto &file : TrackedFiles) {
681683
auto includeTreeFile = clang::cas::IncludeTree::File::create(
682-
FS->getCAS(), file.first, file.second.FileRef);
684+
*CAS, file.first, file.second.FileRef);
683685
if (!includeTreeFile) {
684686
return llvm::createStringError("CASFS createTree failed for " +
685687
file.first + ": " +
@@ -691,7 +693,7 @@ SwiftDependencyTracker::createTreeFromDependencies() {
691693
}
692694

693695
auto includeTreeList =
694-
clang::cas::IncludeTree::FileList::create(FS->getCAS(), Files, {});
696+
clang::cas::IncludeTree::FileList::create(*CAS, Files, {});
695697
if (!includeTreeList)
696698
return llvm::createStringError("casfs include-tree filelist error: " +
697699
toString(includeTreeList.takeError()));
@@ -719,14 +721,8 @@ bool SwiftDependencyScanningService::setupCachingDependencyScanningService(
719721
CAS = Instance.getSharedCASInstance();
720722
ActionCache = Instance.getSharedCacheInstance();
721723

722-
auto CachingFS =
723-
llvm::cas::createCachingOnDiskFileSystem(Instance.getObjectStore());
724-
if (!CachingFS) {
725-
Instance.getDiags().diagnose(SourceLoc(), diag::error_cas_fs_creation,
726-
toString(CachingFS.takeError()));
727-
return true;
728-
}
729-
CacheFS = std::move(*CachingFS);
724+
CacheFS = llvm::cas::createCASProvidingFileSystem(
725+
CAS, llvm::vfs::createPhysicalFileSystem());
730726

731727
// Setup prefix mapping.
732728
auto &ScannerPrefixMapper =
@@ -744,19 +740,14 @@ bool SwiftDependencyScanningService::setupCachingDependencyScanningService(
744740
Mapper->sort();
745741
}
746742

747-
UseClangIncludeTree =
748-
Instance.getInvocation().getClangImporterOptions().UseClangIncludeTree;
749743
const clang::tooling::dependencies::ScanningOutputFormat ClangScanningFormat =
750-
UseClangIncludeTree
751-
? clang::tooling::dependencies::ScanningOutputFormat::FullIncludeTree
752-
: clang::tooling::dependencies::ScanningOutputFormat::FullTree;
744+
clang::tooling::dependencies::ScanningOutputFormat::FullIncludeTree;
753745

754746
ClangScanningService.emplace(
755747
clang::tooling::dependencies::ScanningMode::DependencyDirectivesScan,
756-
ClangScanningFormat,
757-
Instance.getInvocation().getCASOptions().CASOpts,
748+
ClangScanningFormat, Instance.getInvocation().getCASOptions().CASOpts,
758749
Instance.getSharedCASInstance(), Instance.getSharedCacheInstance(),
759-
UseClangIncludeTree ? nullptr : CacheFS,
750+
/*CachingOnDiskFileSystem=*/nullptr,
760751
// The current working directory optimization (off by default)
761752
// should not impact CAS. We set the optization to all to be
762753
// consistent with the non-CAS case.

lib/AST/PluginLoader.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ static StringRef pluginModuleNameStringFromPath(StringRef path) {
6464

6565
static llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>
6666
getPluginLoadingFS(ASTContext &Ctx) {
67-
// If there is a clang include tree FS, using real file system to load plugin
67+
// If there is an immutable file system, using real file system to load plugin
6868
// as the FS in SourceMgr doesn't support directory iterator.
69-
if (Ctx.ClangImporterOpts.HasClangIncludeTreeRoot)
69+
if (Ctx.CASOpts.HasImmutableFileSystem)
7070
return llvm::vfs::getRealFileSystem();
7171
return Ctx.SourceMgr.getFileSystem();
7272
}

lib/ClangImporter/ClangImporter.cpp

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
#include "clang/Serialization/ASTReader.h"
9191
#include "clang/Serialization/ASTWriter.h"
9292
#include "clang/Serialization/ObjectFilePCHContainerReader.h"
93+
#include "clang/Tooling/DependencyScanning/ModuleDepCollector.h"
9394
#include "clang/Tooling/DependencyScanning/ScanAndUpdateArgs.h"
9495
#include "llvm/ADT/IntrusiveRefCntPtr.h"
9596
#include "llvm/ADT/STLExtras.h"
@@ -1062,27 +1063,6 @@ std::string ClangImporter::getOriginalSourceFile(StringRef PCHFilename) {
10621063
Impl.Instance->getPCHContainerReader(), Impl.Instance->getDiagnostics());
10631064
}
10641065

1065-
void ClangImporter::addClangInvovcationDependencies(
1066-
std::vector<std::string> &files) {
1067-
auto addFiles = [&files](const auto &F) {
1068-
files.insert(files.end(), F.begin(), F.end());
1069-
};
1070-
auto &invocation = *Impl.Invocation;
1071-
// FIXME: Add file dependencies that are not accounted. The long term solution
1072-
// is to do a dependency scanning for clang importer and use that directly.
1073-
SmallVector<std::string, 4> HeaderMapFileNames;
1074-
Impl.Instance->getPreprocessor().getHeaderSearchInfo().getHeaderMapFileNames(
1075-
HeaderMapFileNames);
1076-
addFiles(HeaderMapFileNames);
1077-
addFiles(invocation.getHeaderSearchOpts().VFSOverlayFiles);
1078-
// FIXME: Should not depend on working directory. Build system/swift driver
1079-
// should not pass working directory here but if that option is passed,
1080-
// repect that and add that into CASFS.
1081-
auto CWD = invocation.getFileSystemOpts().WorkingDir;
1082-
if (!CWD.empty())
1083-
files.push_back(CWD);
1084-
}
1085-
10861066
std::optional<std::string>
10871067
ClangImporter::getPCHFilename(const ClangImporterOptions &ImporterOptions,
10881068
StringRef SwiftPCHHash, bool &isExplicit) {
@@ -1210,9 +1190,8 @@ std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
12101190
clang::frontend::ActionKind::GenerateModule ||
12111191
CI->getFrontendOpts().ProgramAction ==
12121192
clang::frontend::ActionKind::GeneratePCH) &&
1213-
ctx.ClangImporterOpts.HasClangIncludeTreeRoot) {
1214-
CI->getFrontendOpts().CASIncludeTreeID =
1215-
ctx.CASOpts.ClangIncludeTrees.back();
1193+
!ctx.CASOpts.ClangIncludeTree.empty()) {
1194+
CI->getFrontendOpts().CASIncludeTreeID = ctx.CASOpts.ClangIncludeTree;
12161195
CI->getFrontendOpts().Inputs.clear();
12171196
}
12181197
}
@@ -1271,7 +1250,7 @@ std::optional<std::vector<std::string>> ClangImporter::getClangCC1Arguments(
12711250

12721251
std::vector<std::string> FilteredModuleMapFiles;
12731252
for (auto ModuleMapFile : CI->getFrontendOpts().ModuleMapFiles) {
1274-
if (ctx.ClangImporterOpts.HasClangIncludeTreeRoot) {
1253+
if (ctx.CASOpts.HasImmutableFileSystem) {
12751254
// There is no need to add any module map file here. Issue a warning and
12761255
// drop the option.
12771256
Impl.diagnose(SourceLoc(), diag::module_map_ignored, ModuleMapFile);
@@ -1351,7 +1330,7 @@ ClangImporter::create(ASTContext &ctx,
13511330
fileMapping.requiresBuiltinHeadersInSystemModules;
13521331

13531332
// Avoid creating indirect file system when using include tree.
1354-
if (!ctx.ClangImporterOpts.HasClangIncludeTreeRoot) {
1333+
if (!ctx.CASOpts.HasImmutableFileSystem) {
13551334
// Wrap Swift's FS to allow Clang to override the working directory
13561335
VFS = llvm::vfs::RedirectingFileSystem::create(
13571336
fileMapping.redirectedFiles, true, *ctx.SourceMgr.getFileSystem());
@@ -2756,7 +2735,6 @@ ClangImporter::Implementation::Implementation(
27562735
!ctx.ClangImporterOpts.BridgingHeader.empty()),
27572736
DisableOverlayModules(ctx.ClangImporterOpts.DisableOverlayModules),
27582737
EnableClangSPI(ctx.ClangImporterOpts.EnableClangSPI),
2759-
UseClangIncludeTree(ctx.ClangImporterOpts.UseClangIncludeTree),
27602738
importSymbolicCXXDecls(
27612739
ctx.LangOpts.hasFeature(Feature::ImportSymbolicCXXDecls)),
27622740
IsReadingBridgingPCH(false),
@@ -4281,15 +4259,14 @@ ClangImporter::getSwiftExplicitModuleDirectCC1Args() const {
42814259
PPOpts.MacroIncludes.clear();
42824260
PPOpts.Includes.clear();
42834261

4284-
// CodeGenOptions.
4285-
auto &CGOpts = instance.getCodeGenOpts();
4286-
CGOpts.DebugCompilationDir.clear();
4262+
// Clear benign CodeGenOptions.
4263+
clang::tooling::dependencies::resetBenignCodeGenOptions(
4264+
clang::frontend::ActionKind::GenerateModule, instance.getLangOpts(),
4265+
instance.getCodeGenOpts());
42874266

4288-
if (Impl.SwiftContext.ClangImporterOpts.UseClangIncludeTree) {
4289-
// FileSystemOptions.
4290-
auto &FSOpts = instance.getFileSystemOpts();
4291-
FSOpts.WorkingDir.clear();
4292-
}
4267+
// FileSystemOptions.
4268+
auto &FSOpts = instance.getFileSystemOpts();
4269+
FSOpts.WorkingDir.clear();
42934270

42944271
if (!Impl.SwiftContext.SearchPathOpts.ScannerPrefixMapper.empty()) {
42954272
// Remap all the paths if requested.

0 commit comments

Comments
 (0)