r303630 - Allow to use vfs::FileSystem for file accesses inside ASTUnit.

Ilya Biryukov via cfe-commits cfe-commits at lists.llvm.org
Wed May 24 00:18:31 PDT 2017


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.cardoso at 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 at 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 at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
>
> --
> Bruno Cardoso Lopes
> http://www.brunocardoso.cc
>



-- 
Regards,
Ilya Biryukov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170524/4d515ece/attachment-0001.html>


More information about the cfe-commits mailing list