We test it in clangd (https://reviews.llvm.org/D33416). Logically, it's a single change, split into two part: for cfe and clang-tools-extra.
On Wed, May 24, 2017 at 1:48 AM, Bruno Cardoso Lopes < bruno.card...@gmail.com> wrote: > Any specific reason why this doesn't contain a testcase? > > On Tue, May 23, 2017 at 4:37 AM, Ilya Biryukov via cfe-commits > <cfe-commits@lists.llvm.org> wrote: > > Author: ibiryukov > > Date: Tue May 23 06:37:52 2017 > > New Revision: 303630 > > > > URL: http://llvm.org/viewvc/llvm-project?rev=303630&view=rev > > Log: > > Allow to use vfs::FileSystem for file accesses inside ASTUnit. > > > > Reviewers: bkramer, krasimir, arphaman, akyrtzi > > > > Reviewed By: bkramer > > > > Subscribers: klimek, cfe-commits > > > > Differential Revision: https://reviews.llvm.org/D33397 > > > > Modified: > > cfe/trunk/include/clang/Frontend/ASTUnit.h > > cfe/trunk/include/clang/Frontend/CompilerInvocation.h > > cfe/trunk/lib/Frontend/ASTUnit.cpp > > cfe/trunk/lib/Frontend/CompilerInvocation.cpp > > > > Modified: cfe/trunk/include/clang/Frontend/ASTUnit.h > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/ > clang/Frontend/ASTUnit.h?rev=303630&r1=303629&r2=303630&view=diff > > ============================================================ > ================== > > --- cfe/trunk/include/clang/Frontend/ASTUnit.h (original) > > +++ cfe/trunk/include/clang/Frontend/ASTUnit.h Tue May 23 06:37:52 2017 > > @@ -59,6 +59,10 @@ class TargetInfo; > > class FrontendAction; > > class ASTDeserializationListener; > > > > +namespace vfs { > > +class FileSystem; > > +} > > + > > /// \brief Utility class for loading a ASTContext from an AST file. > > /// > > class ASTUnit : public ModuleLoader { > > @@ -420,7 +424,8 @@ private: > > explicit ASTUnit(bool MainFileIsAST); > > > > bool Parse(std::shared_ptr<PCHContainerOperations> PCHContainerOps, > > - std::unique_ptr<llvm::MemoryBuffer> OverrideMainBuffer); > > + std::unique_ptr<llvm::MemoryBuffer> OverrideMainBuffer, > > + IntrusiveRefCntPtr<vfs::FileSystem> VFS); > > > > struct ComputedPreamble { > > llvm::MemoryBuffer *Buffer; > > @@ -434,11 +439,13 @@ private: > > PreambleEndsAtStartOfLine(PreambleEndsAtStartOfLine) {} > > }; > > ComputedPreamble ComputePreamble(CompilerInvocation &Invocation, > > - unsigned MaxLines); > > + unsigned MaxLines, > > + IntrusiveRefCntPtr<vfs::FileSystem> > VFS); > > > > std::unique_ptr<llvm::MemoryBuffer> getMainBufferWithPrecompiledPr > eamble( > > std::shared_ptr<PCHContainerOperations> PCHContainerOps, > > - const CompilerInvocation &PreambleInvocationIn, bool AllowRebuild > = true, > > + const CompilerInvocation &PreambleInvocationIn, > > + IntrusiveRefCntPtr<vfs::FileSystem> VFS, bool AllowRebuild = > true, > > unsigned MaxLines = 0); > > void RealizeTopLevelDeclsFromPreamble(); > > > > @@ -731,11 +738,17 @@ private: > > /// of this translation unit should be precompiled, to improve the > performance > > /// of reparsing. Set to zero to disable preambles. > > /// > > + /// \param VFS - A vfs::FileSystem to be used for all file accesses. > Note that > > + /// preamble is saved to a temporary directory on a RealFileSystem, > so in order > > + /// for it to be loaded correctly, VFS should have access to it(i.e., > be an > > + /// overlay over RealFileSystem). > > + /// > > /// \returns \c true if a catastrophic failure occurred (which means > that the > > /// \c ASTUnit itself is invalid), or \c false otherwise. > > bool LoadFromCompilerInvocation( > > std::shared_ptr<PCHContainerOperations> PCHContainerOps, > > - unsigned PrecompilePreambleAfterNParses); > > + unsigned PrecompilePreambleAfterNParses, > > + IntrusiveRefCntPtr<vfs::FileSystem> VFS); > > > > public: > > > > @@ -826,6 +839,11 @@ public: > > /// (e.g. because the PCH could not be loaded), this accepts the > ASTUnit > > /// mainly to allow the caller to see the diagnostics. > > /// > > + /// \param VFS - A vfs::FileSystem to be used for all file accesses. > Note that > > + /// preamble is saved to a temporary directory on a RealFileSystem, > so in order > > + /// for it to be loaded correctly, VFS should have access to it(i.e., > be an > > + /// overlay over RealFileSystem). RealFileSystem will be used if \p > VFS is nullptr. > > + /// > > // FIXME: Move OnlyLocalDecls, UseBumpAllocator to setters on the > ASTUnit, we > > // shouldn't need to specify them at construction time. > > static ASTUnit *LoadFromCommandLine( > > @@ -842,15 +860,23 @@ public: > > bool AllowPCHWithCompilerErrors = false, bool SkipFunctionBodies > = false, > > bool UserFilesAreVolatile = false, bool ForSerialization = false, > > llvm::Optional<StringRef> ModuleFormat = llvm::None, > > - std::unique_ptr<ASTUnit> *ErrAST = nullptr); > > + std::unique_ptr<ASTUnit> *ErrAST = nullptr, > > + IntrusiveRefCntPtr<vfs::FileSystem> VFS = nullptr); > > > > /// \brief Reparse the source files using the same command-line > options that > > /// were originally used to produce this translation unit. > > /// > > + /// \param VFS - A vfs::FileSystem to be used for all file accesses. > Note that > > + /// preamble is saved to a temporary directory on a RealFileSystem, > so in order > > + /// for it to be loaded correctly, VFS should give an access to > this(i.e. be an > > + /// overlay over RealFileSystem). FileMgr->getVirtualFileSystem() > will be used if > > + /// \p VFS is nullptr. > > + /// > > /// \returns True if a failure occurred that causes the ASTUnit not to > > /// contain any translation-unit information, false otherwise. > > bool Reparse(std::shared_ptr<PCHContainerOperations> PCHContainerOps, > > - ArrayRef<RemappedFile> RemappedFiles = None); > > + ArrayRef<RemappedFile> RemappedFiles = None, > > + IntrusiveRefCntPtr<vfs::FileSystem> VFS = nullptr); > > > > /// \brief Perform code completion at the given file, line, and > > /// column within this translation unit. > > > > Modified: cfe/trunk/include/clang/Frontend/CompilerInvocation.h > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/ > clang/Frontend/CompilerInvocation.h?rev=303630&r1=303629&r2=303630& > view=diff > > ============================================================ > ================== > > --- cfe/trunk/include/clang/Frontend/CompilerInvocation.h (original) > > +++ cfe/trunk/include/clang/Frontend/CompilerInvocation.h Tue May 23 > 06:37:52 2017 > > @@ -225,6 +225,11 @@ IntrusiveRefCntPtr<vfs::FileSystem> > > createVFSFromCompilerInvocation(const CompilerInvocation &CI, > > DiagnosticsEngine &Diags); > > > > +IntrusiveRefCntPtr<vfs::FileSystem> > > +createVFSFromCompilerInvocation(const CompilerInvocation &CI, > > + DiagnosticsEngine &Diags, > > + IntrusiveRefCntPtr<vfs::FileSystem> > BaseFS); > > + > > } // end namespace clang > > > > #endif > > > > Modified: cfe/trunk/lib/Frontend/ASTUnit.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ > Frontend/ASTUnit.cpp?rev=303630&r1=303629&r2=303630&view=diff > > ============================================================ > ================== > > --- cfe/trunk/lib/Frontend/ASTUnit.cpp (original) > > +++ cfe/trunk/lib/Frontend/ASTUnit.cpp Tue May 23 06:37:52 2017 > > @@ -90,6 +90,21 @@ namespace { > > /// \brief Erase temporary files and the preamble file. > > void Cleanup(); > > }; > > + > > + template <class T> > > + std::unique_ptr<T> valueOrNull(llvm::ErrorOr<std::unique_ptr<T>> > Val) { > > + if (!Val) > > + return nullptr; > > + return std::move(*Val); > > + } > > + > > + template <class T> > > + bool moveOnNoError(llvm::ErrorOr<T> Val, T &Output) { > > + if (!Val) > > + return false; > > + Output = std::move(*Val); > > + return true; > > + } > > } > > > > static llvm::sys::SmartMutex<false> &getOnDiskMutex() { > > @@ -1019,7 +1034,8 @@ static void checkAndSanitizeDiags(SmallV > > /// \returns True if a failure occurred that causes the ASTUnit not to > > /// contain any translation-unit information, false otherwise. > > bool ASTUnit::Parse(std::shared_ptr<PCHContainerOperations> > PCHContainerOps, > > - std::unique_ptr<llvm::MemoryBuffer> > OverrideMainBuffer) { > > + std::unique_ptr<llvm::MemoryBuffer> > OverrideMainBuffer, > > + IntrusiveRefCntPtr<vfs::FileSystem> VFS) { > > SavedMainFileBuffer.reset(); > > > > if (!Invocation) > > @@ -1028,6 +1044,12 @@ bool ASTUnit::Parse(std::shared_ptr<PCHC > > // Create the compiler instance to use for building the AST. > > std::unique_ptr<CompilerInstance> Clang( > > new CompilerInstance(std::move(PCHContainerOps))); > > + if (FileMgr && VFS) { > > + assert(VFS == FileMgr->getVirtualFileSystem() && > > + "VFS passed to Parse and VFS in FileMgr are different"); > > + } else if (VFS) { > > + Clang->setVirtualFileSystem(VFS); > > + } > > > > // Recover resources if we crash before exiting this method. > > llvm::CrashRecoveryContextCleanupRegistrar<CompilerInstance> > > @@ -1170,7 +1192,8 @@ static std::string GetPreamblePCHPath() > > /// that corresponds to the main file along with a pair (bytes, > start-of-line) > > /// that describes the preamble. > > ASTUnit::ComputedPreamble > > -ASTUnit::ComputePreamble(CompilerInvocation &Invocation, unsigned > MaxLines) { > > +ASTUnit::ComputePreamble(CompilerInvocation &Invocation, unsigned > MaxLines, > > + IntrusiveRefCntPtr<vfs::FileSystem> VFS) { > > FrontendOptions &FrontendOpts = Invocation.getFrontendOpts(); > > PreprocessorOptions &PreprocessorOpts = Invocation. > getPreprocessorOpts(); > > > > @@ -1180,28 +1203,32 @@ ASTUnit::ComputePreamble(CompilerInvocat > > llvm::MemoryBuffer *Buffer = nullptr; > > std::unique_ptr<llvm::MemoryBuffer> BufferOwner; > > std::string MainFilePath(FrontendOpts.Inputs[0].getFile()); > > - llvm::sys::fs::UniqueID MainFileID; > > - if (!llvm::sys::fs::getUniqueID(MainFilePath, MainFileID)) { > > + auto MainFileStatus = VFS->status(MainFilePath); > > + if (MainFileStatus) { > > + llvm::sys::fs::UniqueID MainFileID = MainFileStatus->getUniqueID(); > > + > > // Check whether there is a file-file remapping of the main file > > for (const auto &RF : PreprocessorOpts.RemappedFiles) { > > std::string MPath(RF.first); > > - llvm::sys::fs::UniqueID MID; > > - if (!llvm::sys::fs::getUniqueID(MPath, MID)) { > > + auto MPathStatus = VFS->status(MPath); > > + if (MPathStatus) { > > + llvm::sys::fs::UniqueID MID = MPathStatus->getUniqueID(); > > if (MainFileID == MID) { > > // We found a remapping. Try to load the resulting, remapped > source. > > - BufferOwner = getBufferForFile(RF.second); > > + BufferOwner = valueOrNull(VFS->getBufferForFile(RF.second)); > > if (!BufferOwner) > > return ComputedPreamble(nullptr, nullptr, 0, true); > > } > > } > > } > > - > > + > > // Check whether there is a file-buffer remapping. It supercedes the > > // file-file remapping. > > for (const auto &RB : PreprocessorOpts.RemappedFileBuffers) { > > std::string MPath(RB.first); > > - llvm::sys::fs::UniqueID MID; > > - if (!llvm::sys::fs::getUniqueID(MPath, MID)) { > > + auto MPathStatus = VFS->status(MPath); > > + if (MPathStatus) { > > + llvm::sys::fs::UniqueID MID = MPathStatus->getUniqueID(); > > if (MainFileID == MID) { > > // We found a remapping. > > BufferOwner.reset(); > > @@ -1213,7 +1240,7 @@ ASTUnit::ComputePreamble(CompilerInvocat > > > > // If the main source file was not remapped, load it now. > > if (!Buffer && !BufferOwner) { > > - BufferOwner = getBufferForFile(FrontendOpts.Inputs[0].getFile()); > > + BufferOwner = valueOrNull(VFS->getBufferForFile(FrontendOpts. > Inputs[0].getFile())); > > if (!BufferOwner) > > return ComputedPreamble(nullptr, nullptr, 0, true); > > } > > @@ -1324,8 +1351,10 @@ makeStandaloneDiagnostic(const LangOptio > > std::unique_ptr<llvm::MemoryBuffer> > > ASTUnit::getMainBufferWithPrecompiledPreamble( > > std::shared_ptr<PCHContainerOperations> PCHContainerOps, > > - const CompilerInvocation &PreambleInvocationIn, bool AllowRebuild, > > + const CompilerInvocation &PreambleInvocationIn, > > + IntrusiveRefCntPtr<vfs::FileSystem> VFS, bool AllowRebuild, > > unsigned MaxLines) { > > + assert(VFS && "VFS is null"); > > > > auto PreambleInvocation = > > std::make_shared<CompilerInvocation>(PreambleInvocationIn); > > @@ -1333,7 +1362,8 @@ ASTUnit::getMainBufferWithPrecompiledPre > > PreprocessorOptions &PreprocessorOpts > > = PreambleInvocation->getPreprocessorOpts(); > > > > - ComputedPreamble NewPreamble = ComputePreamble(*PreambleInvocation, > MaxLines); > > + ComputedPreamble NewPreamble = > > + ComputePreamble(*PreambleInvocation, MaxLines, VFS); > > > > if (!NewPreamble.Size) { > > // We couldn't find a preamble in the main source. Clear out the > current > > @@ -1369,7 +1399,7 @@ ASTUnit::getMainBufferWithPrecompiledPre > > break; > > > > vfs::Status Status; > > - if (FileMgr->getNoncachedStatValue(R.second, Status)) { > > + if (!moveOnNoError(VFS->status(R.second), Status)) { > > // If we can't stat the file we're remapping to, assume that > something > > // horrible happened. > > AnyFileChanged = true; > > @@ -1386,7 +1416,7 @@ ASTUnit::getMainBufferWithPrecompiledPre > > break; > > > > vfs::Status Status; > > - if (FileMgr->getNoncachedStatValue(RB.first, Status)) { > > + if (!moveOnNoError(VFS->status(RB.first), Status)) { > > AnyFileChanged = true; > > break; > > } > > @@ -1401,7 +1431,7 @@ ASTUnit::getMainBufferWithPrecompiledPre > > !AnyFileChanged && F != FEnd; > > ++F) { > > vfs::Status Status; > > - if (FileMgr->getNoncachedStatValue(F->first(), Status)) { > > + if (!moveOnNoError(VFS->status(F->first()), Status)) { > > // If we can't stat the file, assume that something horrible > happened. > > AnyFileChanged = true; > > break; > > @@ -1546,14 +1576,14 @@ ASTUnit::getMainBufferWithPrecompiledPre > > TopLevelDeclsInPreamble.clear(); > > PreambleDiagnostics.clear(); > > > > - IntrusiveRefCntPtr<vfs::FileSystem> VFS = > > - createVFSFromCompilerInvocation(Clang->getInvocation(), > getDiagnostics()); > > + VFS = createVFSFromCompilerInvocation(Clang->getInvocation(), > > + getDiagnostics(), VFS); > > if (!VFS) > > return nullptr; > > > > // Create a file manager object to provide access to and cache the > filesystem. > > Clang->setFileManager(new FileManager(Clang->getFileSystemOpts(), > VFS)); > > - > > + > > // Create the source manager. > > Clang->setSourceManager(new SourceManager(getDiagnostics(), > > Clang->getFileManager())); > > @@ -1863,10 +1893,13 @@ ASTUnit *ASTUnit::LoadFromCompilerInvoca > > > > bool ASTUnit::LoadFromCompilerInvocation( > > std::shared_ptr<PCHContainerOperations> PCHContainerOps, > > - unsigned PrecompilePreambleAfterNParses) { > > + unsigned PrecompilePreambleAfterNParses, > > + IntrusiveRefCntPtr<vfs::FileSystem> VFS) { > > if (!Invocation) > > return true; > > - > > + > > + assert(VFS && "VFS is null"); > > + > > // We'll manage file buffers ourselves. > > Invocation->getPreprocessorOpts().RetainRemappedFileBuffers = true; > > Invocation->getFrontendOpts().DisableFree = false; > > @@ -1877,19 +1910,19 @@ bool ASTUnit::LoadFromCompilerInvocation > > if (PrecompilePreambleAfterNParses > 0) { > > PreambleRebuildCounter = PrecompilePreambleAfterNParses; > > OverrideMainBuffer = > > - getMainBufferWithPrecompiledPreamble(PCHContainerOps, > *Invocation); > > + getMainBufferWithPrecompiledPreamble(PCHContainerOps, > *Invocation, VFS); > > getDiagnostics().Reset(); > > ProcessWarningOptions(getDiagnostics(), > Invocation->getDiagnosticOpts()); > > } > > - > > + > > SimpleTimer ParsingTimer(WantTiming); > > ParsingTimer.setOutput("Parsing " + getMainFileName()); > > - > > + > > // Recover resources if we crash before exiting this method. > > llvm::CrashRecoveryContextCleanupRegistrar<llvm::MemoryBuffer> > > MemBufferCleanup(OverrideMainBuffer.get()); > > > > - return Parse(std::move(PCHContainerOps), > std::move(OverrideMainBuffer)); > > + return Parse(std::move(PCHContainerOps), > std::move(OverrideMainBuffer), VFS); > > } > > > > std::unique_ptr<ASTUnit> ASTUnit::LoadFromCompilerInvocation( > > @@ -1923,7 +1956,8 @@ std::unique_ptr<ASTUnit> ASTUnit::LoadFr > > DiagCleanup(Diags.get()); > > > > if (AST->LoadFromCompilerInvocation(std::move(PCHContainerOps), > > - PrecompilePreambleAfterNParses)) > > + PrecompilePreambleAfterNParses, > > + AST->FileMgr-> > getVirtualFileSystem())) > > return nullptr; > > return AST; > > } > > @@ -1938,7 +1972,8 @@ ASTUnit *ASTUnit::LoadFromCommandLine( > > bool CacheCodeCompletionResults, bool IncludeBriefCommentsInCodeComp > letion, > > bool AllowPCHWithCompilerErrors, bool SkipFunctionBodies, > > bool UserFilesAreVolatile, bool ForSerialization, > > - llvm::Optional<StringRef> ModuleFormat, std::unique_ptr<ASTUnit> > *ErrAST) { > > + llvm::Optional<StringRef> ModuleFormat, std::unique_ptr<ASTUnit> > *ErrAST, > > + IntrusiveRefCntPtr<vfs::FileSystem> VFS) { > > assert(Diags.get() && "no DiagnosticsEngine was provided"); > > > > SmallVector<StoredDiagnostic, 4> StoredDiagnostics; > > @@ -1979,8 +2014,9 @@ ASTUnit *ASTUnit::LoadFromCommandLine( > > ConfigureDiags(Diags, *AST, CaptureDiagnostics); > > AST->Diagnostics = Diags; > > AST->FileSystemOpts = CI->getFileSystemOpts(); > > - IntrusiveRefCntPtr<vfs::FileSystem> VFS = > > - createVFSFromCompilerInvocation(*CI, *Diags); > > + if (!VFS) > > + VFS = vfs::getRealFileSystem(); > > + VFS = createVFSFromCompilerInvocation(*CI, *Diags, VFS); > > if (!VFS) > > return nullptr; > > AST->FileMgr = new FileManager(AST->FileSystemOpts, VFS); > > @@ -2006,7 +2042,8 @@ ASTUnit *ASTUnit::LoadFromCommandLine( > > ASTUnitCleanup(AST.get()); > > > > if (AST->LoadFromCompilerInvocation(std::move(PCHContainerOps), > > - PrecompilePreambleAfterNParses)) > { > > + PrecompilePreambleAfterNParses, > > + VFS)) { > > // Some error occurred, if caller wants to examine diagnostics, > pass it the > > // ASTUnit. > > if (ErrAST) { > > @@ -2020,10 +2057,16 @@ ASTUnit *ASTUnit::LoadFromCommandLine( > > } > > > > bool ASTUnit::Reparse(std::shared_ptr<PCHContainerOperations> > PCHContainerOps, > > - ArrayRef<RemappedFile> RemappedFiles) { > > + ArrayRef<RemappedFile> RemappedFiles, > > + IntrusiveRefCntPtr<vfs::FileSystem> VFS) { > > if (!Invocation) > > return true; > > > > + if (!VFS) { > > + assert(FileMgr && "FileMgr is null on Reparse call"); > > + VFS = FileMgr->getVirtualFileSystem(); > > + } > > + > > clearFileLevelDecls(); > > > > SimpleTimer ParsingTimer(WantTiming); > > @@ -2045,7 +2088,8 @@ bool ASTUnit::Reparse(std::shared_ptr<PC > > std::unique_ptr<llvm::MemoryBuffer> OverrideMainBuffer; > > if (!getPreambleFile(this).empty() || PreambleRebuildCounter > 0) > > OverrideMainBuffer = > > - getMainBufferWithPrecompiledPreamble(PCHContainerOps, > *Invocation); > > + getMainBufferWithPrecompiledPreamble(PCHContainerOps, > *Invocation, VFS); > > + > > > > // Clear out the diagnostics state. > > FileMgr.reset(); > > @@ -2056,7 +2100,7 @@ bool ASTUnit::Reparse(std::shared_ptr<PC > > > > // Parse the sources > > bool Result = > > - Parse(std::move(PCHContainerOps), std::move(OverrideMainBuffer)); > > + Parse(std::move(PCHContainerOps), std::move(OverrideMainBuffer), > VFS); > > > > // If we're caching global code-completion results, and the top-level > > // declarations have changed, clear out the code-completion cache. > > @@ -2414,15 +2458,19 @@ void ASTUnit::CodeComplete( > > std::unique_ptr<llvm::MemoryBuffer> OverrideMainBuffer; > > if (!getPreambleFile(this).empty()) { > > std::string CompleteFilePath(File); > > - llvm::sys::fs::UniqueID CompleteFileID; > > > > - if (!llvm::sys::fs::getUniqueID(CompleteFilePath, CompleteFileID)) > { > > + auto VFS = FileMgr.getVirtualFileSystem(); > > + auto CompleteFileStatus = VFS->status(CompleteFilePath); > > + if (CompleteFileStatus) { > > + llvm::sys::fs::UniqueID CompleteFileID = CompleteFileStatus-> > getUniqueID(); > > + > > std::string MainPath(OriginalSourceFile); > > - llvm::sys::fs::UniqueID MainID; > > - if (!llvm::sys::fs::getUniqueID(MainPath, MainID)) { > > + auto MainStatus = VFS->status(MainPath); > > + if (MainStatus) { > > + llvm::sys::fs::UniqueID MainID = MainStatus->getUniqueID(); > > if (CompleteFileID == MainID && Line > 1) > > OverrideMainBuffer = getMainBufferWithPrecompiledPreamble( > > - PCHContainerOps, Inv, false, Line - 1); > > + PCHContainerOps, Inv, VFS, false, Line - 1); > > } > > } > > } > > > > Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ > Frontend/CompilerInvocation.cpp?rev=303630&r1=303629&r2=303630&view=diff > > ============================================================ > ================== > > --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original) > > +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Tue May 23 06:37:52 > 2017 > > @@ -2750,15 +2750,22 @@ void BuryPointer(const void *Ptr) { > > IntrusiveRefCntPtr<vfs::FileSystem> > > createVFSFromCompilerInvocation(const CompilerInvocation &CI, > > DiagnosticsEngine &Diags) { > > + return createVFSFromCompilerInvocation(CI, Diags, > vfs::getRealFileSystem()); > > +} > > + > > +IntrusiveRefCntPtr<vfs::FileSystem> > > +createVFSFromCompilerInvocation(const CompilerInvocation &CI, > > + DiagnosticsEngine &Diags, > > + IntrusiveRefCntPtr<vfs::FileSystem> > BaseFS) { > > if (CI.getHeaderSearchOpts().VFSOverlayFiles.empty()) > > - return vfs::getRealFileSystem(); > > + return BaseFS; > > > > - IntrusiveRefCntPtr<vfs::OverlayFileSystem> > > - Overlay(new vfs::OverlayFileSystem(vfs::getRealFileSystem())); > > + IntrusiveRefCntPtr<vfs::OverlayFileSystem> Overlay( > > + new vfs::OverlayFileSystem(BaseFS)); > > // earlier vfs files are on the bottom > > for (const std::string &File : CI.getHeaderSearchOpts().VFSOverlayFiles) > { > > llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Buffer = > > - llvm::MemoryBuffer::getFile(File); > > + BaseFS->getBufferForFile(File); > > if (!Buffer) { > > Diags.Report(diag::err_missing_vfs_overlay_file) << File; > > return IntrusiveRefCntPtr<vfs::FileSystem>(); > > > > > > _______________________________________________ > > cfe-commits mailing list > > cfe-commits@lists.llvm.org > > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > > > > -- > Bruno Cardoso Lopes > http://www.brunocardoso.cc > -- Regards, Ilya Biryukov
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits