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