Skip to content

Commit a748783

Browse files
[NFC][CAS] Cleanup CAS-based file system initialization
1 parent 21a2b78 commit a748783

File tree

4 files changed

+55
-29
lines changed

4 files changed

+55
-29
lines changed

include/swift/Frontend/CachingUtils.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,11 @@ llvm::Error storeCachedCompilerOutput(llvm::cas::ObjectStore &CAS,
5656
file_types::ID OutputKind);
5757

5858
llvm::Expected<llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>>
59-
createCASFileSystem(llvm::cas::ObjectStore &CAS, ArrayRef<std::string> FSRoots,
60-
ArrayRef<std::string> IncludeTreeRoots);
59+
createCASFileSystem(llvm::cas::ObjectStore &CAS, ArrayRef<std::string> FSRoots);
60+
61+
llvm::Expected<llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>>
62+
createIncludeTreeFileSystem(llvm::cas::ObjectStore &CAS,
63+
ArrayRef<std::string> IncludeTreeRoots);
6164

6265
namespace cas {
6366
/// Helper class to manage CAS/Caching from libSwiftScan C APIs.

lib/ClangImporter/ClangImporter.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,8 +1166,10 @@ ClangImporter::create(ASTContext &ctx,
11661166
auto fileMapping = getClangInvocationFileMapping(ctx);
11671167
// Wrap Swift's FS to allow Clang to override the working directory
11681168
llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> VFS =
1169-
llvm::vfs::RedirectingFileSystem::create(
1170-
fileMapping.redirectedFiles, true, *ctx.SourceMgr.getFileSystem());
1169+
ctx.SourceMgr.getFileSystem();
1170+
if (!fileMapping.redirectedFiles.empty())
1171+
VFS = llvm::vfs::RedirectingFileSystem::create(
1172+
fileMapping.redirectedFiles, true, *ctx.SourceMgr.getFileSystem());
11711173
if (!fileMapping.overridenFiles.empty()) {
11721174
llvm::IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> overridenVFS =
11731175
new llvm::vfs::InMemoryFileSystem();

lib/Frontend/CachingUtils.cpp

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -377,29 +377,35 @@ static Expected<ObjectRef> mergeCASFileSystem(ObjectStore &CAS,
377377
}
378378

379379
Expected<IntrusiveRefCntPtr<vfs::FileSystem>>
380-
createCASFileSystem(ObjectStore &CAS, ArrayRef<std::string> FSRoots,
381-
ArrayRef<std::string> IncludeTrees) {
382-
assert(!FSRoots.empty() || !IncludeTrees.empty() && "no root ID provided");
383-
if (FSRoots.size() == 1 && IncludeTrees.empty()) {
380+
createCASFileSystem(ObjectStore &CAS, ArrayRef<std::string> FSRoots) {
381+
if (FSRoots.empty())
382+
return nullptr;
383+
384+
if (FSRoots.size() == 1) {
384385
auto ID = CAS.parseID(FSRoots.front());
385386
if (!ID)
386387
return ID.takeError();
387-
auto Ref = CAS.getReference(*ID);
388-
if (!Ref)
389-
return createCASObjectNotFoundError(*ID);
388+
389+
return createCASFileSystem(CAS, *ID);
390390
}
391391

392392
auto NewRoot = mergeCASFileSystem(CAS, FSRoots);
393393
if (!NewRoot)
394394
return NewRoot.takeError();
395395

396-
auto FS = createCASFileSystem(CAS, CAS.getID(*NewRoot));
397-
if (!FS)
398-
return FS.takeError();
396+
return createCASFileSystem(CAS, CAS.getID(*NewRoot));
397+
}
399398

400-
auto CASFS = makeIntrusiveRefCnt<vfs::OverlayFileSystem>(std::move(*FS));
401-
// Push all Include File System onto overlay.
402-
for (auto &Tree : IncludeTrees) {
399+
Expected<IntrusiveRefCntPtr<vfs::FileSystem>>
400+
createIncludeTreeFileSystem(ObjectStore &CAS,
401+
ArrayRef<std::string> IncludeTreeRoots) {
402+
if (IncludeTreeRoots.empty())
403+
return nullptr;
404+
405+
IntrusiveRefCntPtr<clang::cas::IncludeTreeFileSystem> IncludeTreeFS =
406+
new clang::cas::IncludeTreeFileSystem(CAS);
407+
408+
for (const auto &Tree : IncludeTreeRoots) {
403409
auto ID = CAS.parseID(Tree);
404410
if (!ID)
405411
return ID.takeError();
@@ -411,13 +417,11 @@ createCASFileSystem(ObjectStore &CAS, ArrayRef<std::string> FSRoots,
411417
if (!IT)
412418
return IT.takeError();
413419

414-
auto ITFS = clang::cas::createIncludeTreeFileSystem(*IT);
415-
if (!ITFS)
416-
return ITFS.takeError();
417-
CASFS->pushOverlay(std::move(*ITFS));
418-
}
420+
if (auto E = IncludeTreeFS->addFilesFromIncludeTree(*IT))
421+
return std::move(E);
422+
};
419423

420-
return CASFS;
424+
return IncludeTreeFS;
421425
}
422426

423427
namespace cas {

lib/Frontend/Frontend.cpp

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -523,16 +523,33 @@ bool CompilerInstance::setUpVirtualFileSystemOverlays() {
523523
if (Invocation.getFrontendOptions().EnableCaching &&
524524
(!Invocation.getFrontendOptions().CASFSRootIDs.empty() ||
525525
!Invocation.getFrontendOptions().ClangIncludeTrees.empty())) {
526-
// Set up CASFS as BaseFS.
526+
// Set up FileSystem from CAS.
527527
const auto &Opts = getInvocation().getFrontendOptions();
528-
auto FS =
529-
createCASFileSystem(*CAS, Opts.CASFSRootIDs, Opts.ClangIncludeTrees);
530-
if (!FS) {
528+
auto CASFS =
529+
createCASFileSystem(*CAS, Opts.CASFSRootIDs);
530+
if (!CASFS) {
531531
Diagnostics.diagnose(SourceLoc(), diag::error_cas,
532-
toString(FS.takeError()));
532+
toString(CASFS.takeError()));
533533
return true;
534534
}
535-
SourceMgr.setFileSystem(std::move(*FS));
535+
auto IncludeTreeFS =
536+
createIncludeTreeFileSystem(*CAS, Opts.ClangIncludeTrees);
537+
if (!IncludeTreeFS) {
538+
Diagnostics.diagnose(SourceLoc(), diag::error_cas,
539+
toString(IncludeTreeFS.takeError()));
540+
return true;
541+
}
542+
// If both FS exists, overlay them, otherwise, use one or the other as
543+
// BaseFS.
544+
if (*CASFS && *IncludeTreeFS) {
545+
llvm::IntrusiveRefCntPtr<llvm::vfs::OverlayFileSystem> OverlayVFS =
546+
new llvm::vfs::OverlayFileSystem(std::move(*CASFS));
547+
OverlayVFS->pushOverlay(*IncludeTreeFS);
548+
SourceMgr.setFileSystem(std::move(OverlayVFS));
549+
} else if (*CASFS)
550+
SourceMgr.setFileSystem(std::move(*CASFS));
551+
else
552+
SourceMgr.setFileSystem(*IncludeTreeFS);
536553
}
537554

538555
// If we have a bridging header cache key, try load it now and overlay it.

0 commit comments

Comments
 (0)