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

Argyrios Kyrtzidis akyrtzi at gmail.com
Tue Mar 11 09:35:47 PDT 2014


On Mar 11, 2014, at 7:48 AM, NAKAMURA Takumi <geek4civic at gmail.com> wrote:

> 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.

Ah, thanks for taking care of it!

> 
>> +  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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140311/139e8cb5/attachment.html>


More information about the cfe-commits mailing list