From 9ee35f9f35452dec05c81fd1bbdd2f700872ea7f Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Thu, 5 Apr 2012 17:09:40 +0000 Subject: [PATCH] [Lex] HeaderSearch: Introduce a FrameworkCacheEntry structure to hold the FrameworkMap items. - No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@154104 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Lex/HeaderSearch.h | 11 ++++++++--- lib/Lex/HeaderSearch.cpp | 24 +++++++++++------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff --git a/include/clang/Lex/HeaderSearch.h b/include/clang/Lex/HeaderSearch.h index 8ed2ec3362..ab520bea55 100644 --- a/include/clang/Lex/HeaderSearch.h +++ b/include/clang/Lex/HeaderSearch.h @@ -120,6 +120,12 @@ public: /// HeaderSearch - This class encapsulates the information needed to find the /// file referenced by a #include or #include_next, (sub-)framework lookup, etc. class HeaderSearch { + /// This structure is used to record entries in our framework cache. + struct FrameworkCacheEntry { + /// The directory entry which should be used for the cached framework. + const DirectoryEntry *Directory; + }; + FileManager &FileMgr; DiagnosticsEngine &Diags; /// #include search path information. Requests for #include "x" search the @@ -152,8 +158,7 @@ class HeaderSearch { /// FrameworkMap - This is a collection mapping a framework or subframework /// name like "Carbon" to the Carbon.framework directory. - llvm::StringMap - FrameworkMap; + llvm::StringMap FrameworkMap; /// IncludeAliases - maps include file names (including the quotes or /// angle brackets) to other include file names. This is used to support the @@ -331,7 +336,7 @@ public: /// LookupFrameworkCache - Look up the specified framework name in our /// framework cache, returning the DirectoryEntry it is in if we know, /// otherwise, return null. - const DirectoryEntry *&LookupFrameworkCache(StringRef FWName) { + FrameworkCacheEntry &LookupFrameworkCache(StringRef FWName) { return FrameworkMap.GetOrCreateValue(FWName).getValue(); } diff --git a/lib/Lex/HeaderSearch.cpp b/lib/Lex/HeaderSearch.cpp index 383d9b4782..fe4257a6dd 100644 --- a/lib/Lex/HeaderSearch.cpp +++ b/lib/Lex/HeaderSearch.cpp @@ -275,12 +275,12 @@ const FileEntry *DirectoryLookup::DoFrameworkLookup( if (SlashPos == StringRef::npos) return 0; // Find out if this is the home for the specified framework, by checking - // HeaderSearch. Possible answer are yes/no and unknown. - const DirectoryEntry *&FrameworkDirCache = + // HeaderSearch. Possible answers are yes/no and unknown. + HeaderSearch::FrameworkCacheEntry &CacheEntry = HS.LookupFrameworkCache(Filename.substr(0, SlashPos)); // If it is known and in some other directory, fail. - if (FrameworkDirCache && FrameworkDirCache != getFrameworkDir()) + if (CacheEntry.Directory && CacheEntry.Directory != getFrameworkDir()) return 0; // Otherwise, construct the path to this framework dir. @@ -298,9 +298,8 @@ const FileEntry *DirectoryLookup::DoFrameworkLookup( // FrameworkName = "/System/Library/Frameworks/Cocoa.framework/" FrameworkName += ".framework/"; - // If the cache entry is still unresolved, query to see if the cache entry is - // still unresolved. If so, check its existence now. - if (FrameworkDirCache == 0) { + // If the cache entry was unresolved, populate it now. + if (CacheEntry.Directory == 0) { HS.IncrementFrameworkLookupCount(); // If the framework dir doesn't exist, we fail. @@ -310,7 +309,7 @@ const FileEntry *DirectoryLookup::DoFrameworkLookup( // Otherwise, if it does, remember that this is the right direntry for this // framework. - FrameworkDirCache = getFrameworkDir(); + CacheEntry.Directory = getFrameworkDir(); } if (RelativePath != NULL) { @@ -561,26 +560,25 @@ LookupSubframeworkHeader(StringRef Filename, FrameworkPos[DotFrameworkLen] != '\\')) return 0; - SmallString<1024> FrameworkName(ContextName, - FrameworkPos+DotFrameworkLen+1); + SmallString<1024> FrameworkName(ContextName, FrameworkPos+DotFrameworkLen+1); // Append Frameworks/HIToolbox.framework/ FrameworkName += "Frameworks/"; FrameworkName.append(Filename.begin(), Filename.begin()+SlashPos); FrameworkName += ".framework/"; - llvm::StringMapEntry &CacheLookup = + llvm::StringMapEntry &CacheLookup = FrameworkMap.GetOrCreateValue(Filename.substr(0, SlashPos)); // Some other location? - if (CacheLookup.getValue() && + if (CacheLookup.getValue().Directory && CacheLookup.getKeyLength() == FrameworkName.size() && memcmp(CacheLookup.getKeyData(), &FrameworkName[0], CacheLookup.getKeyLength()) != 0) return 0; // Cache subframework. - if (CacheLookup.getValue() == 0) { + if (CacheLookup.getValue().Directory == 0) { ++NumSubFrameworkLookups; // If the framework dir doesn't exist, we fail. @@ -589,7 +587,7 @@ LookupSubframeworkHeader(StringRef Filename, // Otherwise, if it does, remember that this is the right direntry for this // framework. - CacheLookup.setValue(Dir); + CacheLookup.getValue().Directory = Dir; } const FileEntry *FE = 0; -- 2.40.0