r209922 - Invalidate the file system cache entries for files that may rebuild
Argyrios Kyrtzidis
kyrtzidis at apple.com
Fri May 30 15:32:09 PDT 2014
LGTM!
> On May 30, 2014, at 2:20 PM, Ben Langmuir <blangmuir at apple.com> wrote:
>
> Author: benlangmuir
> Date: Fri May 30 16:20:54 2014
> New Revision: 209922
>
> URL: http://llvm.org/viewvc/llvm-project?rev=209922&view=rev
> Log:
> Invalidate the file system cache entries for files that may rebuild
>
> This reapplies r209910 with a fix for the assertion failures hit on the
> buildbots.
>
> original commit message:
> I thought we could get away without this, but it means that the
> FileEntry objects actually refer to the wrong files, since pcms are not
> updated inplace, they are atomically renamed into place after compiling
> a module.
>
> So we are close to the original behaviour of invalidating the cache for
> all modules being removed, but now we should only invalidate the ones
> that depend on whichever module failed to load.
>
> Unfortunately I haven't come up with a new test that didn't require
> a race between parallel invocations of clang.
>
> <rdar://problem/17038180>
>
> Modified:
> cfe/trunk/lib/Serialization/ModuleManager.cpp
>
> Modified: cfe/trunk/lib/Serialization/ModuleManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ModuleManager.cpp?rev=209922&r1=209921&r2=209922&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ModuleManager.cpp (original)
> +++ cfe/trunk/lib/Serialization/ModuleManager.cpp Fri May 30 16:20:54 2014
> @@ -135,19 +135,31 @@ ModuleManager::addModule(StringRef FileN
> return NewModule? NewlyLoaded : AlreadyLoaded;
> }
>
> +static void getModuleFileAncestors(
> + ModuleFile *F,
> + llvm::SmallPtrSetImpl<ModuleFile *> &Ancestors) {
> + Ancestors.insert(F);
> + for (ModuleFile *Importer : F->ImportedBy)
> + getModuleFileAncestors(Importer, Ancestors);
> +}
> +
> void ModuleManager::removeModules(ModuleIterator first, ModuleIterator last,
> ModuleMap *modMap) {
> if (first == last)
> return;
>
> - // The first file entry is about to be rebuilt (or there was an error), so
> - // there should be no references to it. Remove it from the cache to close it,
> - // as Windows doesn't seem to allow renaming over an open file.
> - FileMgr.invalidateCache((*first)->File);
> -
> // Collect the set of module file pointers that we'll be removing.
> llvm::SmallPtrSet<ModuleFile *, 4> victimSet(first, last);
>
> + // The last module file caused the load failure, so it and its ancestors in
> + // the module dependency tree will be rebuilt (or there was an error), so
> + // there should be no references to them. Collect the files to remove from
> + // the cache below, since rebuilding them will create new files at the old
> + // locations.
> + llvm::SmallPtrSet<ModuleFile *, 4> Ancestors;
> + getModuleFileAncestors(*(last-1), Ancestors);
> + assert(Ancestors.count(*first) && "non-dependent module loaded");
> +
> // Remove any references to the now-destroyed modules.
> for (unsigned i = 0, n = Chain.size(); i != n; ++i) {
> Chain[i]->ImportedBy.remove_if([&](ModuleFile *MF) {
> @@ -165,6 +177,10 @@ void ModuleManager::removeModules(Module
> mod->setASTFile(nullptr);
> }
> }
> +
> + if (Ancestors.count(*victim))
> + FileMgr.invalidateCache((*victim)->File);
> +
> delete *victim;
> }
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list