xref: /llvm-project/clang/lib/Lex/ModuleMap.cpp (revision 97292843d0aa02785043c0580f46c6d7890575dd)
1 //===--- ModuleMap.cpp - Describe the layout of modules ---------*- C++ -*-===//
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 defines the ModuleMap implementation, which describes the layout
11 // of a module as it relates to headers.
12 //
13 //===----------------------------------------------------------------------===//
14 #include "clang/Lex/ModuleMap.h"
15 #include "clang/Basic/CharInfo.h"
16 #include "clang/Basic/Diagnostic.h"
17 #include "clang/Basic/DiagnosticOptions.h"
18 #include "clang/Basic/FileManager.h"
19 #include "clang/Basic/TargetInfo.h"
20 #include "clang/Basic/TargetOptions.h"
21 #include "clang/Lex/HeaderSearch.h"
22 #include "clang/Lex/LexDiagnostic.h"
23 #include "clang/Lex/Lexer.h"
24 #include "clang/Lex/LiteralSupport.h"
25 #include "llvm/ADT/StringRef.h"
26 #include "llvm/ADT/StringSwitch.h"
27 #include "llvm/Support/Allocator.h"
28 #include "llvm/Support/FileSystem.h"
29 #include "llvm/Support/Host.h"
30 #include "llvm/Support/Path.h"
31 #include "llvm/Support/raw_ostream.h"
32 #include <stdlib.h>
33 #if defined(LLVM_ON_UNIX)
34 #include <limits.h>
35 #endif
36 using namespace clang;
37 
38 Module::ExportDecl
39 ModuleMap::resolveExport(Module *Mod,
40                          const Module::UnresolvedExportDecl &Unresolved,
41                          bool Complain) const {
42   // We may have just a wildcard.
43   if (Unresolved.Id.empty()) {
44     assert(Unresolved.Wildcard && "Invalid unresolved export");
45     return Module::ExportDecl(0, true);
46   }
47 
48   // Resolve the module-id.
49   Module *Context = resolveModuleId(Unresolved.Id, Mod, Complain);
50   if (!Context)
51     return Module::ExportDecl();
52 
53   return Module::ExportDecl(Context, Unresolved.Wildcard);
54 }
55 
56 Module *ModuleMap::resolveModuleId(const ModuleId &Id, Module *Mod,
57                                    bool Complain) const {
58   // Find the starting module.
59   Module *Context = lookupModuleUnqualified(Id[0].first, Mod);
60   if (!Context) {
61     if (Complain)
62       Diags->Report(Id[0].second, diag::err_mmap_missing_module_unqualified)
63       << Id[0].first << Mod->getFullModuleName();
64 
65     return 0;
66   }
67 
68   // Dig into the module path.
69   for (unsigned I = 1, N = Id.size(); I != N; ++I) {
70     Module *Sub = lookupModuleQualified(Id[I].first, Context);
71     if (!Sub) {
72       if (Complain)
73         Diags->Report(Id[I].second, diag::err_mmap_missing_module_qualified)
74         << Id[I].first << Context->getFullModuleName()
75         << SourceRange(Id[0].second, Id[I-1].second);
76 
77       return 0;
78     }
79 
80     Context = Sub;
81   }
82 
83   return Context;
84 }
85 
86 ModuleMap::ModuleMap(FileManager &FileMgr, DiagnosticConsumer &DC,
87                      const LangOptions &LangOpts, const TargetInfo *Target,
88                      HeaderSearch &HeaderInfo)
89   : LangOpts(LangOpts), Target(Target), HeaderInfo(HeaderInfo),
90     BuiltinIncludeDir(0), CompilingModule(0)
91 {
92   IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs);
93   Diags = IntrusiveRefCntPtr<DiagnosticsEngine>(
94             new DiagnosticsEngine(DiagIDs, new DiagnosticOptions));
95   Diags->setClient(new ForwardingDiagnosticConsumer(DC),
96                    /*ShouldOwnClient=*/true);
97   SourceMgr = new SourceManager(*Diags, FileMgr);
98 }
99 
100 ModuleMap::~ModuleMap() {
101   for (llvm::StringMap<Module *>::iterator I = Modules.begin(),
102                                         IEnd = Modules.end();
103        I != IEnd; ++I) {
104     delete I->getValue();
105   }
106 
107   delete SourceMgr;
108 }
109 
110 void ModuleMap::setTarget(const TargetInfo &Target) {
111   assert((!this->Target || this->Target == &Target) &&
112          "Improper target override");
113   this->Target = &Target;
114 }
115 
116 /// \brief "Sanitize" a filename so that it can be used as an identifier.
117 static StringRef sanitizeFilenameAsIdentifier(StringRef Name,
118                                               SmallVectorImpl<char> &Buffer) {
119   if (Name.empty())
120     return Name;
121 
122   if (!isValidIdentifier(Name)) {
123     // If we don't already have something with the form of an identifier,
124     // create a buffer with the sanitized name.
125     Buffer.clear();
126     if (isDigit(Name[0]))
127       Buffer.push_back('_');
128     Buffer.reserve(Buffer.size() + Name.size());
129     for (unsigned I = 0, N = Name.size(); I != N; ++I) {
130       if (isIdentifierBody(Name[I]))
131         Buffer.push_back(Name[I]);
132       else
133         Buffer.push_back('_');
134     }
135 
136     Name = StringRef(Buffer.data(), Buffer.size());
137   }
138 
139   while (llvm::StringSwitch<bool>(Name)
140 #define KEYWORD(Keyword,Conditions) .Case(#Keyword, true)
141 #define ALIAS(Keyword, AliasOf, Conditions) .Case(Keyword, true)
142 #include "clang/Basic/TokenKinds.def"
143            .Default(false)) {
144     if (Name.data() != Buffer.data())
145       Buffer.append(Name.begin(), Name.end());
146     Buffer.push_back('_');
147     Name = StringRef(Buffer.data(), Buffer.size());
148   }
149 
150   return Name;
151 }
152 
153 /// \brief Determine whether the given file name is the name of a builtin
154 /// header, supplied by Clang to replace, override, or augment existing system
155 /// headers.
156 static bool isBuiltinHeader(StringRef FileName) {
157   return llvm::StringSwitch<bool>(FileName)
158            .Case("float.h", true)
159            .Case("iso646.h", true)
160            .Case("limits.h", true)
161            .Case("stdalign.h", true)
162            .Case("stdarg.h", true)
163            .Case("stdbool.h", true)
164            .Case("stddef.h", true)
165            .Case("stdint.h", true)
166            .Case("tgmath.h", true)
167            .Case("unwind.h", true)
168            .Default(false);
169 }
170 
171 ModuleMap::KnownHeader ModuleMap::findModuleForHeader(const FileEntry *File) {
172   HeadersMap::iterator Known = Headers.find(File);
173   if (Known != Headers.end()) {
174     // If a header is not available, don't report that it maps to anything.
175     if (!Known->second.isAvailable())
176       return KnownHeader();
177 
178     return Known->second;
179   }
180 
181   // If we've found a builtin header within Clang's builtin include directory,
182   // load all of the module maps to see if it will get associated with a
183   // specific module (e.g., in /usr/include).
184   if (File->getDir() == BuiltinIncludeDir &&
185       isBuiltinHeader(llvm::sys::path::filename(File->getName()))) {
186     HeaderInfo.loadTopLevelSystemModules();
187 
188     // Check again.
189     Known = Headers.find(File);
190     if (Known != Headers.end()) {
191       // If a header is not available, don't report that it maps to anything.
192       if (!Known->second.isAvailable())
193         return KnownHeader();
194 
195       return Known->second;
196     }
197   }
198 
199   const DirectoryEntry *Dir = File->getDir();
200   SmallVector<const DirectoryEntry *, 2> SkippedDirs;
201 
202   // Note: as an egregious but useful hack we use the real path here, because
203   // frameworks moving from top-level frameworks to embedded frameworks tend
204   // to be symlinked from the top-level location to the embedded location,
205   // and we need to resolve lookups as if we had found the embedded location.
206   StringRef DirName = SourceMgr->getFileManager().getCanonicalName(Dir);
207 
208   // Keep walking up the directory hierarchy, looking for a directory with
209   // an umbrella header.
210   do {
211     llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir
212       = UmbrellaDirs.find(Dir);
213     if (KnownDir != UmbrellaDirs.end()) {
214       Module *Result = KnownDir->second;
215 
216       // Search up the module stack until we find a module with an umbrella
217       // directory.
218       Module *UmbrellaModule = Result;
219       while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
220         UmbrellaModule = UmbrellaModule->Parent;
221 
222       if (UmbrellaModule->InferSubmodules) {
223         // Infer submodules for each of the directories we found between
224         // the directory of the umbrella header and the directory where
225         // the actual header is located.
226         bool Explicit = UmbrellaModule->InferExplicitSubmodules;
227 
228         for (unsigned I = SkippedDirs.size(); I != 0; --I) {
229           // Find or create the module that corresponds to this directory name.
230           SmallString<32> NameBuf;
231           StringRef Name = sanitizeFilenameAsIdentifier(
232                              llvm::sys::path::stem(SkippedDirs[I-1]->getName()),
233                              NameBuf);
234           Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
235                                       Explicit).first;
236 
237           // Associate the module and the directory.
238           UmbrellaDirs[SkippedDirs[I-1]] = Result;
239 
240           // If inferred submodules export everything they import, add a
241           // wildcard to the set of exports.
242           if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
243             Result->Exports.push_back(Module::ExportDecl(0, true));
244         }
245 
246         // Infer a submodule with the same name as this header file.
247         SmallString<32> NameBuf;
248         StringRef Name = sanitizeFilenameAsIdentifier(
249                            llvm::sys::path::stem(File->getName()), NameBuf);
250         Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
251                                     Explicit).first;
252         Result->addTopHeader(File);
253 
254         // If inferred submodules export everything they import, add a
255         // wildcard to the set of exports.
256         if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
257           Result->Exports.push_back(Module::ExportDecl(0, true));
258       } else {
259         // Record each of the directories we stepped through as being part of
260         // the module we found, since the umbrella header covers them all.
261         for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I)
262           UmbrellaDirs[SkippedDirs[I]] = Result;
263       }
264 
265       Headers[File] = KnownHeader(Result, NormalHeader);
266 
267       // If a header corresponds to an unavailable module, don't report
268       // that it maps to anything.
269       if (!Result->isAvailable())
270         return KnownHeader();
271 
272       return Headers[File];
273     }
274 
275     SkippedDirs.push_back(Dir);
276 
277     // Retrieve our parent path.
278     DirName = llvm::sys::path::parent_path(DirName);
279     if (DirName.empty())
280       break;
281 
282     // Resolve the parent path to a directory entry.
283     Dir = SourceMgr->getFileManager().getDirectory(DirName);
284   } while (Dir);
285 
286   return KnownHeader();
287 }
288 
289 bool ModuleMap::isHeaderInUnavailableModule(const FileEntry *Header) const {
290   HeadersMap::const_iterator Known = Headers.find(Header);
291   if (Known != Headers.end())
292     return !Known->second.isAvailable();
293 
294   const DirectoryEntry *Dir = Header->getDir();
295   SmallVector<const DirectoryEntry *, 2> SkippedDirs;
296   StringRef DirName = Dir->getName();
297 
298   // Keep walking up the directory hierarchy, looking for a directory with
299   // an umbrella header.
300   do {
301     llvm::DenseMap<const DirectoryEntry *, Module *>::const_iterator KnownDir
302       = UmbrellaDirs.find(Dir);
303     if (KnownDir != UmbrellaDirs.end()) {
304       Module *Found = KnownDir->second;
305       if (!Found->isAvailable())
306         return true;
307 
308       // Search up the module stack until we find a module with an umbrella
309       // directory.
310       Module *UmbrellaModule = Found;
311       while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
312         UmbrellaModule = UmbrellaModule->Parent;
313 
314       if (UmbrellaModule->InferSubmodules) {
315         for (unsigned I = SkippedDirs.size(); I != 0; --I) {
316           // Find or create the module that corresponds to this directory name.
317           SmallString<32> NameBuf;
318           StringRef Name = sanitizeFilenameAsIdentifier(
319                              llvm::sys::path::stem(SkippedDirs[I-1]->getName()),
320                              NameBuf);
321           Found = lookupModuleQualified(Name, Found);
322           if (!Found)
323             return false;
324           if (!Found->isAvailable())
325             return true;
326         }
327 
328         // Infer a submodule with the same name as this header file.
329         SmallString<32> NameBuf;
330         StringRef Name = sanitizeFilenameAsIdentifier(
331                            llvm::sys::path::stem(Header->getName()),
332                            NameBuf);
333         Found = lookupModuleQualified(Name, Found);
334         if (!Found)
335           return false;
336       }
337 
338       return !Found->isAvailable();
339     }
340 
341     SkippedDirs.push_back(Dir);
342 
343     // Retrieve our parent path.
344     DirName = llvm::sys::path::parent_path(DirName);
345     if (DirName.empty())
346       break;
347 
348     // Resolve the parent path to a directory entry.
349     Dir = SourceMgr->getFileManager().getDirectory(DirName);
350   } while (Dir);
351 
352   return false;
353 }
354 
355 Module *ModuleMap::findModule(StringRef Name) const {
356   llvm::StringMap<Module *>::const_iterator Known = Modules.find(Name);
357   if (Known != Modules.end())
358     return Known->getValue();
359 
360   return 0;
361 }
362 
363 Module *ModuleMap::lookupModuleUnqualified(StringRef Name,
364                                            Module *Context) const {
365   for(; Context; Context = Context->Parent) {
366     if (Module *Sub = lookupModuleQualified(Name, Context))
367       return Sub;
368   }
369 
370   return findModule(Name);
371 }
372 
373 Module *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) const{
374   if (!Context)
375     return findModule(Name);
376 
377   return Context->findSubmodule(Name);
378 }
379 
380 std::pair<Module *, bool>
381 ModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework,
382                               bool IsExplicit) {
383   // Try to find an existing module with this name.
384   if (Module *Sub = lookupModuleQualified(Name, Parent))
385     return std::make_pair(Sub, false);
386 
387   // Create a new module with this name.
388   Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework,
389                               IsExplicit);
390   if (!Parent) {
391     Modules[Name] = Result;
392     if (!LangOpts.CurrentModule.empty() && !CompilingModule &&
393         Name == LangOpts.CurrentModule) {
394       CompilingModule = Result;
395     }
396   }
397   return std::make_pair(Result, true);
398 }
399 
400 bool ModuleMap::canInferFrameworkModule(const DirectoryEntry *ParentDir,
401                                         StringRef Name, bool &IsSystem) const {
402   // Check whether we have already looked into the parent directory
403   // for a module map.
404   llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator
405     inferred = InferredDirectories.find(ParentDir);
406   if (inferred == InferredDirectories.end())
407     return false;
408 
409   if (!inferred->second.InferModules)
410     return false;
411 
412   // We're allowed to infer for this directory, but make sure it's okay
413   // to infer this particular module.
414   bool canInfer = std::find(inferred->second.ExcludedModules.begin(),
415                             inferred->second.ExcludedModules.end(),
416                             Name) == inferred->second.ExcludedModules.end();
417 
418   if (canInfer && inferred->second.InferSystemModules)
419     IsSystem = true;
420 
421   return canInfer;
422 }
423 
424 /// \brief For a framework module, infer the framework against which we
425 /// should link.
426 static void inferFrameworkLink(Module *Mod, const DirectoryEntry *FrameworkDir,
427                                FileManager &FileMgr) {
428   assert(Mod->IsFramework && "Can only infer linking for framework modules");
429   assert(!Mod->isSubFramework() &&
430          "Can only infer linking for top-level frameworks");
431 
432   SmallString<128> LibName;
433   LibName += FrameworkDir->getName();
434   llvm::sys::path::append(LibName, Mod->Name);
435   if (FileMgr.getFile(LibName)) {
436     Mod->LinkLibraries.push_back(Module::LinkLibrary(Mod->Name,
437                                                      /*IsFramework=*/true));
438   }
439 }
440 
441 Module *
442 ModuleMap::inferFrameworkModule(StringRef ModuleName,
443                                 const DirectoryEntry *FrameworkDir,
444                                 bool IsSystem,
445                                 Module *Parent) {
446   // Check whether we've already found this module.
447   if (Module *Mod = lookupModuleQualified(ModuleName, Parent))
448     return Mod;
449 
450   FileManager &FileMgr = SourceMgr->getFileManager();
451 
452   // If the framework has a parent path from which we're allowed to infer
453   // a framework module, do so.
454   if (!Parent) {
455     // Determine whether we're allowed to infer a module map.
456 
457     // Note: as an egregious but useful hack we use the real path here, because
458     // we might be looking at an embedded framework that symlinks out to a
459     // top-level framework, and we need to infer as if we were naming the
460     // top-level framework.
461     StringRef FrameworkDirName
462       = SourceMgr->getFileManager().getCanonicalName(FrameworkDir);
463 
464     bool canInfer = false;
465     if (llvm::sys::path::has_parent_path(FrameworkDirName)) {
466       // Figure out the parent path.
467       StringRef Parent = llvm::sys::path::parent_path(FrameworkDirName);
468       if (const DirectoryEntry *ParentDir = FileMgr.getDirectory(Parent)) {
469         // Check whether we have already looked into the parent directory
470         // for a module map.
471         llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator
472           inferred = InferredDirectories.find(ParentDir);
473         if (inferred == InferredDirectories.end()) {
474           // We haven't looked here before. Load a module map, if there is
475           // one.
476           SmallString<128> ModMapPath = Parent;
477           llvm::sys::path::append(ModMapPath, "module.map");
478           if (const FileEntry *ModMapFile = FileMgr.getFile(ModMapPath)) {
479             parseModuleMapFile(ModMapFile, IsSystem);
480             inferred = InferredDirectories.find(ParentDir);
481           }
482 
483           if (inferred == InferredDirectories.end())
484             inferred = InferredDirectories.insert(
485                          std::make_pair(ParentDir, InferredDirectory())).first;
486         }
487 
488         if (inferred->second.InferModules) {
489           // We're allowed to infer for this directory, but make sure it's okay
490           // to infer this particular module.
491           StringRef Name = llvm::sys::path::stem(FrameworkDirName);
492           canInfer = std::find(inferred->second.ExcludedModules.begin(),
493                                inferred->second.ExcludedModules.end(),
494                                Name) == inferred->second.ExcludedModules.end();
495 
496           if (inferred->second.InferSystemModules)
497             IsSystem = true;
498         }
499       }
500     }
501 
502     // If we're not allowed to infer a framework module, don't.
503     if (!canInfer)
504       return 0;
505   }
506 
507 
508   // Look for an umbrella header.
509   SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName());
510   llvm::sys::path::append(UmbrellaName, "Headers", ModuleName + ".h");
511   const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName);
512 
513   // FIXME: If there's no umbrella header, we could probably scan the
514   // framework to load *everything*. But, it's not clear that this is a good
515   // idea.
516   if (!UmbrellaHeader)
517     return 0;
518 
519   Module *Result = new Module(ModuleName, SourceLocation(), Parent,
520                               /*IsFramework=*/true, /*IsExplicit=*/false);
521   if (IsSystem)
522     Result->IsSystem = IsSystem;
523 
524   if (!Parent)
525     Modules[ModuleName] = Result;
526 
527   // umbrella header "umbrella-header-name"
528   Result->Umbrella = UmbrellaHeader;
529   Headers[UmbrellaHeader] = KnownHeader(Result, NormalHeader);
530   UmbrellaDirs[UmbrellaHeader->getDir()] = Result;
531 
532   // export *
533   Result->Exports.push_back(Module::ExportDecl(0, true));
534 
535   // module * { export * }
536   Result->InferSubmodules = true;
537   Result->InferExportWildcard = true;
538 
539   // Look for subframeworks.
540   llvm::error_code EC;
541   SmallString<128> SubframeworksDirName
542     = StringRef(FrameworkDir->getName());
543   llvm::sys::path::append(SubframeworksDirName, "Frameworks");
544   SmallString<128> SubframeworksDirNameNative;
545   llvm::sys::path::native(SubframeworksDirName.str(),
546                           SubframeworksDirNameNative);
547   for (llvm::sys::fs::directory_iterator
548          Dir(SubframeworksDirNameNative.str(), EC), DirEnd;
549        Dir != DirEnd && !EC; Dir.increment(EC)) {
550     if (!StringRef(Dir->path()).endswith(".framework"))
551       continue;
552 
553     if (const DirectoryEntry *SubframeworkDir
554           = FileMgr.getDirectory(Dir->path())) {
555       // Note: as an egregious but useful hack, we use the real path here and
556       // check whether it is actually a subdirectory of the parent directory.
557       // This will not be the case if the 'subframework' is actually a symlink
558       // out to a top-level framework.
559       StringRef SubframeworkDirName = FileMgr.getCanonicalName(SubframeworkDir);
560       bool FoundParent = false;
561       do {
562         // Get the parent directory name.
563         SubframeworkDirName
564           = llvm::sys::path::parent_path(SubframeworkDirName);
565         if (SubframeworkDirName.empty())
566           break;
567 
568         if (FileMgr.getDirectory(SubframeworkDirName) == FrameworkDir) {
569           FoundParent = true;
570           break;
571         }
572       } while (true);
573 
574       if (!FoundParent)
575         continue;
576 
577       // FIXME: Do we want to warn about subframeworks without umbrella headers?
578       SmallString<32> NameBuf;
579       inferFrameworkModule(sanitizeFilenameAsIdentifier(
580                              llvm::sys::path::stem(Dir->path()), NameBuf),
581                            SubframeworkDir, IsSystem, Result);
582     }
583   }
584 
585   // If the module is a top-level framework, automatically link against the
586   // framework.
587   if (!Result->isSubFramework()) {
588     inferFrameworkLink(Result, FrameworkDir, FileMgr);
589   }
590 
591   return Result;
592 }
593 
594 void ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader){
595   Headers[UmbrellaHeader] = KnownHeader(Mod, NormalHeader);
596   Mod->Umbrella = UmbrellaHeader;
597   UmbrellaDirs[UmbrellaHeader->getDir()] = Mod;
598 }
599 
600 void ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir) {
601   Mod->Umbrella = UmbrellaDir;
602   UmbrellaDirs[UmbrellaDir] = Mod;
603 }
604 
605 void ModuleMap::addHeader(Module *Mod, const FileEntry *Header,
606                           ModuleHeaderRole Role) {
607   if (Role == ExcludedHeader) {
608     Mod->ExcludedHeaders.push_back(Header);
609   } else {
610     if (Role == PrivateHeader)
611       Mod->PrivateHeaders.push_back(Header);
612     else
613       Mod->NormalHeaders.push_back(Header);
614     bool isCompilingModuleHeader = Mod->getTopLevelModule() == CompilingModule;
615     HeaderInfo.MarkFileModuleHeader(Header, Role, isCompilingModuleHeader);
616   }
617   Headers[Header] = KnownHeader(Mod, Role);
618 }
619 
620 const FileEntry *
621 ModuleMap::getContainingModuleMapFile(Module *Module) const {
622   if (Module->DefinitionLoc.isInvalid() || !SourceMgr)
623     return 0;
624 
625   return SourceMgr->getFileEntryForID(
626            SourceMgr->getFileID(Module->DefinitionLoc));
627 }
628 
629 void ModuleMap::dump() {
630   llvm::errs() << "Modules:";
631   for (llvm::StringMap<Module *>::iterator M = Modules.begin(),
632                                         MEnd = Modules.end();
633        M != MEnd; ++M)
634     M->getValue()->print(llvm::errs(), 2);
635 
636   llvm::errs() << "Headers:";
637   for (HeadersMap::iterator H = Headers.begin(), HEnd = Headers.end();
638        H != HEnd; ++H) {
639     llvm::errs() << "  \"" << H->first->getName() << "\" -> "
640                  << H->second.getModule()->getFullModuleName() << "\n";
641   }
642 }
643 
644 bool ModuleMap::resolveExports(Module *Mod, bool Complain) {
645   bool HadError = false;
646   for (unsigned I = 0, N = Mod->UnresolvedExports.size(); I != N; ++I) {
647     Module::ExportDecl Export = resolveExport(Mod, Mod->UnresolvedExports[I],
648                                               Complain);
649     if (Export.getPointer() || Export.getInt())
650       Mod->Exports.push_back(Export);
651     else
652       HadError = true;
653   }
654   Mod->UnresolvedExports.clear();
655   return HadError;
656 }
657 
658 bool ModuleMap::resolveConflicts(Module *Mod, bool Complain) {
659   bool HadError = false;
660   for (unsigned I = 0, N = Mod->UnresolvedConflicts.size(); I != N; ++I) {
661     Module *OtherMod = resolveModuleId(Mod->UnresolvedConflicts[I].Id,
662                                        Mod, Complain);
663     if (!OtherMod) {
664       HadError = true;
665       continue;
666     }
667 
668     Module::Conflict Conflict;
669     Conflict.Other = OtherMod;
670     Conflict.Message = Mod->UnresolvedConflicts[I].Message;
671     Mod->Conflicts.push_back(Conflict);
672   }
673   Mod->UnresolvedConflicts.clear();
674   return HadError;
675 }
676 
677 Module *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) {
678   if (Loc.isInvalid())
679     return 0;
680 
681   // Use the expansion location to determine which module we're in.
682   FullSourceLoc ExpansionLoc = Loc.getExpansionLoc();
683   if (!ExpansionLoc.isFileID())
684     return 0;
685 
686 
687   const SourceManager &SrcMgr = Loc.getManager();
688   FileID ExpansionFileID = ExpansionLoc.getFileID();
689 
690   while (const FileEntry *ExpansionFile
691            = SrcMgr.getFileEntryForID(ExpansionFileID)) {
692     // Find the module that owns this header (if any).
693     if (Module *Mod = findModuleForHeader(ExpansionFile).getModule())
694       return Mod;
695 
696     // No module owns this header, so look up the inclusion chain to see if
697     // any included header has an associated module.
698     SourceLocation IncludeLoc = SrcMgr.getIncludeLoc(ExpansionFileID);
699     if (IncludeLoc.isInvalid())
700       return 0;
701 
702     ExpansionFileID = SrcMgr.getFileID(IncludeLoc);
703   }
704 
705   return 0;
706 }
707 
708 //----------------------------------------------------------------------------//
709 // Module map file parser
710 //----------------------------------------------------------------------------//
711 
712 namespace clang {
713   /// \brief A token in a module map file.
714   struct MMToken {
715     enum TokenKind {
716       Comma,
717       ConfigMacros,
718       Conflict,
719       EndOfFile,
720       HeaderKeyword,
721       Identifier,
722       ExcludeKeyword,
723       ExplicitKeyword,
724       ExportKeyword,
725       ExternKeyword,
726       FrameworkKeyword,
727       LinkKeyword,
728       ModuleKeyword,
729       Period,
730       PrivateKeyword,
731       UmbrellaKeyword,
732       RequiresKeyword,
733       Star,
734       StringLiteral,
735       LBrace,
736       RBrace,
737       LSquare,
738       RSquare
739     } Kind;
740 
741     unsigned Location;
742     unsigned StringLength;
743     const char *StringData;
744 
745     void clear() {
746       Kind = EndOfFile;
747       Location = 0;
748       StringLength = 0;
749       StringData = 0;
750     }
751 
752     bool is(TokenKind K) const { return Kind == K; }
753 
754     SourceLocation getLocation() const {
755       return SourceLocation::getFromRawEncoding(Location);
756     }
757 
758     StringRef getString() const {
759       return StringRef(StringData, StringLength);
760     }
761   };
762 
763   /// \brief The set of attributes that can be attached to a module.
764   struct Attributes {
765     Attributes() : IsSystem(), IsExhaustive() { }
766 
767     /// \brief Whether this is a system module.
768     unsigned IsSystem : 1;
769 
770     /// \brief Whether this is an exhaustive set of configuration macros.
771     unsigned IsExhaustive : 1;
772   };
773 
774 
775   class ModuleMapParser {
776     Lexer &L;
777     SourceManager &SourceMgr;
778 
779     /// \brief Default target information, used only for string literal
780     /// parsing.
781     const TargetInfo *Target;
782 
783     DiagnosticsEngine &Diags;
784     ModuleMap &Map;
785 
786     /// \brief The directory that this module map resides in.
787     const DirectoryEntry *Directory;
788 
789     /// \brief The directory containing Clang-supplied headers.
790     const DirectoryEntry *BuiltinIncludeDir;
791 
792     /// \brief Whether this module map is in a system header directory.
793     bool IsSystem;
794 
795     /// \brief Whether an error occurred.
796     bool HadError;
797 
798     /// \brief Stores string data for the various string literals referenced
799     /// during parsing.
800     llvm::BumpPtrAllocator StringData;
801 
802     /// \brief The current token.
803     MMToken Tok;
804 
805     /// \brief The active module.
806     Module *ActiveModule;
807 
808     /// \brief Consume the current token and return its location.
809     SourceLocation consumeToken();
810 
811     /// \brief Skip tokens until we reach the a token with the given kind
812     /// (or the end of the file).
813     void skipUntil(MMToken::TokenKind K);
814 
815     typedef SmallVector<std::pair<std::string, SourceLocation>, 2> ModuleId;
816     bool parseModuleId(ModuleId &Id);
817     void parseModuleDecl();
818     void parseExternModuleDecl();
819     void parseRequiresDecl();
820     void parseHeaderDecl(clang::MMToken::TokenKind,
821                          SourceLocation LeadingLoc);
822     void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc);
823     void parseExportDecl();
824     void parseLinkDecl();
825     void parseConfigMacros();
826     void parseConflict();
827     void parseInferredModuleDecl(bool Framework, bool Explicit);
828     bool parseOptionalAttributes(Attributes &Attrs);
829 
830     const DirectoryEntry *getOverriddenHeaderSearchDir();
831 
832   public:
833     explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr,
834                              const TargetInfo *Target,
835                              DiagnosticsEngine &Diags,
836                              ModuleMap &Map,
837                              const DirectoryEntry *Directory,
838                              const DirectoryEntry *BuiltinIncludeDir,
839                              bool IsSystem)
840       : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map),
841         Directory(Directory), BuiltinIncludeDir(BuiltinIncludeDir),
842         IsSystem(IsSystem), HadError(false), ActiveModule(0)
843     {
844       Tok.clear();
845       consumeToken();
846     }
847 
848     bool parseModuleMapFile();
849   };
850 }
851 
852 SourceLocation ModuleMapParser::consumeToken() {
853 retry:
854   SourceLocation Result = Tok.getLocation();
855   Tok.clear();
856 
857   Token LToken;
858   L.LexFromRawLexer(LToken);
859   Tok.Location = LToken.getLocation().getRawEncoding();
860   switch (LToken.getKind()) {
861   case tok::raw_identifier:
862     Tok.StringData = LToken.getRawIdentifierData();
863     Tok.StringLength = LToken.getLength();
864     Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(Tok.getString())
865                  .Case("config_macros", MMToken::ConfigMacros)
866                  .Case("conflict", MMToken::Conflict)
867                  .Case("exclude", MMToken::ExcludeKeyword)
868                  .Case("explicit", MMToken::ExplicitKeyword)
869                  .Case("export", MMToken::ExportKeyword)
870                  .Case("extern", MMToken::ExternKeyword)
871                  .Case("framework", MMToken::FrameworkKeyword)
872                  .Case("header", MMToken::HeaderKeyword)
873                  .Case("link", MMToken::LinkKeyword)
874                  .Case("module", MMToken::ModuleKeyword)
875                  .Case("private", MMToken::PrivateKeyword)
876                  .Case("requires", MMToken::RequiresKeyword)
877                  .Case("umbrella", MMToken::UmbrellaKeyword)
878                  .Default(MMToken::Identifier);
879     break;
880 
881   case tok::comma:
882     Tok.Kind = MMToken::Comma;
883     break;
884 
885   case tok::eof:
886     Tok.Kind = MMToken::EndOfFile;
887     break;
888 
889   case tok::l_brace:
890     Tok.Kind = MMToken::LBrace;
891     break;
892 
893   case tok::l_square:
894     Tok.Kind = MMToken::LSquare;
895     break;
896 
897   case tok::period:
898     Tok.Kind = MMToken::Period;
899     break;
900 
901   case tok::r_brace:
902     Tok.Kind = MMToken::RBrace;
903     break;
904 
905   case tok::r_square:
906     Tok.Kind = MMToken::RSquare;
907     break;
908 
909   case tok::star:
910     Tok.Kind = MMToken::Star;
911     break;
912 
913   case tok::string_literal: {
914     if (LToken.hasUDSuffix()) {
915       Diags.Report(LToken.getLocation(), diag::err_invalid_string_udl);
916       HadError = true;
917       goto retry;
918     }
919 
920     // Parse the string literal.
921     LangOptions LangOpts;
922     StringLiteralParser StringLiteral(&LToken, 1, SourceMgr, LangOpts, *Target);
923     if (StringLiteral.hadError)
924       goto retry;
925 
926     // Copy the string literal into our string data allocator.
927     unsigned Length = StringLiteral.GetStringLength();
928     char *Saved = StringData.Allocate<char>(Length + 1);
929     memcpy(Saved, StringLiteral.GetString().data(), Length);
930     Saved[Length] = 0;
931 
932     // Form the token.
933     Tok.Kind = MMToken::StringLiteral;
934     Tok.StringData = Saved;
935     Tok.StringLength = Length;
936     break;
937   }
938 
939   case tok::comment:
940     goto retry;
941 
942   default:
943     Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token);
944     HadError = true;
945     goto retry;
946   }
947 
948   return Result;
949 }
950 
951 void ModuleMapParser::skipUntil(MMToken::TokenKind K) {
952   unsigned braceDepth = 0;
953   unsigned squareDepth = 0;
954   do {
955     switch (Tok.Kind) {
956     case MMToken::EndOfFile:
957       return;
958 
959     case MMToken::LBrace:
960       if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
961         return;
962 
963       ++braceDepth;
964       break;
965 
966     case MMToken::LSquare:
967       if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
968         return;
969 
970       ++squareDepth;
971       break;
972 
973     case MMToken::RBrace:
974       if (braceDepth > 0)
975         --braceDepth;
976       else if (Tok.is(K))
977         return;
978       break;
979 
980     case MMToken::RSquare:
981       if (squareDepth > 0)
982         --squareDepth;
983       else if (Tok.is(K))
984         return;
985       break;
986 
987     default:
988       if (braceDepth == 0 && squareDepth == 0 && Tok.is(K))
989         return;
990       break;
991     }
992 
993    consumeToken();
994   } while (true);
995 }
996 
997 /// \brief Parse a module-id.
998 ///
999 ///   module-id:
1000 ///     identifier
1001 ///     identifier '.' module-id
1002 ///
1003 /// \returns true if an error occurred, false otherwise.
1004 bool ModuleMapParser::parseModuleId(ModuleId &Id) {
1005   Id.clear();
1006   do {
1007     if (Tok.is(MMToken::Identifier)) {
1008       Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation()));
1009       consumeToken();
1010     } else {
1011       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name);
1012       return true;
1013     }
1014 
1015     if (!Tok.is(MMToken::Period))
1016       break;
1017 
1018     consumeToken();
1019   } while (true);
1020 
1021   return false;
1022 }
1023 
1024 namespace {
1025   /// \brief Enumerates the known attributes.
1026   enum AttributeKind {
1027     /// \brief An unknown attribute.
1028     AT_unknown,
1029     /// \brief The 'system' attribute.
1030     AT_system,
1031     /// \brief The 'exhaustive' attribute.
1032     AT_exhaustive
1033   };
1034 }
1035 
1036 /// \brief Parse a module declaration.
1037 ///
1038 ///   module-declaration:
1039 ///     'extern' 'module' module-id string-literal
1040 ///     'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt]
1041 ///       { module-member* }
1042 ///
1043 ///   module-member:
1044 ///     requires-declaration
1045 ///     header-declaration
1046 ///     submodule-declaration
1047 ///     export-declaration
1048 ///     link-declaration
1049 ///
1050 ///   submodule-declaration:
1051 ///     module-declaration
1052 ///     inferred-submodule-declaration
1053 void ModuleMapParser::parseModuleDecl() {
1054   assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) ||
1055          Tok.is(MMToken::FrameworkKeyword) || Tok.is(MMToken::ExternKeyword));
1056   if (Tok.is(MMToken::ExternKeyword)) {
1057     parseExternModuleDecl();
1058     return;
1059   }
1060 
1061   // Parse 'explicit' or 'framework' keyword, if present.
1062   SourceLocation ExplicitLoc;
1063   bool Explicit = false;
1064   bool Framework = false;
1065 
1066   // Parse 'explicit' keyword, if present.
1067   if (Tok.is(MMToken::ExplicitKeyword)) {
1068     ExplicitLoc = consumeToken();
1069     Explicit = true;
1070   }
1071 
1072   // Parse 'framework' keyword, if present.
1073   if (Tok.is(MMToken::FrameworkKeyword)) {
1074     consumeToken();
1075     Framework = true;
1076   }
1077 
1078   // Parse 'module' keyword.
1079   if (!Tok.is(MMToken::ModuleKeyword)) {
1080     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1081     consumeToken();
1082     HadError = true;
1083     return;
1084   }
1085   consumeToken(); // 'module' keyword
1086 
1087   // If we have a wildcard for the module name, this is an inferred submodule.
1088   // Parse it.
1089   if (Tok.is(MMToken::Star))
1090     return parseInferredModuleDecl(Framework, Explicit);
1091 
1092   // Parse the module name.
1093   ModuleId Id;
1094   if (parseModuleId(Id)) {
1095     HadError = true;
1096     return;
1097   }
1098 
1099   if (ActiveModule) {
1100     if (Id.size() > 1) {
1101       Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id)
1102         << SourceRange(Id.front().second, Id.back().second);
1103 
1104       HadError = true;
1105       return;
1106     }
1107   } else if (Id.size() == 1 && Explicit) {
1108     // Top-level modules can't be explicit.
1109     Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level);
1110     Explicit = false;
1111     ExplicitLoc = SourceLocation();
1112     HadError = true;
1113   }
1114 
1115   Module *PreviousActiveModule = ActiveModule;
1116   if (Id.size() > 1) {
1117     // This module map defines a submodule. Go find the module of which it
1118     // is a submodule.
1119     ActiveModule = 0;
1120     for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) {
1121       if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) {
1122         ActiveModule = Next;
1123         continue;
1124       }
1125 
1126       if (ActiveModule) {
1127         Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified)
1128           << Id[I].first << ActiveModule->getTopLevelModule();
1129       } else {
1130         Diags.Report(Id[I].second, diag::err_mmap_expected_module_name);
1131       }
1132       HadError = true;
1133       return;
1134     }
1135   }
1136 
1137   StringRef ModuleName = Id.back().first;
1138   SourceLocation ModuleNameLoc = Id.back().second;
1139 
1140   // Parse the optional attribute list.
1141   Attributes Attrs;
1142   parseOptionalAttributes(Attrs);
1143 
1144   // Parse the opening brace.
1145   if (!Tok.is(MMToken::LBrace)) {
1146     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace)
1147       << ModuleName;
1148     HadError = true;
1149     return;
1150   }
1151   SourceLocation LBraceLoc = consumeToken();
1152 
1153   // Determine whether this (sub)module has already been defined.
1154   if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) {
1155     if (Existing->DefinitionLoc.isInvalid() && !ActiveModule) {
1156       // Skip the module definition.
1157       skipUntil(MMToken::RBrace);
1158       if (Tok.is(MMToken::RBrace))
1159         consumeToken();
1160       else {
1161         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1162         Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1163         HadError = true;
1164       }
1165       return;
1166     }
1167 
1168     Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition)
1169       << ModuleName;
1170     Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition);
1171 
1172     // Skip the module definition.
1173     skipUntil(MMToken::RBrace);
1174     if (Tok.is(MMToken::RBrace))
1175       consumeToken();
1176 
1177     HadError = true;
1178     return;
1179   }
1180 
1181   // Start defining this module.
1182   ActiveModule = Map.findOrCreateModule(ModuleName, ActiveModule, Framework,
1183                                         Explicit).first;
1184   ActiveModule->DefinitionLoc = ModuleNameLoc;
1185   if (Attrs.IsSystem || IsSystem)
1186     ActiveModule->IsSystem = true;
1187 
1188   bool Done = false;
1189   do {
1190     switch (Tok.Kind) {
1191     case MMToken::EndOfFile:
1192     case MMToken::RBrace:
1193       Done = true;
1194       break;
1195 
1196     case MMToken::ConfigMacros:
1197       parseConfigMacros();
1198       break;
1199 
1200     case MMToken::Conflict:
1201       parseConflict();
1202       break;
1203 
1204     case MMToken::ExplicitKeyword:
1205     case MMToken::ExternKeyword:
1206     case MMToken::FrameworkKeyword:
1207     case MMToken::ModuleKeyword:
1208       parseModuleDecl();
1209       break;
1210 
1211     case MMToken::ExportKeyword:
1212       parseExportDecl();
1213       break;
1214 
1215     case MMToken::RequiresKeyword:
1216       parseRequiresDecl();
1217       break;
1218 
1219     case MMToken::UmbrellaKeyword: {
1220       SourceLocation UmbrellaLoc = consumeToken();
1221       if (Tok.is(MMToken::HeaderKeyword))
1222         parseHeaderDecl(MMToken::UmbrellaKeyword, UmbrellaLoc);
1223       else
1224         parseUmbrellaDirDecl(UmbrellaLoc);
1225       break;
1226     }
1227 
1228     case MMToken::ExcludeKeyword: {
1229       SourceLocation ExcludeLoc = consumeToken();
1230       if (Tok.is(MMToken::HeaderKeyword)) {
1231         parseHeaderDecl(MMToken::ExcludeKeyword, ExcludeLoc);
1232       } else {
1233         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1234           << "exclude";
1235       }
1236       break;
1237     }
1238 
1239     case MMToken::PrivateKeyword: {
1240       SourceLocation PrivateLoc = consumeToken();
1241       if (Tok.is(MMToken::HeaderKeyword)) {
1242         parseHeaderDecl(MMToken::PrivateKeyword, PrivateLoc);
1243       } else {
1244         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1245           << "private";
1246       }
1247       break;
1248     }
1249 
1250     case MMToken::HeaderKeyword:
1251       parseHeaderDecl(MMToken::HeaderKeyword, SourceLocation());
1252       break;
1253 
1254     case MMToken::LinkKeyword:
1255       parseLinkDecl();
1256       break;
1257 
1258     default:
1259       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member);
1260       consumeToken();
1261       break;
1262     }
1263   } while (!Done);
1264 
1265   if (Tok.is(MMToken::RBrace))
1266     consumeToken();
1267   else {
1268     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1269     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1270     HadError = true;
1271   }
1272 
1273   // If the active module is a top-level framework, and there are no link
1274   // libraries, automatically link against the framework.
1275   if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() &&
1276       ActiveModule->LinkLibraries.empty()) {
1277     inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager());
1278   }
1279 
1280   // We're done parsing this module. Pop back to the previous module.
1281   ActiveModule = PreviousActiveModule;
1282 }
1283 
1284 /// \brief Parse an extern module declaration.
1285 ///
1286 ///   extern module-declaration:
1287 ///     'extern' 'module' module-id string-literal
1288 void ModuleMapParser::parseExternModuleDecl() {
1289   assert(Tok.is(MMToken::ExternKeyword));
1290   consumeToken(); // 'extern' keyword
1291 
1292   // Parse 'module' keyword.
1293   if (!Tok.is(MMToken::ModuleKeyword)) {
1294     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1295     consumeToken();
1296     HadError = true;
1297     return;
1298   }
1299   consumeToken(); // 'module' keyword
1300 
1301   // Parse the module name.
1302   ModuleId Id;
1303   if (parseModuleId(Id)) {
1304     HadError = true;
1305     return;
1306   }
1307 
1308   // Parse the referenced module map file name.
1309   if (!Tok.is(MMToken::StringLiteral)) {
1310     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_mmap_file);
1311     HadError = true;
1312     return;
1313   }
1314   std::string FileName = Tok.getString();
1315   consumeToken(); // filename
1316 
1317   StringRef FileNameRef = FileName;
1318   SmallString<128> ModuleMapFileName;
1319   if (llvm::sys::path::is_relative(FileNameRef)) {
1320     ModuleMapFileName += Directory->getName();
1321     llvm::sys::path::append(ModuleMapFileName, FileName);
1322     FileNameRef = ModuleMapFileName.str();
1323   }
1324   if (const FileEntry *File = SourceMgr.getFileManager().getFile(FileNameRef))
1325     Map.parseModuleMapFile(File, /*IsSystem=*/false);
1326 }
1327 
1328 /// \brief Parse a requires declaration.
1329 ///
1330 ///   requires-declaration:
1331 ///     'requires' feature-list
1332 ///
1333 ///   feature-list:
1334 ///     identifier ',' feature-list
1335 ///     identifier
1336 void ModuleMapParser::parseRequiresDecl() {
1337   assert(Tok.is(MMToken::RequiresKeyword));
1338 
1339   // Parse 'requires' keyword.
1340   consumeToken();
1341 
1342   // Parse the feature-list.
1343   do {
1344     if (!Tok.is(MMToken::Identifier)) {
1345       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature);
1346       HadError = true;
1347       return;
1348     }
1349 
1350     // Consume the feature name.
1351     std::string Feature = Tok.getString();
1352     consumeToken();
1353 
1354     // Add this feature.
1355     ActiveModule->addRequirement(Feature, Map.LangOpts, *Map.Target);
1356 
1357     if (!Tok.is(MMToken::Comma))
1358       break;
1359 
1360     // Consume the comma.
1361     consumeToken();
1362   } while (true);
1363 }
1364 
1365 /// \brief Append to \p Paths the set of paths needed to get to the
1366 /// subframework in which the given module lives.
1367 static void appendSubframeworkPaths(Module *Mod,
1368                                     SmallVectorImpl<char> &Path) {
1369   // Collect the framework names from the given module to the top-level module.
1370   SmallVector<StringRef, 2> Paths;
1371   for (; Mod; Mod = Mod->Parent) {
1372     if (Mod->IsFramework)
1373       Paths.push_back(Mod->Name);
1374   }
1375 
1376   if (Paths.empty())
1377     return;
1378 
1379   // Add Frameworks/Name.framework for each subframework.
1380   for (unsigned I = Paths.size() - 1; I != 0; --I)
1381     llvm::sys::path::append(Path, "Frameworks", Paths[I-1] + ".framework");
1382 }
1383 
1384 /// \brief Parse a header declaration.
1385 ///
1386 ///   header-declaration:
1387 ///     'umbrella'[opt] 'header' string-literal
1388 ///     'exclude'[opt] 'header' string-literal
1389 void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken,
1390                                       SourceLocation LeadingLoc) {
1391   assert(Tok.is(MMToken::HeaderKeyword));
1392   consumeToken();
1393 
1394   // Parse the header name.
1395   if (!Tok.is(MMToken::StringLiteral)) {
1396     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1397       << "header";
1398     HadError = true;
1399     return;
1400   }
1401   std::string FileName = Tok.getString();
1402   SourceLocation FileNameLoc = consumeToken();
1403 
1404   // Check whether we already have an umbrella.
1405   if (LeadingToken == MMToken::UmbrellaKeyword && ActiveModule->Umbrella) {
1406     Diags.Report(FileNameLoc, diag::err_mmap_umbrella_clash)
1407       << ActiveModule->getFullModuleName();
1408     HadError = true;
1409     return;
1410   }
1411 
1412   // Look for this file.
1413   const FileEntry *File = 0;
1414   const FileEntry *BuiltinFile = 0;
1415   SmallString<128> PathName;
1416   if (llvm::sys::path::is_absolute(FileName)) {
1417     PathName = FileName;
1418     File = SourceMgr.getFileManager().getFile(PathName);
1419   } else if (const DirectoryEntry *Dir = getOverriddenHeaderSearchDir()) {
1420     PathName = Dir->getName();
1421     llvm::sys::path::append(PathName, FileName);
1422     File = SourceMgr.getFileManager().getFile(PathName);
1423   } else {
1424     // Search for the header file within the search directory.
1425     PathName = Directory->getName();
1426     unsigned PathLength = PathName.size();
1427 
1428     if (ActiveModule->isPartOfFramework()) {
1429       appendSubframeworkPaths(ActiveModule, PathName);
1430 
1431       // Check whether this file is in the public headers.
1432       llvm::sys::path::append(PathName, "Headers", FileName);
1433       File = SourceMgr.getFileManager().getFile(PathName);
1434 
1435       if (!File) {
1436         // Check whether this file is in the private headers.
1437         PathName.resize(PathLength);
1438         llvm::sys::path::append(PathName, "PrivateHeaders", FileName);
1439         File = SourceMgr.getFileManager().getFile(PathName);
1440       }
1441     } else {
1442       // Lookup for normal headers.
1443       llvm::sys::path::append(PathName, FileName);
1444       File = SourceMgr.getFileManager().getFile(PathName);
1445 
1446       // If this is a system module with a top-level header, this header
1447       // may have a counterpart (or replacement) in the set of headers
1448       // supplied by Clang. Find that builtin header.
1449       if (ActiveModule->IsSystem && LeadingToken != MMToken::UmbrellaKeyword &&
1450           BuiltinIncludeDir && BuiltinIncludeDir != Directory &&
1451           isBuiltinHeader(FileName)) {
1452         SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName());
1453         llvm::sys::path::append(BuiltinPathName, FileName);
1454         BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName);
1455 
1456         // If Clang supplies this header but the underlying system does not,
1457         // just silently swap in our builtin version. Otherwise, we'll end
1458         // up adding both (later).
1459         if (!File && BuiltinFile) {
1460           File = BuiltinFile;
1461           BuiltinFile = 0;
1462         }
1463       }
1464     }
1465   }
1466 
1467   // FIXME: We shouldn't be eagerly stat'ing every file named in a module map.
1468   // Come up with a lazy way to do this.
1469   if (File) {
1470     if (ModuleMap::KnownHeader OwningModule = Map.Headers[File]) {
1471       Diags.Report(FileNameLoc, diag::err_mmap_header_conflict)
1472         << FileName << OwningModule.getModule()->getFullModuleName();
1473       HadError = true;
1474     } else if (LeadingToken == MMToken::UmbrellaKeyword) {
1475       const DirectoryEntry *UmbrellaDir = File->getDir();
1476       if (Module *UmbrellaModule = Map.UmbrellaDirs[UmbrellaDir]) {
1477         Diags.Report(LeadingLoc, diag::err_mmap_umbrella_clash)
1478           << UmbrellaModule->getFullModuleName();
1479         HadError = true;
1480       } else {
1481         // Record this umbrella header.
1482         Map.setUmbrellaHeader(ActiveModule, File);
1483       }
1484     } else {
1485       // Record this header.
1486       ModuleMap::ModuleHeaderRole Role = ModuleMap::NormalHeader;
1487       if (LeadingToken == MMToken::ExcludeKeyword)
1488         Role = ModuleMap::ExcludedHeader;
1489       else if (LeadingToken == MMToken::PrivateKeyword)
1490         Role = ModuleMap::PrivateHeader;
1491       else
1492         assert(LeadingToken == MMToken::HeaderKeyword);
1493 
1494       Map.addHeader(ActiveModule, File, Role);
1495 
1496       // If there is a builtin counterpart to this file, add it now.
1497       if (BuiltinFile)
1498         Map.addHeader(ActiveModule, BuiltinFile, Role);
1499     }
1500   } else if (LeadingToken != MMToken::ExcludeKeyword) {
1501     // Ignore excluded header files. They're optional anyway.
1502 
1503     Diags.Report(FileNameLoc, diag::err_mmap_header_not_found)
1504       << (LeadingToken == MMToken::UmbrellaKeyword) << FileName;
1505     HadError = true;
1506   }
1507 }
1508 
1509 /// \brief Parse an umbrella directory declaration.
1510 ///
1511 ///   umbrella-dir-declaration:
1512 ///     umbrella string-literal
1513 void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) {
1514   // Parse the directory name.
1515   if (!Tok.is(MMToken::StringLiteral)) {
1516     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1517       << "umbrella";
1518     HadError = true;
1519     return;
1520   }
1521 
1522   std::string DirName = Tok.getString();
1523   SourceLocation DirNameLoc = consumeToken();
1524 
1525   // Check whether we already have an umbrella.
1526   if (ActiveModule->Umbrella) {
1527     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash)
1528       << ActiveModule->getFullModuleName();
1529     HadError = true;
1530     return;
1531   }
1532 
1533   // Look for this file.
1534   const DirectoryEntry *Dir = 0;
1535   if (llvm::sys::path::is_absolute(DirName))
1536     Dir = SourceMgr.getFileManager().getDirectory(DirName);
1537   else {
1538     SmallString<128> PathName;
1539     PathName = Directory->getName();
1540     llvm::sys::path::append(PathName, DirName);
1541     Dir = SourceMgr.getFileManager().getDirectory(PathName);
1542   }
1543 
1544   if (!Dir) {
1545     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found)
1546       << DirName;
1547     HadError = true;
1548     return;
1549   }
1550 
1551   if (Module *OwningModule = Map.UmbrellaDirs[Dir]) {
1552     Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
1553       << OwningModule->getFullModuleName();
1554     HadError = true;
1555     return;
1556   }
1557 
1558   // Record this umbrella directory.
1559   Map.setUmbrellaDir(ActiveModule, Dir);
1560 }
1561 
1562 /// \brief Parse a module export declaration.
1563 ///
1564 ///   export-declaration:
1565 ///     'export' wildcard-module-id
1566 ///
1567 ///   wildcard-module-id:
1568 ///     identifier
1569 ///     '*'
1570 ///     identifier '.' wildcard-module-id
1571 void ModuleMapParser::parseExportDecl() {
1572   assert(Tok.is(MMToken::ExportKeyword));
1573   SourceLocation ExportLoc = consumeToken();
1574 
1575   // Parse the module-id with an optional wildcard at the end.
1576   ModuleId ParsedModuleId;
1577   bool Wildcard = false;
1578   do {
1579     if (Tok.is(MMToken::Identifier)) {
1580       ParsedModuleId.push_back(std::make_pair(Tok.getString(),
1581                                               Tok.getLocation()));
1582       consumeToken();
1583 
1584       if (Tok.is(MMToken::Period)) {
1585         consumeToken();
1586         continue;
1587       }
1588 
1589       break;
1590     }
1591 
1592     if(Tok.is(MMToken::Star)) {
1593       Wildcard = true;
1594       consumeToken();
1595       break;
1596     }
1597 
1598     Diags.Report(Tok.getLocation(), diag::err_mmap_export_module_id);
1599     HadError = true;
1600     return;
1601   } while (true);
1602 
1603   Module::UnresolvedExportDecl Unresolved = {
1604     ExportLoc, ParsedModuleId, Wildcard
1605   };
1606   ActiveModule->UnresolvedExports.push_back(Unresolved);
1607 }
1608 
1609 /// \brief Parse a link declaration.
1610 ///
1611 ///   module-declaration:
1612 ///     'link' 'framework'[opt] string-literal
1613 void ModuleMapParser::parseLinkDecl() {
1614   assert(Tok.is(MMToken::LinkKeyword));
1615   SourceLocation LinkLoc = consumeToken();
1616 
1617   // Parse the optional 'framework' keyword.
1618   bool IsFramework = false;
1619   if (Tok.is(MMToken::FrameworkKeyword)) {
1620     consumeToken();
1621     IsFramework = true;
1622   }
1623 
1624   // Parse the library name
1625   if (!Tok.is(MMToken::StringLiteral)) {
1626     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_library_name)
1627       << IsFramework << SourceRange(LinkLoc);
1628     HadError = true;
1629     return;
1630   }
1631 
1632   std::string LibraryName = Tok.getString();
1633   consumeToken();
1634   ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName,
1635                                                             IsFramework));
1636 }
1637 
1638 /// \brief Parse a configuration macro declaration.
1639 ///
1640 ///   module-declaration:
1641 ///     'config_macros' attributes[opt] config-macro-list?
1642 ///
1643 ///   config-macro-list:
1644 ///     identifier (',' identifier)?
1645 void ModuleMapParser::parseConfigMacros() {
1646   assert(Tok.is(MMToken::ConfigMacros));
1647   SourceLocation ConfigMacrosLoc = consumeToken();
1648 
1649   // Only top-level modules can have configuration macros.
1650   if (ActiveModule->Parent) {
1651     Diags.Report(ConfigMacrosLoc, diag::err_mmap_config_macro_submodule);
1652   }
1653 
1654   // Parse the optional attributes.
1655   Attributes Attrs;
1656   parseOptionalAttributes(Attrs);
1657   if (Attrs.IsExhaustive && !ActiveModule->Parent) {
1658     ActiveModule->ConfigMacrosExhaustive = true;
1659   }
1660 
1661   // If we don't have an identifier, we're done.
1662   if (!Tok.is(MMToken::Identifier))
1663     return;
1664 
1665   // Consume the first identifier.
1666   if (!ActiveModule->Parent) {
1667     ActiveModule->ConfigMacros.push_back(Tok.getString().str());
1668   }
1669   consumeToken();
1670 
1671   do {
1672     // If there's a comma, consume it.
1673     if (!Tok.is(MMToken::Comma))
1674       break;
1675     consumeToken();
1676 
1677     // We expect to see a macro name here.
1678     if (!Tok.is(MMToken::Identifier)) {
1679       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_config_macro);
1680       break;
1681     }
1682 
1683     // Consume the macro name.
1684     if (!ActiveModule->Parent) {
1685       ActiveModule->ConfigMacros.push_back(Tok.getString().str());
1686     }
1687     consumeToken();
1688   } while (true);
1689 }
1690 
1691 /// \brief Format a module-id into a string.
1692 static std::string formatModuleId(const ModuleId &Id) {
1693   std::string result;
1694   {
1695     llvm::raw_string_ostream OS(result);
1696 
1697     for (unsigned I = 0, N = Id.size(); I != N; ++I) {
1698       if (I)
1699         OS << ".";
1700       OS << Id[I].first;
1701     }
1702   }
1703 
1704   return result;
1705 }
1706 
1707 /// \brief Parse a conflict declaration.
1708 ///
1709 ///   module-declaration:
1710 ///     'conflict' module-id ',' string-literal
1711 void ModuleMapParser::parseConflict() {
1712   assert(Tok.is(MMToken::Conflict));
1713   SourceLocation ConflictLoc = consumeToken();
1714   Module::UnresolvedConflict Conflict;
1715 
1716   // Parse the module-id.
1717   if (parseModuleId(Conflict.Id))
1718     return;
1719 
1720   // Parse the ','.
1721   if (!Tok.is(MMToken::Comma)) {
1722     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_comma)
1723       << SourceRange(ConflictLoc);
1724     return;
1725   }
1726   consumeToken();
1727 
1728   // Parse the message.
1729   if (!Tok.is(MMToken::StringLiteral)) {
1730     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_message)
1731       << formatModuleId(Conflict.Id);
1732     return;
1733   }
1734   Conflict.Message = Tok.getString().str();
1735   consumeToken();
1736 
1737   // Add this unresolved conflict.
1738   ActiveModule->UnresolvedConflicts.push_back(Conflict);
1739 }
1740 
1741 /// \brief Parse an inferred module declaration (wildcard modules).
1742 ///
1743 ///   module-declaration:
1744 ///     'explicit'[opt] 'framework'[opt] 'module' * attributes[opt]
1745 ///       { inferred-module-member* }
1746 ///
1747 ///   inferred-module-member:
1748 ///     'export' '*'
1749 ///     'exclude' identifier
1750 void ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) {
1751   assert(Tok.is(MMToken::Star));
1752   SourceLocation StarLoc = consumeToken();
1753   bool Failed = false;
1754 
1755   // Inferred modules must be submodules.
1756   if (!ActiveModule && !Framework) {
1757     Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule);
1758     Failed = true;
1759   }
1760 
1761   if (ActiveModule) {
1762     // Inferred modules must have umbrella directories.
1763     if (!Failed && !ActiveModule->getUmbrellaDir()) {
1764       Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
1765       Failed = true;
1766     }
1767 
1768     // Check for redefinition of an inferred module.
1769     if (!Failed && ActiveModule->InferSubmodules) {
1770       Diags.Report(StarLoc, diag::err_mmap_inferred_redef);
1771       if (ActiveModule->InferredSubmoduleLoc.isValid())
1772         Diags.Report(ActiveModule->InferredSubmoduleLoc,
1773                      diag::note_mmap_prev_definition);
1774       Failed = true;
1775     }
1776 
1777     // Check for the 'framework' keyword, which is not permitted here.
1778     if (Framework) {
1779       Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule);
1780       Framework = false;
1781     }
1782   } else if (Explicit) {
1783     Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework);
1784     Explicit = false;
1785   }
1786 
1787   // If there were any problems with this inferred submodule, skip its body.
1788   if (Failed) {
1789     if (Tok.is(MMToken::LBrace)) {
1790       consumeToken();
1791       skipUntil(MMToken::RBrace);
1792       if (Tok.is(MMToken::RBrace))
1793         consumeToken();
1794     }
1795     HadError = true;
1796     return;
1797   }
1798 
1799   // Parse optional attributes.
1800   Attributes Attrs;
1801   parseOptionalAttributes(Attrs);
1802 
1803   if (ActiveModule) {
1804     // Note that we have an inferred submodule.
1805     ActiveModule->InferSubmodules = true;
1806     ActiveModule->InferredSubmoduleLoc = StarLoc;
1807     ActiveModule->InferExplicitSubmodules = Explicit;
1808   } else {
1809     // We'll be inferring framework modules for this directory.
1810     Map.InferredDirectories[Directory].InferModules = true;
1811     Map.InferredDirectories[Directory].InferSystemModules = Attrs.IsSystem;
1812   }
1813 
1814   // Parse the opening brace.
1815   if (!Tok.is(MMToken::LBrace)) {
1816     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard);
1817     HadError = true;
1818     return;
1819   }
1820   SourceLocation LBraceLoc = consumeToken();
1821 
1822   // Parse the body of the inferred submodule.
1823   bool Done = false;
1824   do {
1825     switch (Tok.Kind) {
1826     case MMToken::EndOfFile:
1827     case MMToken::RBrace:
1828       Done = true;
1829       break;
1830 
1831     case MMToken::ExcludeKeyword: {
1832       if (ActiveModule) {
1833         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
1834           << (ActiveModule != 0);
1835         consumeToken();
1836         break;
1837       }
1838 
1839       consumeToken();
1840       if (!Tok.is(MMToken::Identifier)) {
1841         Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name);
1842         break;
1843       }
1844 
1845       Map.InferredDirectories[Directory].ExcludedModules
1846         .push_back(Tok.getString());
1847       consumeToken();
1848       break;
1849     }
1850 
1851     case MMToken::ExportKeyword:
1852       if (!ActiveModule) {
1853         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
1854           << (ActiveModule != 0);
1855         consumeToken();
1856         break;
1857       }
1858 
1859       consumeToken();
1860       if (Tok.is(MMToken::Star))
1861         ActiveModule->InferExportWildcard = true;
1862       else
1863         Diags.Report(Tok.getLocation(),
1864                      diag::err_mmap_expected_export_wildcard);
1865       consumeToken();
1866       break;
1867 
1868     case MMToken::ExplicitKeyword:
1869     case MMToken::ModuleKeyword:
1870     case MMToken::HeaderKeyword:
1871     case MMToken::PrivateKeyword:
1872     case MMToken::UmbrellaKeyword:
1873     default:
1874       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
1875           << (ActiveModule != 0);
1876       consumeToken();
1877       break;
1878     }
1879   } while (!Done);
1880 
1881   if (Tok.is(MMToken::RBrace))
1882     consumeToken();
1883   else {
1884     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1885     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1886     HadError = true;
1887   }
1888 }
1889 
1890 /// \brief Parse optional attributes.
1891 ///
1892 ///   attributes:
1893 ///     attribute attributes
1894 ///     attribute
1895 ///
1896 ///   attribute:
1897 ///     [ identifier ]
1898 ///
1899 /// \param Attrs Will be filled in with the parsed attributes.
1900 ///
1901 /// \returns true if an error occurred, false otherwise.
1902 bool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) {
1903   bool HadError = false;
1904 
1905   while (Tok.is(MMToken::LSquare)) {
1906     // Consume the '['.
1907     SourceLocation LSquareLoc = consumeToken();
1908 
1909     // Check whether we have an attribute name here.
1910     if (!Tok.is(MMToken::Identifier)) {
1911       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute);
1912       skipUntil(MMToken::RSquare);
1913       if (Tok.is(MMToken::RSquare))
1914         consumeToken();
1915       HadError = true;
1916     }
1917 
1918     // Decode the attribute name.
1919     AttributeKind Attribute
1920       = llvm::StringSwitch<AttributeKind>(Tok.getString())
1921           .Case("exhaustive", AT_exhaustive)
1922           .Case("system", AT_system)
1923           .Default(AT_unknown);
1924     switch (Attribute) {
1925     case AT_unknown:
1926       Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute)
1927         << Tok.getString();
1928       break;
1929 
1930     case AT_system:
1931       Attrs.IsSystem = true;
1932       break;
1933 
1934     case AT_exhaustive:
1935       Attrs.IsExhaustive = true;
1936       break;
1937     }
1938     consumeToken();
1939 
1940     // Consume the ']'.
1941     if (!Tok.is(MMToken::RSquare)) {
1942       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare);
1943       Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match);
1944       skipUntil(MMToken::RSquare);
1945       HadError = true;
1946     }
1947 
1948     if (Tok.is(MMToken::RSquare))
1949       consumeToken();
1950   }
1951 
1952   return HadError;
1953 }
1954 
1955 /// \brief If there is a specific header search directory due the presence
1956 /// of an umbrella directory, retrieve that directory. Otherwise, returns null.
1957 const DirectoryEntry *ModuleMapParser::getOverriddenHeaderSearchDir() {
1958   for (Module *Mod = ActiveModule; Mod; Mod = Mod->Parent) {
1959     // If we have an umbrella directory, use that.
1960     if (Mod->hasUmbrellaDir())
1961       return Mod->getUmbrellaDir();
1962 
1963     // If we have a framework directory, stop looking.
1964     if (Mod->IsFramework)
1965       return 0;
1966   }
1967 
1968   return 0;
1969 }
1970 
1971 /// \brief Parse a module map file.
1972 ///
1973 ///   module-map-file:
1974 ///     module-declaration*
1975 bool ModuleMapParser::parseModuleMapFile() {
1976   do {
1977     switch (Tok.Kind) {
1978     case MMToken::EndOfFile:
1979       return HadError;
1980 
1981     case MMToken::ExplicitKeyword:
1982     case MMToken::ExternKeyword:
1983     case MMToken::ModuleKeyword:
1984     case MMToken::FrameworkKeyword:
1985       parseModuleDecl();
1986       break;
1987 
1988     case MMToken::Comma:
1989     case MMToken::ConfigMacros:
1990     case MMToken::Conflict:
1991     case MMToken::ExcludeKeyword:
1992     case MMToken::ExportKeyword:
1993     case MMToken::HeaderKeyword:
1994     case MMToken::Identifier:
1995     case MMToken::LBrace:
1996     case MMToken::LinkKeyword:
1997     case MMToken::LSquare:
1998     case MMToken::Period:
1999     case MMToken::PrivateKeyword:
2000     case MMToken::RBrace:
2001     case MMToken::RSquare:
2002     case MMToken::RequiresKeyword:
2003     case MMToken::Star:
2004     case MMToken::StringLiteral:
2005     case MMToken::UmbrellaKeyword:
2006       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
2007       HadError = true;
2008       consumeToken();
2009       break;
2010     }
2011   } while (true);
2012 }
2013 
2014 bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem) {
2015   llvm::DenseMap<const FileEntry *, bool>::iterator Known
2016     = ParsedModuleMap.find(File);
2017   if (Known != ParsedModuleMap.end())
2018     return Known->second;
2019 
2020   assert(Target != 0 && "Missing target information");
2021   FileID ID = SourceMgr->createFileID(File, SourceLocation(), SrcMgr::C_User);
2022   const llvm::MemoryBuffer *Buffer = SourceMgr->getBuffer(ID);
2023   if (!Buffer)
2024     return ParsedModuleMap[File] = true;
2025 
2026   // Parse this module map file.
2027   Lexer L(ID, SourceMgr->getBuffer(ID), *SourceMgr, MMapLangOpts);
2028   Diags->getClient()->BeginSourceFile(MMapLangOpts);
2029   ModuleMapParser Parser(L, *SourceMgr, Target, *Diags, *this, File->getDir(),
2030                          BuiltinIncludeDir, IsSystem);
2031   bool Result = Parser.parseModuleMapFile();
2032   Diags->getClient()->EndSourceFile();
2033   ParsedModuleMap[File] = Result;
2034   return Result;
2035 }
2036