1 //===--- HeaderSearch.cpp - Resolve Header File Locations ---===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  This file implements the DirectoryLookup and HeaderSearch interfaces.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "clang/Lex/HeaderSearch.h"
15 #include "clang/Lex/HeaderMap.h"
16 #include "clang/Basic/Diagnostic.h"
17 #include "clang/Basic/FileManager.h"
18 #include "clang/Basic/IdentifierTable.h"
19 #include "llvm/Support/FileSystem.h"
20 #include "llvm/Support/Path.h"
21 #include "llvm/ADT/SmallString.h"
22 #include "llvm/Support/Capacity.h"
23 #include <cstdio>
24 using namespace clang;
25 
26 const IdentifierInfo *
27 HeaderFileInfo::getControllingMacro(ExternalIdentifierLookup *External) {
28   if (ControllingMacro)
29     return ControllingMacro;
30 
31   if (!ControllingMacroID || !External)
32     return 0;
33 
34   ControllingMacro = External->GetIdentifier(ControllingMacroID);
35   return ControllingMacro;
36 }
37 
38 ExternalHeaderFileInfoSource::~ExternalHeaderFileInfoSource() {}
39 
40 HeaderSearch::HeaderSearch(FileManager &FM, DiagnosticsEngine &Diags)
41   : FileMgr(FM), Diags(Diags), FrameworkMap(64),
42     ModMap(FileMgr, *Diags.getClient())
43 {
44   AngledDirIdx = 0;
45   SystemDirIdx = 0;
46   NoCurDirSearch = false;
47 
48   ExternalLookup = 0;
49   ExternalSource = 0;
50   NumIncluded = 0;
51   NumMultiIncludeFileOptzn = 0;
52   NumFrameworkLookups = NumSubFrameworkLookups = 0;
53 }
54 
55 HeaderSearch::~HeaderSearch() {
56   // Delete headermaps.
57   for (unsigned i = 0, e = HeaderMaps.size(); i != e; ++i)
58     delete HeaderMaps[i].second;
59 }
60 
61 void HeaderSearch::PrintStats() {
62   fprintf(stderr, "\n*** HeaderSearch Stats:\n");
63   fprintf(stderr, "%d files tracked.\n", (int)FileInfo.size());
64   unsigned NumOnceOnlyFiles = 0, MaxNumIncludes = 0, NumSingleIncludedFiles = 0;
65   for (unsigned i = 0, e = FileInfo.size(); i != e; ++i) {
66     NumOnceOnlyFiles += FileInfo[i].isImport;
67     if (MaxNumIncludes < FileInfo[i].NumIncludes)
68       MaxNumIncludes = FileInfo[i].NumIncludes;
69     NumSingleIncludedFiles += FileInfo[i].NumIncludes == 1;
70   }
71   fprintf(stderr, "  %d #import/#pragma once files.\n", NumOnceOnlyFiles);
72   fprintf(stderr, "  %d included exactly once.\n", NumSingleIncludedFiles);
73   fprintf(stderr, "  %d max times a file is included.\n", MaxNumIncludes);
74 
75   fprintf(stderr, "  %d #include/#include_next/#import.\n", NumIncluded);
76   fprintf(stderr, "    %d #includes skipped due to"
77           " the multi-include optimization.\n", NumMultiIncludeFileOptzn);
78 
79   fprintf(stderr, "%d framework lookups.\n", NumFrameworkLookups);
80   fprintf(stderr, "%d subframework lookups.\n", NumSubFrameworkLookups);
81 }
82 
83 /// CreateHeaderMap - This method returns a HeaderMap for the specified
84 /// FileEntry, uniquing them through the the 'HeaderMaps' datastructure.
85 const HeaderMap *HeaderSearch::CreateHeaderMap(const FileEntry *FE) {
86   // We expect the number of headermaps to be small, and almost always empty.
87   // If it ever grows, use of a linear search should be re-evaluated.
88   if (!HeaderMaps.empty()) {
89     for (unsigned i = 0, e = HeaderMaps.size(); i != e; ++i)
90       // Pointer equality comparison of FileEntries works because they are
91       // already uniqued by inode.
92       if (HeaderMaps[i].first == FE)
93         return HeaderMaps[i].second;
94   }
95 
96   if (const HeaderMap *HM = HeaderMap::Create(FE, FileMgr)) {
97     HeaderMaps.push_back(std::make_pair(FE, HM));
98     return HM;
99   }
100 
101   return 0;
102 }
103 
104 const FileEntry *HeaderSearch::lookupModule(StringRef ModuleName,
105                                             std::string *ModuleFileName,
106                                             std::string *UmbrellaHeader) {
107   // If we don't have a module cache path, we can't do anything.
108   if (ModuleCachePath.empty()) {
109     if (ModuleFileName)
110       ModuleFileName->clear();
111     return 0;
112   }
113 
114   // Try to find the module path.
115   llvm::SmallString<256> FileName(ModuleCachePath);
116   llvm::sys::path::append(FileName, ModuleName + ".pcm");
117   if (ModuleFileName)
118     *ModuleFileName = FileName.str();
119 
120   if (const FileEntry *ModuleFile
121         = getFileMgr().getFile(FileName, /*OpenFile=*/false,
122                                /*CacheFailure=*/false))
123     return ModuleFile;
124 
125   // We didn't find the module. If we're not supposed to look for an
126   // umbrella header, this is the end of the road.
127   if (!UmbrellaHeader)
128     return 0;
129 
130   // Look in the module map to determine if there is a module by this name.
131   ModuleMap::Module *Module = ModMap.findModule(ModuleName);
132   if (!Module) {
133     // Look through the various header search paths to load any avaiable module
134     // maps, searching for a module map that describes this module.
135     for (unsigned Idx = 0, N = SearchDirs.size(); Idx != N; ++Idx) {
136       // Skip non-normal include paths
137       if (!SearchDirs[Idx].isNormalDir())
138         continue;
139 
140       // Search for a module map file in this directory.
141       if (loadModuleMapFile(SearchDirs[Idx].getDir()) == LMM_NewlyLoaded) {
142         // We just loaded a module map file; check whether the module is
143         // available now.
144         Module = ModMap.findModule(ModuleName);
145         if (Module)
146           break;
147       }
148 
149       // Search for a module map in a subdirectory with the same name as the
150       // module.
151       llvm::SmallString<128> NestedModuleMapDirName;
152       NestedModuleMapDirName = SearchDirs[Idx].getDir()->getName();
153       llvm::sys::path::append(NestedModuleMapDirName, ModuleName);
154       if (loadModuleMapFile(NestedModuleMapDirName) == LMM_NewlyLoaded) {
155         // If we just loaded a module map file, look for the module again.
156         Module = ModMap.findModule(ModuleName);
157         if (Module)
158           break;
159       }
160     }
161   }
162 
163   // If we have a module with an umbrella header
164   // FIXME: Even if it doesn't have an umbrella header, we should be able to
165   // handle the module. However, the caller isn't ready for that yet.
166   if (Module && Module->UmbrellaHeader) {
167     *UmbrellaHeader = Module->UmbrellaHeader->getName();
168     return 0;
169   }
170 
171   // Look in each of the framework directories for an umbrella header with
172   // the same name as the module.
173   llvm::SmallString<128> UmbrellaHeaderName;
174   UmbrellaHeaderName = ModuleName;
175   UmbrellaHeaderName += '/';
176   UmbrellaHeaderName += ModuleName;
177   UmbrellaHeaderName += ".h";
178   for (unsigned Idx = 0, N = SearchDirs.size(); Idx != N; ++Idx) {
179     // Skip non-framework include paths
180     if (!SearchDirs[Idx].isFramework())
181       continue;
182 
183     // Look for the umbrella header in this directory.
184     if (const FileEntry *HeaderFile
185           = SearchDirs[Idx].LookupFile(UmbrellaHeaderName, *this, 0, 0,
186                                        StringRef(), 0)) {
187       *UmbrellaHeader = HeaderFile->getName();
188       return 0;
189     }
190   }
191 
192   // We did not find an umbrella header. Clear out the UmbrellaHeader pointee
193   // so our caller knows that we failed.
194   UmbrellaHeader->clear();
195   return 0;
196 }
197 
198 //===----------------------------------------------------------------------===//
199 // File lookup within a DirectoryLookup scope
200 //===----------------------------------------------------------------------===//
201 
202 /// getName - Return the directory or filename corresponding to this lookup
203 /// object.
204 const char *DirectoryLookup::getName() const {
205   if (isNormalDir())
206     return getDir()->getName();
207   if (isFramework())
208     return getFrameworkDir()->getName();
209   assert(isHeaderMap() && "Unknown DirectoryLookup");
210   return getHeaderMap()->getFileName();
211 }
212 
213 
214 /// LookupFile - Lookup the specified file in this search path, returning it
215 /// if it exists or returning null if not.
216 const FileEntry *DirectoryLookup::LookupFile(
217     StringRef Filename,
218     HeaderSearch &HS,
219     SmallVectorImpl<char> *SearchPath,
220     SmallVectorImpl<char> *RelativePath,
221     StringRef BuildingModule,
222     StringRef *SuggestedModule) const {
223   llvm::SmallString<1024> TmpDir;
224   if (isNormalDir()) {
225     // Concatenate the requested file onto the directory.
226     TmpDir = getDir()->getName();
227     llvm::sys::path::append(TmpDir, Filename);
228     if (SearchPath != NULL) {
229       StringRef SearchPathRef(getDir()->getName());
230       SearchPath->clear();
231       SearchPath->append(SearchPathRef.begin(), SearchPathRef.end());
232     }
233     if (RelativePath != NULL) {
234       RelativePath->clear();
235       RelativePath->append(Filename.begin(), Filename.end());
236     }
237 
238     // If we have a module map that might map this header, load it and
239     // check whether we'll have a suggestion for a module.
240     if (SuggestedModule && HS.hasModuleMap(TmpDir, getDir())) {
241       const FileEntry *File = HS.getFileMgr().getFile(TmpDir.str(),
242                                                       /*openFile=*/false);
243       if (!File)
244         return File;
245 
246       // If there is a module that corresponds to this header,
247       // suggest it.
248       StringRef Module = HS.findModuleForHeader(File);
249       if (!Module.empty() && Module != BuildingModule)
250         *SuggestedModule = Module;
251 
252       return File;
253     }
254 
255     return HS.getFileMgr().getFile(TmpDir.str(), /*openFile=*/true);
256   }
257 
258   if (isFramework())
259     return DoFrameworkLookup(Filename, HS, SearchPath, RelativePath,
260                              BuildingModule, SuggestedModule);
261 
262   assert(isHeaderMap() && "Unknown directory lookup");
263   const FileEntry * const Result = getHeaderMap()->LookupFile(
264       Filename, HS.getFileMgr());
265   if (Result) {
266     if (SearchPath != NULL) {
267       StringRef SearchPathRef(getName());
268       SearchPath->clear();
269       SearchPath->append(SearchPathRef.begin(), SearchPathRef.end());
270     }
271     if (RelativePath != NULL) {
272       RelativePath->clear();
273       RelativePath->append(Filename.begin(), Filename.end());
274     }
275   }
276   return Result;
277 }
278 
279 
280 /// DoFrameworkLookup - Do a lookup of the specified file in the current
281 /// DirectoryLookup, which is a framework directory.
282 const FileEntry *DirectoryLookup::DoFrameworkLookup(
283     StringRef Filename,
284     HeaderSearch &HS,
285     SmallVectorImpl<char> *SearchPath,
286     SmallVectorImpl<char> *RelativePath,
287     StringRef BuildingModule,
288     StringRef *SuggestedModule) const
289 {
290   FileManager &FileMgr = HS.getFileMgr();
291 
292   // Framework names must have a '/' in the filename.
293   size_t SlashPos = Filename.find('/');
294   if (SlashPos == StringRef::npos) return 0;
295 
296   // Find out if this is the home for the specified framework, by checking
297   // HeaderSearch.  Possible answer are yes/no and unknown.
298   const DirectoryEntry *&FrameworkDirCache =
299     HS.LookupFrameworkCache(Filename.substr(0, SlashPos));
300 
301   // If it is known and in some other directory, fail.
302   if (FrameworkDirCache && FrameworkDirCache != getFrameworkDir())
303     return 0;
304 
305   // Otherwise, construct the path to this framework dir.
306 
307   // FrameworkName = "/System/Library/Frameworks/"
308   llvm::SmallString<1024> FrameworkName;
309   FrameworkName += getFrameworkDir()->getName();
310   if (FrameworkName.empty() || FrameworkName.back() != '/')
311     FrameworkName.push_back('/');
312 
313   // FrameworkName = "/System/Library/Frameworks/Cocoa"
314   FrameworkName.append(Filename.begin(), Filename.begin()+SlashPos);
315 
316   // FrameworkName = "/System/Library/Frameworks/Cocoa.framework/"
317   FrameworkName += ".framework/";
318 
319   // If the cache entry is still unresolved, query to see if the cache entry is
320   // still unresolved.  If so, check its existence now.
321   if (FrameworkDirCache == 0) {
322     HS.IncrementFrameworkLookupCount();
323 
324     // If the framework dir doesn't exist, we fail.
325     // FIXME: It's probably more efficient to query this with FileMgr.getDir.
326     bool Exists;
327     if (llvm::sys::fs::exists(FrameworkName.str(), Exists) || !Exists)
328       return 0;
329 
330     // Otherwise, if it does, remember that this is the right direntry for this
331     // framework.
332     FrameworkDirCache = getFrameworkDir();
333   }
334 
335   if (RelativePath != NULL) {
336     RelativePath->clear();
337     RelativePath->append(Filename.begin()+SlashPos+1, Filename.end());
338   }
339 
340   // Check "/System/Library/Frameworks/Cocoa.framework/Headers/file.h"
341   unsigned OrigSize = FrameworkName.size();
342 
343   FrameworkName += "Headers/";
344 
345   if (SearchPath != NULL) {
346     SearchPath->clear();
347     // Without trailing '/'.
348     SearchPath->append(FrameworkName.begin(), FrameworkName.end()-1);
349   }
350 
351   /// Determine whether this is the module we're building or not.
352   bool AutomaticImport = SuggestedModule &&
353     (BuildingModule != StringRef(Filename.begin(), SlashPos)) &&
354     !Filename.substr(SlashPos + 1).startswith("..");
355 
356   FrameworkName.append(Filename.begin()+SlashPos+1, Filename.end());
357   if (const FileEntry *FE = FileMgr.getFile(FrameworkName.str(),
358                                             /*openFile=*/!AutomaticImport)) {
359     if (AutomaticImport)
360       *SuggestedModule = StringRef(Filename.begin(), SlashPos);
361     return FE;
362   }
363 
364   // Check "/System/Library/Frameworks/Cocoa.framework/PrivateHeaders/file.h"
365   const char *Private = "Private";
366   FrameworkName.insert(FrameworkName.begin()+OrigSize, Private,
367                        Private+strlen(Private));
368   if (SearchPath != NULL)
369     SearchPath->insert(SearchPath->begin()+OrigSize, Private,
370                        Private+strlen(Private));
371 
372   const FileEntry *FE = FileMgr.getFile(FrameworkName.str(),
373                                         /*openFile=*/!AutomaticImport);
374   if (FE && AutomaticImport)
375     *SuggestedModule = StringRef(Filename.begin(), SlashPos);
376   return FE;
377 }
378 
379 
380 //===----------------------------------------------------------------------===//
381 // Header File Location.
382 //===----------------------------------------------------------------------===//
383 
384 
385 /// LookupFile - Given a "foo" or <foo> reference, look up the indicated file,
386 /// return null on failure.  isAngled indicates whether the file reference is
387 /// for system #include's or not (i.e. using <> instead of "").  CurFileEnt, if
388 /// non-null, indicates where the #including file is, in case a relative search
389 /// is needed.
390 const FileEntry *HeaderSearch::LookupFile(
391     StringRef Filename,
392     bool isAngled,
393     const DirectoryLookup *FromDir,
394     const DirectoryLookup *&CurDir,
395     const FileEntry *CurFileEnt,
396     SmallVectorImpl<char> *SearchPath,
397     SmallVectorImpl<char> *RelativePath,
398     StringRef *SuggestedModule)
399 {
400   if (SuggestedModule)
401     *SuggestedModule = StringRef();
402 
403   // If 'Filename' is absolute, check to see if it exists and no searching.
404   if (llvm::sys::path::is_absolute(Filename)) {
405     CurDir = 0;
406 
407     // If this was an #include_next "/absolute/file", fail.
408     if (FromDir) return 0;
409 
410     if (SearchPath != NULL)
411       SearchPath->clear();
412     if (RelativePath != NULL) {
413       RelativePath->clear();
414       RelativePath->append(Filename.begin(), Filename.end());
415     }
416     // Otherwise, just return the file.
417     return FileMgr.getFile(Filename, /*openFile=*/true);
418   }
419 
420   // Unless disabled, check to see if the file is in the #includer's
421   // directory.  This has to be based on CurFileEnt, not CurDir, because
422   // CurFileEnt could be a #include of a subdirectory (#include "foo/bar.h") and
423   // a subsequent include of "baz.h" should resolve to "whatever/foo/baz.h".
424   // This search is not done for <> headers.
425   if (CurFileEnt && !isAngled && !NoCurDirSearch) {
426     llvm::SmallString<1024> TmpDir;
427     // Concatenate the requested file onto the directory.
428     // FIXME: Portability.  Filename concatenation should be in sys::Path.
429     TmpDir += CurFileEnt->getDir()->getName();
430     TmpDir.push_back('/');
431     TmpDir.append(Filename.begin(), Filename.end());
432     if (const FileEntry *FE = FileMgr.getFile(TmpDir.str(),/*openFile=*/true)) {
433       // Leave CurDir unset.
434       // This file is a system header or C++ unfriendly if the old file is.
435       //
436       // Note that the temporary 'DirInfo' is required here, as either call to
437       // getFileInfo could resize the vector and we don't want to rely on order
438       // of evaluation.
439       unsigned DirInfo = getFileInfo(CurFileEnt).DirInfo;
440       getFileInfo(FE).DirInfo = DirInfo;
441       if (SearchPath != NULL) {
442         StringRef SearchPathRef(CurFileEnt->getDir()->getName());
443         SearchPath->clear();
444         SearchPath->append(SearchPathRef.begin(), SearchPathRef.end());
445       }
446       if (RelativePath != NULL) {
447         RelativePath->clear();
448         RelativePath->append(Filename.begin(), Filename.end());
449       }
450       return FE;
451     }
452   }
453 
454   CurDir = 0;
455 
456   // If this is a system #include, ignore the user #include locs.
457   unsigned i = isAngled ? AngledDirIdx : 0;
458 
459   // If this is a #include_next request, start searching after the directory the
460   // file was found in.
461   if (FromDir)
462     i = FromDir-&SearchDirs[0];
463 
464   // Cache all of the lookups performed by this method.  Many headers are
465   // multiply included, and the "pragma once" optimization prevents them from
466   // being relex/pp'd, but they would still have to search through a
467   // (potentially huge) series of SearchDirs to find it.
468   std::pair<unsigned, unsigned> &CacheLookup =
469     LookupFileCache.GetOrCreateValue(Filename).getValue();
470 
471   // If the entry has been previously looked up, the first value will be
472   // non-zero.  If the value is equal to i (the start point of our search), then
473   // this is a matching hit.
474   if (CacheLookup.first == i+1) {
475     // Skip querying potentially lots of directories for this lookup.
476     i = CacheLookup.second;
477   } else {
478     // Otherwise, this is the first query, or the previous query didn't match
479     // our search start.  We will fill in our found location below, so prime the
480     // start point value.
481     CacheLookup.first = i+1;
482   }
483 
484   // Check each directory in sequence to see if it contains this file.
485   for (; i != SearchDirs.size(); ++i) {
486     const FileEntry *FE =
487       SearchDirs[i].LookupFile(Filename, *this, SearchPath, RelativePath,
488                                BuildingModule, SuggestedModule);
489     if (!FE) continue;
490 
491     CurDir = &SearchDirs[i];
492 
493     // This file is a system header or C++ unfriendly if the dir is.
494     HeaderFileInfo &HFI = getFileInfo(FE);
495     HFI.DirInfo = CurDir->getDirCharacteristic();
496 
497     // If this file is found in a header map and uses the framework style of
498     // includes, then this header is part of a framework we're building.
499     if (CurDir->isIndexHeaderMap()) {
500       size_t SlashPos = Filename.find('/');
501       if (SlashPos != StringRef::npos) {
502         HFI.IndexHeaderMapHeader = 1;
503         HFI.Framework = getUniqueFrameworkName(StringRef(Filename.begin(),
504                                                          SlashPos));
505       }
506     }
507 
508     // Remember this location for the next lookup we do.
509     CacheLookup.second = i;
510     return FE;
511   }
512 
513   // If we are including a file with a quoted include "foo.h" from inside
514   // a header in a framework that is currently being built, and we couldn't
515   // resolve "foo.h" any other way, change the include to <Foo/foo.h>, where
516   // "Foo" is the name of the framework in which the including header was found.
517   if (CurFileEnt && !isAngled && Filename.find('/') == StringRef::npos) {
518     HeaderFileInfo &IncludingHFI = getFileInfo(CurFileEnt);
519     if (IncludingHFI.IndexHeaderMapHeader) {
520       llvm::SmallString<128> ScratchFilename;
521       ScratchFilename += IncludingHFI.Framework;
522       ScratchFilename += '/';
523       ScratchFilename += Filename;
524 
525       const FileEntry *Result = LookupFile(ScratchFilename, /*isAngled=*/true,
526                                            FromDir, CurDir, CurFileEnt,
527                                            SearchPath, RelativePath,
528                                            SuggestedModule);
529       std::pair<unsigned, unsigned> &CacheLookup
530         = LookupFileCache.GetOrCreateValue(Filename).getValue();
531       CacheLookup.second
532         = LookupFileCache.GetOrCreateValue(ScratchFilename).getValue().second;
533       return Result;
534     }
535   }
536 
537   // Otherwise, didn't find it. Remember we didn't find this.
538   CacheLookup.second = SearchDirs.size();
539   return 0;
540 }
541 
542 /// LookupSubframeworkHeader - Look up a subframework for the specified
543 /// #include file.  For example, if #include'ing <HIToolbox/HIToolbox.h> from
544 /// within ".../Carbon.framework/Headers/Carbon.h", check to see if HIToolbox
545 /// is a subframework within Carbon.framework.  If so, return the FileEntry
546 /// for the designated file, otherwise return null.
547 const FileEntry *HeaderSearch::
548 LookupSubframeworkHeader(StringRef Filename,
549                          const FileEntry *ContextFileEnt,
550                          SmallVectorImpl<char> *SearchPath,
551                          SmallVectorImpl<char> *RelativePath) {
552   assert(ContextFileEnt && "No context file?");
553 
554   // Framework names must have a '/' in the filename.  Find it.
555   size_t SlashPos = Filename.find('/');
556   if (SlashPos == StringRef::npos) return 0;
557 
558   // Look up the base framework name of the ContextFileEnt.
559   const char *ContextName = ContextFileEnt->getName();
560 
561   // If the context info wasn't a framework, couldn't be a subframework.
562   const char *FrameworkPos = strstr(ContextName, ".framework/");
563   if (FrameworkPos == 0)
564     return 0;
565 
566   llvm::SmallString<1024> FrameworkName(ContextName,
567                                         FrameworkPos+strlen(".framework/"));
568 
569   // Append Frameworks/HIToolbox.framework/
570   FrameworkName += "Frameworks/";
571   FrameworkName.append(Filename.begin(), Filename.begin()+SlashPos);
572   FrameworkName += ".framework/";
573 
574   llvm::StringMapEntry<const DirectoryEntry *> &CacheLookup =
575     FrameworkMap.GetOrCreateValue(Filename.substr(0, SlashPos));
576 
577   // Some other location?
578   if (CacheLookup.getValue() &&
579       CacheLookup.getKeyLength() == FrameworkName.size() &&
580       memcmp(CacheLookup.getKeyData(), &FrameworkName[0],
581              CacheLookup.getKeyLength()) != 0)
582     return 0;
583 
584   // Cache subframework.
585   if (CacheLookup.getValue() == 0) {
586     ++NumSubFrameworkLookups;
587 
588     // If the framework dir doesn't exist, we fail.
589     const DirectoryEntry *Dir = FileMgr.getDirectory(FrameworkName.str());
590     if (Dir == 0) return 0;
591 
592     // Otherwise, if it does, remember that this is the right direntry for this
593     // framework.
594     CacheLookup.setValue(Dir);
595   }
596 
597   const FileEntry *FE = 0;
598 
599   if (RelativePath != NULL) {
600     RelativePath->clear();
601     RelativePath->append(Filename.begin()+SlashPos+1, Filename.end());
602   }
603 
604   // Check ".../Frameworks/HIToolbox.framework/Headers/HIToolbox.h"
605   llvm::SmallString<1024> HeadersFilename(FrameworkName);
606   HeadersFilename += "Headers/";
607   if (SearchPath != NULL) {
608     SearchPath->clear();
609     // Without trailing '/'.
610     SearchPath->append(HeadersFilename.begin(), HeadersFilename.end()-1);
611   }
612 
613   HeadersFilename.append(Filename.begin()+SlashPos+1, Filename.end());
614   if (!(FE = FileMgr.getFile(HeadersFilename.str(), /*openFile=*/true))) {
615 
616     // Check ".../Frameworks/HIToolbox.framework/PrivateHeaders/HIToolbox.h"
617     HeadersFilename = FrameworkName;
618     HeadersFilename += "PrivateHeaders/";
619     if (SearchPath != NULL) {
620       SearchPath->clear();
621       // Without trailing '/'.
622       SearchPath->append(HeadersFilename.begin(), HeadersFilename.end()-1);
623     }
624 
625     HeadersFilename.append(Filename.begin()+SlashPos+1, Filename.end());
626     if (!(FE = FileMgr.getFile(HeadersFilename.str(), /*openFile=*/true)))
627       return 0;
628   }
629 
630   // This file is a system header or C++ unfriendly if the old file is.
631   //
632   // Note that the temporary 'DirInfo' is required here, as either call to
633   // getFileInfo could resize the vector and we don't want to rely on order
634   // of evaluation.
635   unsigned DirInfo = getFileInfo(ContextFileEnt).DirInfo;
636   getFileInfo(FE).DirInfo = DirInfo;
637   return FE;
638 }
639 
640 //===----------------------------------------------------------------------===//
641 // File Info Management.
642 //===----------------------------------------------------------------------===//
643 
644 /// \brief Merge the header file info provided by \p OtherHFI into the current
645 /// header file info (\p HFI)
646 static void mergeHeaderFileInfo(HeaderFileInfo &HFI,
647                                 const HeaderFileInfo &OtherHFI) {
648   HFI.isImport |= OtherHFI.isImport;
649   HFI.isPragmaOnce |= OtherHFI.isPragmaOnce;
650   HFI.NumIncludes += OtherHFI.NumIncludes;
651 
652   if (!HFI.ControllingMacro && !HFI.ControllingMacroID) {
653     HFI.ControllingMacro = OtherHFI.ControllingMacro;
654     HFI.ControllingMacroID = OtherHFI.ControllingMacroID;
655   }
656 
657   if (OtherHFI.External) {
658     HFI.DirInfo = OtherHFI.DirInfo;
659     HFI.External = OtherHFI.External;
660     HFI.IndexHeaderMapHeader = OtherHFI.IndexHeaderMapHeader;
661   }
662 
663   if (HFI.Framework.empty())
664     HFI.Framework = OtherHFI.Framework;
665 
666   HFI.Resolved = true;
667 }
668 
669 /// getFileInfo - Return the HeaderFileInfo structure for the specified
670 /// FileEntry.
671 HeaderFileInfo &HeaderSearch::getFileInfo(const FileEntry *FE) {
672   if (FE->getUID() >= FileInfo.size())
673     FileInfo.resize(FE->getUID()+1);
674 
675   HeaderFileInfo &HFI = FileInfo[FE->getUID()];
676   if (ExternalSource && !HFI.Resolved)
677     mergeHeaderFileInfo(HFI, ExternalSource->GetHeaderFileInfo(FE));
678   return HFI;
679 }
680 
681 bool HeaderSearch::isFileMultipleIncludeGuarded(const FileEntry *File) {
682   // Check if we've ever seen this file as a header.
683   if (File->getUID() >= FileInfo.size())
684     return false;
685 
686   // Resolve header file info from the external source, if needed.
687   HeaderFileInfo &HFI = FileInfo[File->getUID()];
688   if (ExternalSource && !HFI.Resolved)
689     mergeHeaderFileInfo(HFI, ExternalSource->GetHeaderFileInfo(File));
690 
691   return HFI.isPragmaOnce || HFI.ControllingMacro || HFI.ControllingMacroID;
692 }
693 
694 void HeaderSearch::setHeaderFileInfoForUID(HeaderFileInfo HFI, unsigned UID) {
695   if (UID >= FileInfo.size())
696     FileInfo.resize(UID+1);
697   HFI.Resolved = true;
698   FileInfo[UID] = HFI;
699 }
700 
701 /// ShouldEnterIncludeFile - Mark the specified file as a target of of a
702 /// #include, #include_next, or #import directive.  Return false if #including
703 /// the file will have no effect or true if we should include it.
704 bool HeaderSearch::ShouldEnterIncludeFile(const FileEntry *File, bool isImport){
705   ++NumIncluded; // Count # of attempted #includes.
706 
707   // Get information about this file.
708   HeaderFileInfo &FileInfo = getFileInfo(File);
709 
710   // If this is a #import directive, check that we have not already imported
711   // this header.
712   if (isImport) {
713     // If this has already been imported, don't import it again.
714     FileInfo.isImport = true;
715 
716     // Has this already been #import'ed or #include'd?
717     if (FileInfo.NumIncludes) return false;
718   } else {
719     // Otherwise, if this is a #include of a file that was previously #import'd
720     // or if this is the second #include of a #pragma once file, ignore it.
721     if (FileInfo.isImport)
722       return false;
723   }
724 
725   // Next, check to see if the file is wrapped with #ifndef guards.  If so, and
726   // if the macro that guards it is defined, we know the #include has no effect.
727   if (const IdentifierInfo *ControllingMacro
728       = FileInfo.getControllingMacro(ExternalLookup))
729     if (ControllingMacro->hasMacroDefinition()) {
730       ++NumMultiIncludeFileOptzn;
731       return false;
732     }
733 
734   // Increment the number of times this file has been included.
735   ++FileInfo.NumIncludes;
736 
737   return true;
738 }
739 
740 size_t HeaderSearch::getTotalMemory() const {
741   return SearchDirs.capacity()
742     + llvm::capacity_in_bytes(FileInfo)
743     + llvm::capacity_in_bytes(HeaderMaps)
744     + LookupFileCache.getAllocator().getTotalMemory()
745     + FrameworkMap.getAllocator().getTotalMemory();
746 }
747 
748 StringRef HeaderSearch::getUniqueFrameworkName(StringRef Framework) {
749   return FrameworkNames.GetOrCreateValue(Framework).getKey();
750 }
751 
752 bool HeaderSearch::hasModuleMap(StringRef FileName,
753                                 const DirectoryEntry *Root) {
754   llvm::SmallVector<const DirectoryEntry *, 2> FixUpDirectories;
755 
756   StringRef DirName = FileName;
757   do {
758     // Get the parent directory name.
759     DirName = llvm::sys::path::parent_path(DirName);
760     if (DirName.empty())
761       return false;
762 
763     // Determine whether this directory exists.
764     const DirectoryEntry *Dir = FileMgr.getDirectory(DirName);
765     if (!Dir)
766       return false;
767 
768     // Try to load the module map file in this directory.
769     switch (loadModuleMapFile(Dir)) {
770     case LMM_NewlyLoaded:
771     case LMM_AlreadyLoaded:
772       // Success. All of the directories we stepped through inherit this module
773       // map file.
774       for (unsigned I = 0, N = FixUpDirectories.size(); I != N; ++I)
775         DirectoryHasModuleMap[FixUpDirectories[I]] = true;
776 
777       return true;
778 
779     case LMM_NoDirectory:
780     case LMM_InvalidModuleMap:
781       break;
782     }
783 
784     // If we hit the top of our search, we're done.
785     if (Dir == Root)
786       return false;
787 
788     // Keep track of all of the directories we checked, so we can mark them as
789     // having module maps if we eventually do find a module map.
790     FixUpDirectories.push_back(Dir);
791   } while (true);
792 
793   return false;
794 }
795 
796 StringRef HeaderSearch::findModuleForHeader(const FileEntry *File) {
797   if (ModuleMap::Module *Module = ModMap.findModuleForHeader(File))
798     return Module->getTopLevelModuleName();
799 
800   return StringRef();
801 }
802 
803 bool HeaderSearch::loadModuleMapFile(const FileEntry *File) {
804   const DirectoryEntry *Dir = File->getDir();
805 
806   llvm::DenseMap<const DirectoryEntry *, bool>::iterator KnownDir
807     = DirectoryHasModuleMap.find(Dir);
808   if (KnownDir != DirectoryHasModuleMap.end())
809     return !KnownDir->second;
810 
811   bool Result = ModMap.parseModuleMapFile(File);
812   DirectoryHasModuleMap[Dir] = !Result;
813   return Result;
814 }
815 
816 ModuleMap::Module *HeaderSearch::getModule(StringRef Name, bool AllowSearch) {
817   if (ModuleMap::Module *Module = ModMap.findModule(Name))
818     return Module;
819 
820   if (!AllowSearch)
821     return 0;
822 
823   for (unsigned I = 0, N = SearchDirs.size(); I != N; ++I) {
824     if (!SearchDirs[I].isNormalDir())
825       continue;
826 
827     switch (loadModuleMapFile(SearchDirs[I].getDir())) {
828     case LMM_AlreadyLoaded:
829     case LMM_InvalidModuleMap:
830     case LMM_NoDirectory:
831       break;
832 
833     case LMM_NewlyLoaded:
834       if (ModuleMap::Module *Module = ModMap.findModule(Name))
835         return Module;
836       break;
837     }
838   }
839 
840   return 0;
841 }
842 
843 HeaderSearch::LoadModuleMapResult
844 HeaderSearch::loadModuleMapFile(StringRef DirName) {
845   if (const DirectoryEntry *Dir = FileMgr.getDirectory(DirName))
846     return loadModuleMapFile(Dir);
847 
848   return LMM_NoDirectory;
849 }
850 
851 HeaderSearch::LoadModuleMapResult
852 HeaderSearch::loadModuleMapFile(const DirectoryEntry *Dir) {
853   llvm::DenseMap<const DirectoryEntry *, bool>::iterator KnownDir
854     = DirectoryHasModuleMap.find(Dir);
855   if (KnownDir != DirectoryHasModuleMap.end())
856     return KnownDir->second? LMM_AlreadyLoaded : LMM_InvalidModuleMap;
857 
858   llvm::SmallString<128> ModuleMapFileName;
859   ModuleMapFileName += Dir->getName();
860   llvm::sys::path::append(ModuleMapFileName, "module.map");
861   if (const FileEntry *ModuleMapFile = FileMgr.getFile(ModuleMapFileName)) {
862     // We have found a module map file. Try to parse it.
863     if (!ModMap.parseModuleMapFile(ModuleMapFile)) {
864       // This directory has a module map.
865       DirectoryHasModuleMap[Dir] = true;
866 
867       return LMM_NewlyLoaded;
868     }
869   }
870 
871   // No suitable module map.
872   DirectoryHasModuleMap[Dir] = false;
873   return LMM_InvalidModuleMap;
874 }
875 
876