r269769 - [PCH] Fixed bug with preamble invalidation when overridden files change

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Tue May 17 09:36:12 PDT 2016


Is it possible to write a test for this?

On Tue, May 17, 2016 at 10:34 AM, Cameron Desrochers via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: cameron314
> Date: Tue May 17 09:34:53 2016
> New Revision: 269769
>
> URL: http://llvm.org/viewvc/llvm-project?rev=269769&view=rev
> Log:
> [PCH] Fixed bug with preamble invalidation when overridden files change
>
> When remapped files were changed, they would not always cause the
> preamble's PCH to be invalidated, because the remapped path didn't
> necessarily match the include path (e.g. slash direction -- this happens a
> lot on Windows). I fixed this by moving to a llvm::sys::fs::UniqueID-based
> map instead of comparing paths stringwise.
>
> Differential Revision: http://reviews.llvm.org/D20137
>
> Modified:
>     cfe/trunk/lib/Frontend/ASTUnit.cpp
>
> Modified: cfe/trunk/lib/Frontend/ASTUnit.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTUnit.cpp?rev=269769&r1=269768&r2=269769&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Frontend/ASTUnit.cpp (original)
> +++ cfe/trunk/lib/Frontend/ASTUnit.cpp Tue May 17 09:34:53 2016
> @@ -1378,7 +1378,7 @@ ASTUnit::getMainBufferWithPrecompiledPre
>
>        // First, make a record of those files that have been overridden via
>        // remapping or unsaved_files.
> -      llvm::StringMap<PreambleFileHash> OverriddenFiles;
> +      std::map<llvm::sys::fs::UniqueID, PreambleFileHash> OverriddenFiles;
>        for (const auto &R : PreprocessorOpts.RemappedFiles) {
>          if (AnyFileChanged)
>            break;
> @@ -1391,24 +1391,38 @@ ASTUnit::getMainBufferWithPrecompiledPre
>            break;
>          }
>
> -        OverriddenFiles[R.first] = PreambleFileHash::createForFile(
> +        OverriddenFiles[Status.getUniqueID()] =
> PreambleFileHash::createForFile(
>              Status.getSize(),
> Status.getLastModificationTime().toEpochTime());
>        }
>
>        for (const auto &RB : PreprocessorOpts.RemappedFileBuffers) {
>          if (AnyFileChanged)
>            break;
> -        OverriddenFiles[RB.first] =
> +
> +        vfs::Status Status;
> +        if (FileMgr->getNoncachedStatValue(RB.first, Status)) {
> +          AnyFileChanged = true;
> +          break;
> +        }
> +
> +        OverriddenFiles[Status.getUniqueID()] =
>              PreambleFileHash::createForMemoryBuffer(RB.second);
>        }
>
>        // Check whether anything has changed.
> -      for (llvm::StringMap<PreambleFileHash>::iterator
> +      for (llvm::StringMap<PreambleFileHash>::iterator
>               F = FilesInPreamble.begin(), FEnd = FilesInPreamble.end();
>             !AnyFileChanged && F != FEnd;
>             ++F) {
> -        llvm::StringMap<PreambleFileHash>::iterator Overridden
> -          = OverriddenFiles.find(F->first());
> +        vfs::Status Status;
> +        if (FileMgr->getNoncachedStatValue(F->first(), Status)) {
> +          // If we can't stat the file, assume that something horrible
> happened.
> +          AnyFileChanged = true;
> +          break;
> +        }
> +
> +        std::map<llvm::sys::fs::UniqueID, PreambleFileHash>::iterator
> Overridden
> +          = OverriddenFiles.find(Status.getUniqueID());
>          if (Overridden != OverriddenFiles.end()) {
>            // This file was remapped; check whether the newly-mapped file
>            // matches up with the previous mapping.
> @@ -1418,13 +1432,9 @@ ASTUnit::getMainBufferWithPrecompiledPre
>          }
>
>          // The file was not remapped; check whether it has changed on
> disk.
> -        vfs::Status Status;
> -        if (FileMgr->getNoncachedStatValue(F->first(), Status)) {
> -          // If we can't stat the file, assume that something horrible
> happened.
> -          AnyFileChanged = true;
> -        } else if (Status.getSize() != uint64_t(F->second.Size) ||
> -                   Status.getLastModificationTime().toEpochTime() !=
> -                       uint64_t(F->second.ModTime))
> +        if (Status.getSize() != uint64_t(F->second.Size) ||
> +            Status.getLastModificationTime().toEpochTime() !=
> +                uint64_t(F->second.ModTime))
>            AnyFileChanged = true;
>        }
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160517/354e4599/attachment.html>


More information about the cfe-commits mailing list