r203542 - [HeaderSearch] Fix issue where if a headermap entry maps the filename to a framework import (non-absolute path)

NAKAMURA Takumi geek4civic at gmail.com
Tue Mar 11 07:48:26 PDT 2014


2014-03-11 15:21 GMT+09:00 Argyrios Kyrtzidis <akyrtzi at gmail.com>:
> Author: akirtzidis
> Date: Tue Mar 11 01:21:28 2014
> New Revision: 203542
>
> URL: http://llvm.org/viewvc/llvm-project?rev=203542&view=rev
> Log:
> [HeaderSearch] Fix issue where if a headermap entry maps the filename to a framework import (non-absolute path)
> then we fail to find it if it is re-included later on.
>
> rdar://16285490
>
> Modified:
>     cfe/trunk/include/clang/Lex/DirectoryLookup.h
>     cfe/trunk/include/clang/Lex/HeaderSearch.h
>     cfe/trunk/lib/Lex/HeaderSearch.cpp
>     cfe/trunk/test/Preprocessor/headermap-rel.c
>
> Modified: cfe/trunk/include/clang/Lex/DirectoryLookup.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/DirectoryLookup.h?rev=203542&r1=203541&r2=203542&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Lex/DirectoryLookup.h (original)
> +++ cfe/trunk/include/clang/Lex/DirectoryLookup.h Tue Mar 11 01:21:28 2014
> @@ -170,6 +170,7 @@ public:
>                                SmallVectorImpl<char> *RelativePath,
>                                ModuleMap::KnownHeader *SuggestedModule,
>                                bool &InUserSpecifiedSystemFramework,
> +                              bool &HasBeenMapped,
>                                SmallVectorImpl<char> &MappedName) const;
>
>  private:
>
> Modified: cfe/trunk/include/clang/Lex/HeaderSearch.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearch.h?rev=203542&r1=203541&r2=203542&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Lex/HeaderSearch.h (original)
> +++ cfe/trunk/include/clang/Lex/HeaderSearch.h Tue Mar 11 01:21:28 2014
> @@ -186,15 +186,19 @@ class HeaderSearch {
>    /// included, indexed by the FileEntry's UID.
>    std::vector<HeaderFileInfo> FileInfo;
>
> -  /// \brief Keeps track of each lookup performed by LookupFile.
> -  ///
> -  /// The first part of the value is the starting index in SearchDirs
> -  /// that the cached search was performed from.  If there is a hit and
> -  /// this value doesn't match the current query, the cache has to be
> -  /// ignored.  The second value is the entry in SearchDirs that satisfied
> -  /// the query.
> -  llvm::StringMap<std::pair<unsigned, unsigned>, llvm::BumpPtrAllocator>
> -    LookupFileCache;
> +  /// Keeps track of each lookup performed by LookupFile.
> +  struct LookupFileCacheInfo {
> +    /// Starting index in SearchDirs that the cached search was performed from.
> +    /// If there is a hit and this value doesn't match the current query, the
> +    /// cache has to be ignored.
> +    unsigned StartIdx = 0;
> +    /// The entry in SearchDirs that satisfied the query.
> +    unsigned HitIdx = 0;
> +    /// This is non-null if the original filename was mapped to a framework
> +    /// include via a headermap.
> +    const char *MappedName = nullptr;
> +  };

Unfortunately, non-static member initializer is unavailable in msvc
2012. Fixed in r203554.

> +  llvm::StringMap<LookupFileCacheInfo, llvm::BumpPtrAllocator> LookupFileCache;
>
>    /// \brief Collection mapping a framework or subframework
>    /// name like "Carbon" to the Carbon.framework directory.
>
> Modified: cfe/trunk/lib/Lex/HeaderSearch.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=203542&r1=203541&r2=203542&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Lex/HeaderSearch.cpp (original)
> +++ cfe/trunk/lib/Lex/HeaderSearch.cpp Tue Mar 11 01:21:28 2014
> @@ -255,8 +255,10 @@ const FileEntry *DirectoryLookup::Lookup
>      SmallVectorImpl<char> *RelativePath,
>      ModuleMap::KnownHeader *SuggestedModule,
>      bool &InUserSpecifiedSystemFramework,
> +    bool &HasBeenMapped,
>      SmallVectorImpl<char> &MappedName) const {
>    InUserSpecifiedSystemFramework = false;
> +  HasBeenMapped = false;
>
>    SmallString<1024> TmpDir;
>    if (isNormalDir()) {
> @@ -298,6 +300,7 @@ const FileEntry *DirectoryLookup::Lookup
>      MappedName.clear();
>      MappedName.append(Dest.begin(), Dest.end());
>      Filename = StringRef(MappedName.begin(), MappedName.size());
> +    HasBeenMapped = true;
>      Result = HM->LookupFile(Filename, HS.getFileMgr());
>
>    } else {
> @@ -533,6 +536,14 @@ static bool checkMSVCHeaderSearch(Diagno
>    return false;
>  }
>
> +static const char *copyString(StringRef Str, llvm::BumpPtrAllocator &Alloc) {
> +  assert(!Str.empty());
> +  char *CopyStr = Alloc.Allocate<char>(Str.size()+1);
> +  std::copy(Str.begin(), Str.end(), CopyStr);
> +  CopyStr[Str.size()] = '\0';
> +  return CopyStr;
> +}
> +
>  /// LookupFile - Given a "foo" or \<foo> reference, look up the indicated file,
>  /// return null on failure.  isAngled indicates whether the file reference is
>  /// for system \#include's or not (i.e. using <> instead of ""). Includers, if
> @@ -673,20 +684,22 @@ const FileEntry *HeaderSearch::LookupFil
>    // multiply included, and the "pragma once" optimization prevents them from
>    // being relex/pp'd, but they would still have to search through a
>    // (potentially huge) series of SearchDirs to find it.
> -  std::pair<unsigned, unsigned> &CacheLookup =
> +  LookupFileCacheInfo &CacheLookup =
>      LookupFileCache.GetOrCreateValue(Filename).getValue();
>
>    // If the entry has been previously looked up, the first value will be
>    // non-zero.  If the value is equal to i (the start point of our search), then
>    // this is a matching hit.
> -  if (!SkipCache && CacheLookup.first == i+1) {
> +  if (!SkipCache && CacheLookup.StartIdx == i+1) {
>      // Skip querying potentially lots of directories for this lookup.
> -    i = CacheLookup.second;
> +    i = CacheLookup.HitIdx;
> +    if (CacheLookup.MappedName)
> +      Filename = CacheLookup.MappedName;
>    } else {
>      // Otherwise, this is the first query, or the previous query didn't match
>      // our search start.  We will fill in our found location below, so prime the
>      // start point value.
> -    CacheLookup.first = i+1;
> +    CacheLookup.StartIdx = i+1;
>    }
>
>    SmallString<64> MappedName;
> @@ -694,10 +707,15 @@ const FileEntry *HeaderSearch::LookupFil
>    // Check each directory in sequence to see if it contains this file.
>    for (; i != SearchDirs.size(); ++i) {
>      bool InUserSpecifiedSystemFramework = false;
> +    bool HasBeenMapped = false;
>      const FileEntry *FE =
>        SearchDirs[i].LookupFile(Filename, *this, SearchPath, RelativePath,
>                                 SuggestedModule, InUserSpecifiedSystemFramework,
> -                               MappedName);
> +                               HasBeenMapped, MappedName);
> +    if (HasBeenMapped) {
> +      CacheLookup.MappedName =
> +          copyString(Filename, LookupFileCache.getAllocator());
> +    }
>      if (!FE) continue;
>
>      CurDir = &SearchDirs[i];
> @@ -740,7 +758,7 @@ const FileEntry *HeaderSearch::LookupFil
>      }
>
>      // Remember this location for the next lookup we do.
> -    CacheLookup.second = i;
> +    CacheLookup.HitIdx = i;
>      return FE;
>    }
>
> @@ -767,10 +785,10 @@ const FileEntry *HeaderSearch::LookupFil
>          return MSFE;
>        }
>
> -      std::pair<unsigned, unsigned> &CacheLookup
> +      LookupFileCacheInfo &CacheLookup
>          = LookupFileCache.GetOrCreateValue(Filename).getValue();
> -      CacheLookup.second
> -        = LookupFileCache.GetOrCreateValue(ScratchFilename).getValue().second;
> +      CacheLookup.HitIdx
> +        = LookupFileCache.GetOrCreateValue(ScratchFilename).getValue().HitIdx;
>        // FIXME: SuggestedModule.
>        return FE;
>      }
> @@ -783,7 +801,7 @@ const FileEntry *HeaderSearch::LookupFil
>    }
>
>    // Otherwise, didn't find it. Remember we didn't find this.
> -  CacheLookup.second = SearchDirs.size();
> +  CacheLookup.HitIdx = SearchDirs.size();
>    return 0;
>  }
>
>
> Modified: cfe/trunk/test/Preprocessor/headermap-rel.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/headermap-rel.c?rev=203542&r1=203541&r2=203542&view=diff
> ==============================================================================
> --- cfe/trunk/test/Preprocessor/headermap-rel.c (original)
> +++ cfe/trunk/test/Preprocessor/headermap-rel.c Tue Mar 11 01:21:28 2014
> @@ -6,5 +6,7 @@
>  // RUN: FileCheck %s -input-file %t.i
>
>  // CHECK: Foo.h is parsed
> +// CHECK: Foo.h is parsed
>
>  #include "Foo.h"
> +#include "Foo.h"
>
>
> _______________________________________________
> 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