r303630 - Allow to use vfs::FileSystem for file accesses inside ASTUnit.
Bruno Cardoso Lopes via cfe-commits
cfe-commits at lists.llvm.org
Wed May 24 11:07:17 PDT 2017
On Wed, May 24, 2017 at 12:18 AM, Ilya Biryukov <ibiryukov at google.com> wrote:
> 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.
I see, thanks!
>
> 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>
>> > getMainBufferWithPrecompiledPreamble(
>> > 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
>> > IncludeBriefCommentsInCodeCompletion,
>> > 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
--
Bruno Cardoso Lopes
http://www.brunocardoso.cc
More information about the cfe-commits
mailing list