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