diff --git a/clang/include/clang/Basic/FileManager.h b/clang/include/clang/Basic/FileManager.h --- a/clang/include/clang/Basic/FileManager.h +++ b/clang/include/clang/Basic/FileManager.h @@ -243,6 +243,10 @@ const FileSystemOptions &getFileSystemOpts() const { return FileSystemOpts; } llvm::vfs::FileSystem &getVirtualFileSystem() const { return *FS; } + llvm::IntrusiveRefCntPtr + getVirtualFileSystemPtr() const { + return FS; + } void setVirtualFileSystem(IntrusiveRefCntPtr FS) { this->FS = std::move(FS); diff --git a/clang/include/clang/Frontend/CompilerInvocation.h b/clang/include/clang/Frontend/CompilerInvocation.h --- a/clang/include/clang/Frontend/CompilerInvocation.h +++ b/clang/include/clang/Frontend/CompilerInvocation.h @@ -294,6 +294,11 @@ const CompilerInvocation &CI, DiagnosticsEngine &Diags, IntrusiveRefCntPtr BaseFS); +IntrusiveRefCntPtr +createVFSFromOverlayFiles(ArrayRef VFSOverlayFiles, + DiagnosticsEngine &Diags, + IntrusiveRefCntPtr BaseFS); + } // namespace clang #endif // LLVM_CLANG_FRONTEND_COMPILERINVOCATION_H diff --git a/clang/lib/Frontend/ASTUnit.cpp b/clang/lib/Frontend/ASTUnit.cpp --- a/clang/lib/Frontend/ASTUnit.cpp +++ b/clang/lib/Frontend/ASTUnit.cpp @@ -551,6 +551,11 @@ StringRef SpecificModuleCachePath, bool Complain) override { this->HSOpts = HSOpts; + + this->PP.getFileManager().setVirtualFileSystem(createVFSFromOverlayFiles( + this->HSOpts.VFSOverlayFiles, this->PP.getDiagnostics(), + this->PP.getFileManager().getVirtualFileSystemPtr())); + return false; } diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -4711,12 +4711,19 @@ clang::createVFSFromCompilerInvocation( const CompilerInvocation &CI, DiagnosticsEngine &Diags, IntrusiveRefCntPtr BaseFS) { - if (CI.getHeaderSearchOpts().VFSOverlayFiles.empty()) + return createVFSFromOverlayFiles(CI.getHeaderSearchOpts().VFSOverlayFiles, + Diags, std::move(BaseFS)); +} + +IntrusiveRefCntPtr clang::createVFSFromOverlayFiles( + ArrayRef VFSOverlayFiles, DiagnosticsEngine &Diags, + IntrusiveRefCntPtr BaseFS) { + if (VFSOverlayFiles.empty()) return BaseFS; IntrusiveRefCntPtr Result = BaseFS; // earlier vfs files are on the bottom - for (const auto &File : CI.getHeaderSearchOpts().VFSOverlayFiles) { + for (const auto &File : VFSOverlayFiles) { llvm::ErrorOr> Buffer = Result->getBufferForFile(File); if (!Buffer) { diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -5870,6 +5870,12 @@ HSOpts.SystemHeaderPrefixes.emplace_back(std::move(Prefix), IsSystemHeader); } + // VFS overlay files. + for (unsigned N = Record[Idx++]; N; --N) { + std::string VFSOverlayFile = ReadString(Record, Idx); + HSOpts.VFSOverlayFiles.emplace_back(std::move(VFSOverlayFile)); + } + HSOpts.ResourceDir = ReadString(Record, Idx); HSOpts.ModuleCachePath = ReadString(Record, Idx); HSOpts.ModuleUserBuildPath = ReadString(Record, Idx); diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -1410,6 +1410,11 @@ Record.push_back(HSOpts.SystemHeaderPrefixes[I].IsSystemHeader); } + // VFS overlay files. + Record.push_back(HSOpts.VFSOverlayFiles.size()); + for (StringRef VFSOverlayFile : HSOpts.VFSOverlayFiles) + AddString(VFSOverlayFile, Record); + AddString(HSOpts.ResourceDir, Record); AddString(HSOpts.ModuleCachePath, Record); AddString(HSOpts.ModuleUserBuildPath, Record);