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