xref: /llvm-project/clang/lib/Lex/ModuleMap.cpp (revision 5d29dee00343de8eecff9c4b7ee1775c4d2eeb47)
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   if (parseOptionalAttributes(Attrs))
1406     return;
1407 
1408 
1409   // Parse the opening brace.
1410   if (!Tok.is(MMToken::LBrace)) {
1411     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace)
1412       << ModuleName;
1413     HadError = true;
1414     return;
1415   }
1416   SourceLocation LBraceLoc = consumeToken();
1417 
1418   // Determine whether this (sub)module has already been defined.
1419   if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) {
1420     if (Existing->DefinitionLoc.isInvalid() && !ActiveModule) {
1421       // Skip the module definition.
1422       skipUntil(MMToken::RBrace);
1423       if (Tok.is(MMToken::RBrace))
1424         consumeToken();
1425       else {
1426         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1427         Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1428         HadError = true;
1429       }
1430       return;
1431     }
1432 
1433     Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition)
1434       << ModuleName;
1435     Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition);
1436 
1437     // Skip the module definition.
1438     skipUntil(MMToken::RBrace);
1439     if (Tok.is(MMToken::RBrace))
1440       consumeToken();
1441 
1442     HadError = true;
1443     return;
1444   }
1445 
1446   // Start defining this module.
1447   ActiveModule = Map.findOrCreateModule(ModuleName, ActiveModule, Framework,
1448                                         Explicit).first;
1449   ActiveModule->DefinitionLoc = ModuleNameLoc;
1450   if (Attrs.IsSystem || IsSystem)
1451     ActiveModule->IsSystem = true;
1452   if (Attrs.IsExternC)
1453     ActiveModule->IsExternC = true;
1454   ActiveModule->Directory = Directory;
1455 
1456   bool Done = false;
1457   do {
1458     switch (Tok.Kind) {
1459     case MMToken::EndOfFile:
1460     case MMToken::RBrace:
1461       Done = true;
1462       break;
1463 
1464     case MMToken::ConfigMacros:
1465       parseConfigMacros();
1466       break;
1467 
1468     case MMToken::Conflict:
1469       parseConflict();
1470       break;
1471 
1472     case MMToken::ExplicitKeyword:
1473     case MMToken::ExternKeyword:
1474     case MMToken::FrameworkKeyword:
1475     case MMToken::ModuleKeyword:
1476       parseModuleDecl();
1477       break;
1478 
1479     case MMToken::ExportKeyword:
1480       parseExportDecl();
1481       break;
1482 
1483     case MMToken::UseKeyword:
1484       parseUseDecl();
1485       break;
1486 
1487     case MMToken::RequiresKeyword:
1488       parseRequiresDecl();
1489       break;
1490 
1491     case MMToken::TextualKeyword:
1492       parseHeaderDecl(MMToken::TextualKeyword, consumeToken());
1493       break;
1494 
1495     case MMToken::UmbrellaKeyword: {
1496       SourceLocation UmbrellaLoc = consumeToken();
1497       if (Tok.is(MMToken::HeaderKeyword))
1498         parseHeaderDecl(MMToken::UmbrellaKeyword, UmbrellaLoc);
1499       else
1500         parseUmbrellaDirDecl(UmbrellaLoc);
1501       break;
1502     }
1503 
1504     case MMToken::ExcludeKeyword:
1505       parseHeaderDecl(MMToken::ExcludeKeyword, consumeToken());
1506       break;
1507 
1508     case MMToken::PrivateKeyword:
1509       parseHeaderDecl(MMToken::PrivateKeyword, consumeToken());
1510       break;
1511 
1512     case MMToken::HeaderKeyword:
1513       parseHeaderDecl(MMToken::HeaderKeyword, consumeToken());
1514       break;
1515 
1516     case MMToken::LinkKeyword:
1517       parseLinkDecl();
1518       break;
1519 
1520     default:
1521       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member);
1522       consumeToken();
1523       break;
1524     }
1525   } while (!Done);
1526 
1527   if (Tok.is(MMToken::RBrace))
1528     consumeToken();
1529   else {
1530     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1531     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1532     HadError = true;
1533   }
1534 
1535   // If the active module is a top-level framework, and there are no link
1536   // libraries, automatically link against the framework.
1537   if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() &&
1538       ActiveModule->LinkLibraries.empty()) {
1539     inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager());
1540   }
1541 
1542   // If the module meets all requirements but is still unavailable, mark the
1543   // whole tree as unavailable to prevent it from building.
1544   if (!ActiveModule->IsAvailable && !ActiveModule->IsMissingRequirement &&
1545       ActiveModule->Parent) {
1546     ActiveModule->getTopLevelModule()->markUnavailable();
1547     ActiveModule->getTopLevelModule()->MissingHeaders.append(
1548       ActiveModule->MissingHeaders.begin(), ActiveModule->MissingHeaders.end());
1549   }
1550 
1551   // We're done parsing this module. Pop back to the previous module.
1552   ActiveModule = PreviousActiveModule;
1553 }
1554 
1555 /// \brief Parse an extern module declaration.
1556 ///
1557 ///   extern module-declaration:
1558 ///     'extern' 'module' module-id string-literal
1559 void ModuleMapParser::parseExternModuleDecl() {
1560   assert(Tok.is(MMToken::ExternKeyword));
1561   SourceLocation ExternLoc = consumeToken(); // 'extern' keyword
1562 
1563   // Parse 'module' keyword.
1564   if (!Tok.is(MMToken::ModuleKeyword)) {
1565     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1566     consumeToken();
1567     HadError = true;
1568     return;
1569   }
1570   consumeToken(); // 'module' keyword
1571 
1572   // Parse the module name.
1573   ModuleId Id;
1574   if (parseModuleId(Id)) {
1575     HadError = true;
1576     return;
1577   }
1578 
1579   // Parse the referenced module map file name.
1580   if (!Tok.is(MMToken::StringLiteral)) {
1581     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_mmap_file);
1582     HadError = true;
1583     return;
1584   }
1585   std::string FileName = Tok.getString();
1586   consumeToken(); // filename
1587 
1588   StringRef FileNameRef = FileName;
1589   SmallString<128> ModuleMapFileName;
1590   if (llvm::sys::path::is_relative(FileNameRef)) {
1591     ModuleMapFileName += Directory->getName();
1592     llvm::sys::path::append(ModuleMapFileName, FileName);
1593     FileNameRef = ModuleMapFileName;
1594   }
1595   if (const FileEntry *File = SourceMgr.getFileManager().getFile(FileNameRef))
1596     Map.parseModuleMapFile(
1597         File, /*IsSystem=*/false,
1598         Map.HeaderInfo.getHeaderSearchOpts().ModuleMapFileHomeIsCwd
1599             ? Directory
1600             : File->getDir(), ExternLoc);
1601 }
1602 
1603 /// Whether to add the requirement \p Feature to the module \p M.
1604 ///
1605 /// This preserves backwards compatibility for two hacks in the Darwin system
1606 /// module map files:
1607 ///
1608 /// 1. The use of 'requires excluded' to make headers non-modular, which
1609 ///    should really be mapped to 'textual' now that we have this feature.  We
1610 ///    drop the 'excluded' requirement, and set \p IsRequiresExcludedHack to
1611 ///    true.  Later, this bit will be used to map all the headers inside this
1612 ///    module to 'textual'.
1613 ///
1614 ///    This affects Darwin.C.excluded (for assert.h) and Tcl.Private.
1615 ///
1616 /// 2. Removes a bogus cplusplus requirement from IOKit.avc.  This requirement
1617 ///    was never correct and causes issues now that we check it, so drop it.
1618 static bool shouldAddRequirement(Module *M, StringRef Feature,
1619                                  bool &IsRequiresExcludedHack) {
1620   static const StringRef DarwinCExcluded[] = {"Darwin", "C", "excluded"};
1621   static const StringRef TclPrivate[] = {"Tcl", "Private"};
1622   static const StringRef IOKitAVC[] = {"IOKit", "avc"};
1623 
1624   if (Feature == "excluded" && (M->fullModuleNameIs(DarwinCExcluded) ||
1625                                 M->fullModuleNameIs(TclPrivate))) {
1626     IsRequiresExcludedHack = true;
1627     return false;
1628   } else if (Feature == "cplusplus" && M->fullModuleNameIs(IOKitAVC)) {
1629     return false;
1630   }
1631 
1632   return true;
1633 }
1634 
1635 /// \brief Parse a requires declaration.
1636 ///
1637 ///   requires-declaration:
1638 ///     'requires' feature-list
1639 ///
1640 ///   feature-list:
1641 ///     feature ',' feature-list
1642 ///     feature
1643 ///
1644 ///   feature:
1645 ///     '!'[opt] identifier
1646 void ModuleMapParser::parseRequiresDecl() {
1647   assert(Tok.is(MMToken::RequiresKeyword));
1648 
1649   // Parse 'requires' keyword.
1650   consumeToken();
1651 
1652   // Parse the feature-list.
1653   do {
1654     bool RequiredState = true;
1655     if (Tok.is(MMToken::Exclaim)) {
1656       RequiredState = false;
1657       consumeToken();
1658     }
1659 
1660     if (!Tok.is(MMToken::Identifier)) {
1661       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature);
1662       HadError = true;
1663       return;
1664     }
1665 
1666     // Consume the feature name.
1667     std::string Feature = Tok.getString();
1668     consumeToken();
1669 
1670     bool IsRequiresExcludedHack = false;
1671     bool ShouldAddRequirement =
1672         shouldAddRequirement(ActiveModule, Feature, IsRequiresExcludedHack);
1673 
1674     if (IsRequiresExcludedHack)
1675       UsesRequiresExcludedHack.insert(ActiveModule);
1676 
1677     if (ShouldAddRequirement) {
1678       // Add this feature.
1679       ActiveModule->addRequirement(Feature, RequiredState, Map.LangOpts,
1680                                    *Map.Target);
1681     }
1682 
1683     if (!Tok.is(MMToken::Comma))
1684       break;
1685 
1686     // Consume the comma.
1687     consumeToken();
1688   } while (true);
1689 }
1690 
1691 /// \brief Append to \p Paths the set of paths needed to get to the
1692 /// subframework in which the given module lives.
1693 static void appendSubframeworkPaths(Module *Mod,
1694                                     SmallVectorImpl<char> &Path) {
1695   // Collect the framework names from the given module to the top-level module.
1696   SmallVector<StringRef, 2> Paths;
1697   for (; Mod; Mod = Mod->Parent) {
1698     if (Mod->IsFramework)
1699       Paths.push_back(Mod->Name);
1700   }
1701 
1702   if (Paths.empty())
1703     return;
1704 
1705   // Add Frameworks/Name.framework for each subframework.
1706   for (unsigned I = Paths.size() - 1; I != 0; --I)
1707     llvm::sys::path::append(Path, "Frameworks", Paths[I-1] + ".framework");
1708 }
1709 
1710 /// \brief Parse a header declaration.
1711 ///
1712 ///   header-declaration:
1713 ///     'textual'[opt] 'header' string-literal
1714 ///     'private' 'textual'[opt] 'header' string-literal
1715 ///     'exclude' 'header' string-literal
1716 ///     'umbrella' 'header' string-literal
1717 ///
1718 /// FIXME: Support 'private textual header'.
1719 void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken,
1720                                       SourceLocation LeadingLoc) {
1721   // We've already consumed the first token.
1722   ModuleMap::ModuleHeaderRole Role = ModuleMap::NormalHeader;
1723   if (LeadingToken == MMToken::PrivateKeyword) {
1724     Role = ModuleMap::PrivateHeader;
1725     // 'private' may optionally be followed by 'textual'.
1726     if (Tok.is(MMToken::TextualKeyword)) {
1727       LeadingToken = Tok.Kind;
1728       consumeToken();
1729     }
1730   }
1731 
1732   if (LeadingToken == MMToken::TextualKeyword)
1733     Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader);
1734 
1735   if (UsesRequiresExcludedHack.count(ActiveModule)) {
1736     // Mark this header 'textual' (see doc comment for
1737     // Module::UsesRequiresExcludedHack).
1738     Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader);
1739   }
1740 
1741   if (LeadingToken != MMToken::HeaderKeyword) {
1742     if (!Tok.is(MMToken::HeaderKeyword)) {
1743       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1744           << (LeadingToken == MMToken::PrivateKeyword ? "private" :
1745               LeadingToken == MMToken::ExcludeKeyword ? "exclude" :
1746               LeadingToken == MMToken::TextualKeyword ? "textual" : "umbrella");
1747       return;
1748     }
1749     consumeToken();
1750   }
1751 
1752   // Parse the header name.
1753   if (!Tok.is(MMToken::StringLiteral)) {
1754     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1755       << "header";
1756     HadError = true;
1757     return;
1758   }
1759   Module::UnresolvedHeaderDirective Header;
1760   Header.FileName = Tok.getString();
1761   Header.FileNameLoc = consumeToken();
1762 
1763   // Check whether we already have an umbrella.
1764   if (LeadingToken == MMToken::UmbrellaKeyword && ActiveModule->Umbrella) {
1765     Diags.Report(Header.FileNameLoc, diag::err_mmap_umbrella_clash)
1766       << ActiveModule->getFullModuleName();
1767     HadError = true;
1768     return;
1769   }
1770 
1771   // Look for this file.
1772   const FileEntry *File = nullptr;
1773   const FileEntry *BuiltinFile = nullptr;
1774   SmallString<128> RelativePathName;
1775   if (llvm::sys::path::is_absolute(Header.FileName)) {
1776     RelativePathName = Header.FileName;
1777     File = SourceMgr.getFileManager().getFile(RelativePathName);
1778   } else {
1779     // Search for the header file within the search directory.
1780     SmallString<128> FullPathName(Directory->getName());
1781     unsigned FullPathLength = FullPathName.size();
1782 
1783     if (ActiveModule->isPartOfFramework()) {
1784       appendSubframeworkPaths(ActiveModule, RelativePathName);
1785 
1786       // Check whether this file is in the public headers.
1787       llvm::sys::path::append(RelativePathName, "Headers", Header.FileName);
1788       llvm::sys::path::append(FullPathName, RelativePathName);
1789       File = SourceMgr.getFileManager().getFile(FullPathName);
1790 
1791       if (!File) {
1792         // Check whether this file is in the private headers.
1793         // FIXME: Should we retain the subframework paths here?
1794         RelativePathName.clear();
1795         FullPathName.resize(FullPathLength);
1796         llvm::sys::path::append(RelativePathName, "PrivateHeaders",
1797                                 Header.FileName);
1798         llvm::sys::path::append(FullPathName, RelativePathName);
1799         File = SourceMgr.getFileManager().getFile(FullPathName);
1800       }
1801     } else {
1802       // Lookup for normal headers.
1803       llvm::sys::path::append(RelativePathName, Header.FileName);
1804       llvm::sys::path::append(FullPathName, RelativePathName);
1805       File = SourceMgr.getFileManager().getFile(FullPathName);
1806 
1807       // If this is a system module with a top-level header, this header
1808       // may have a counterpart (or replacement) in the set of headers
1809       // supplied by Clang. Find that builtin header.
1810       if (ActiveModule->IsSystem && LeadingToken != MMToken::UmbrellaKeyword &&
1811           BuiltinIncludeDir && BuiltinIncludeDir != Directory &&
1812           isBuiltinHeader(Header.FileName)) {
1813         SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName());
1814         llvm::sys::path::append(BuiltinPathName, Header.FileName);
1815         BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName);
1816 
1817         // If Clang supplies this header but the underlying system does not,
1818         // just silently swap in our builtin version. Otherwise, we'll end
1819         // up adding both (later).
1820         //
1821         // For local visibility, entirely replace the system file with our
1822         // one and textually include the system one. We need to pass macros
1823         // from our header to the system one if we #include_next it.
1824         //
1825         // FIXME: Can we do this in all cases?
1826         if (BuiltinFile && (!File || Map.LangOpts.ModulesLocalVisibility)) {
1827           File = BuiltinFile;
1828           RelativePathName = BuiltinPathName;
1829           BuiltinFile = nullptr;
1830         }
1831       }
1832     }
1833   }
1834 
1835   // FIXME: We shouldn't be eagerly stat'ing every file named in a module map.
1836   // Come up with a lazy way to do this.
1837   if (File) {
1838     if (LeadingToken == MMToken::UmbrellaKeyword) {
1839       const DirectoryEntry *UmbrellaDir = File->getDir();
1840       if (Module *UmbrellaModule = Map.UmbrellaDirs[UmbrellaDir]) {
1841         Diags.Report(LeadingLoc, diag::err_mmap_umbrella_clash)
1842           << UmbrellaModule->getFullModuleName();
1843         HadError = true;
1844       } else {
1845         // Record this umbrella header.
1846         Map.setUmbrellaHeader(ActiveModule, File, RelativePathName.str());
1847       }
1848     } else if (LeadingToken == MMToken::ExcludeKeyword) {
1849       Module::Header H = {RelativePathName.str(), File};
1850       Map.excludeHeader(ActiveModule, H);
1851     } else {
1852       // If there is a builtin counterpart to this file, add it now, before
1853       // the "real" header, so we build the built-in one first when building
1854       // the module.
1855       if (BuiltinFile) {
1856         // FIXME: Taking the name from the FileEntry is unstable and can give
1857         // different results depending on how we've previously named that file
1858         // in this build.
1859         Module::Header H = { BuiltinFile->getName(), BuiltinFile };
1860         Map.addHeader(ActiveModule, H, Role);
1861       }
1862 
1863       // Record this header.
1864       Module::Header H = { RelativePathName.str(), File };
1865       Map.addHeader(ActiveModule, H, Role);
1866     }
1867   } else if (LeadingToken != MMToken::ExcludeKeyword) {
1868     // Ignore excluded header files. They're optional anyway.
1869 
1870     // If we find a module that has a missing header, we mark this module as
1871     // unavailable and store the header directive for displaying diagnostics.
1872     Header.IsUmbrella = LeadingToken == MMToken::UmbrellaKeyword;
1873     ActiveModule->markUnavailable();
1874     ActiveModule->MissingHeaders.push_back(Header);
1875   }
1876 }
1877 
1878 static int compareModuleHeaders(const Module::Header *A,
1879                                 const Module::Header *B) {
1880   return A->NameAsWritten.compare(B->NameAsWritten);
1881 }
1882 
1883 /// \brief Parse an umbrella directory declaration.
1884 ///
1885 ///   umbrella-dir-declaration:
1886 ///     umbrella string-literal
1887 void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) {
1888   // Parse the directory name.
1889   if (!Tok.is(MMToken::StringLiteral)) {
1890     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1891       << "umbrella";
1892     HadError = true;
1893     return;
1894   }
1895 
1896   std::string DirName = Tok.getString();
1897   SourceLocation DirNameLoc = consumeToken();
1898 
1899   // Check whether we already have an umbrella.
1900   if (ActiveModule->Umbrella) {
1901     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash)
1902       << ActiveModule->getFullModuleName();
1903     HadError = true;
1904     return;
1905   }
1906 
1907   // Look for this file.
1908   const DirectoryEntry *Dir = nullptr;
1909   if (llvm::sys::path::is_absolute(DirName))
1910     Dir = SourceMgr.getFileManager().getDirectory(DirName);
1911   else {
1912     SmallString<128> PathName;
1913     PathName = Directory->getName();
1914     llvm::sys::path::append(PathName, DirName);
1915     Dir = SourceMgr.getFileManager().getDirectory(PathName);
1916   }
1917 
1918   if (!Dir) {
1919     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found)
1920       << DirName;
1921     HadError = true;
1922     return;
1923   }
1924 
1925   if (UsesRequiresExcludedHack.count(ActiveModule)) {
1926     // Mark this header 'textual' (see doc comment for
1927     // ModuleMapParser::UsesRequiresExcludedHack). Although iterating over the
1928     // directory is relatively expensive, in practice this only applies to the
1929     // uncommonly used Tcl module on Darwin platforms.
1930     std::error_code EC;
1931     SmallVector<Module::Header, 6> Headers;
1932     for (llvm::sys::fs::recursive_directory_iterator I(Dir->getName(), EC), E;
1933          I != E && !EC; I.increment(EC)) {
1934       if (const FileEntry *FE = SourceMgr.getFileManager().getFile(I->path())) {
1935 
1936         Module::Header Header = {I->path(), FE};
1937         Headers.push_back(std::move(Header));
1938       }
1939     }
1940 
1941     // Sort header paths so that the pcm doesn't depend on iteration order.
1942     llvm::array_pod_sort(Headers.begin(), Headers.end(), compareModuleHeaders);
1943 
1944     for (auto &Header : Headers)
1945       Map.addHeader(ActiveModule, std::move(Header), ModuleMap::TextualHeader);
1946     return;
1947   }
1948 
1949   if (Module *OwningModule = Map.UmbrellaDirs[Dir]) {
1950     Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
1951       << OwningModule->getFullModuleName();
1952     HadError = true;
1953     return;
1954   }
1955 
1956   // Record this umbrella directory.
1957   Map.setUmbrellaDir(ActiveModule, Dir, DirName);
1958 }
1959 
1960 /// \brief Parse a module export declaration.
1961 ///
1962 ///   export-declaration:
1963 ///     'export' wildcard-module-id
1964 ///
1965 ///   wildcard-module-id:
1966 ///     identifier
1967 ///     '*'
1968 ///     identifier '.' wildcard-module-id
1969 void ModuleMapParser::parseExportDecl() {
1970   assert(Tok.is(MMToken::ExportKeyword));
1971   SourceLocation ExportLoc = consumeToken();
1972 
1973   // Parse the module-id with an optional wildcard at the end.
1974   ModuleId ParsedModuleId;
1975   bool Wildcard = false;
1976   do {
1977     // FIXME: Support string-literal module names here.
1978     if (Tok.is(MMToken::Identifier)) {
1979       ParsedModuleId.push_back(std::make_pair(Tok.getString(),
1980                                               Tok.getLocation()));
1981       consumeToken();
1982 
1983       if (Tok.is(MMToken::Period)) {
1984         consumeToken();
1985         continue;
1986       }
1987 
1988       break;
1989     }
1990 
1991     if(Tok.is(MMToken::Star)) {
1992       Wildcard = true;
1993       consumeToken();
1994       break;
1995     }
1996 
1997     Diags.Report(Tok.getLocation(), diag::err_mmap_module_id);
1998     HadError = true;
1999     return;
2000   } while (true);
2001 
2002   Module::UnresolvedExportDecl Unresolved = {
2003     ExportLoc, ParsedModuleId, Wildcard
2004   };
2005   ActiveModule->UnresolvedExports.push_back(Unresolved);
2006 }
2007 
2008 /// \brief Parse a module use declaration.
2009 ///
2010 ///   use-declaration:
2011 ///     'use' wildcard-module-id
2012 void ModuleMapParser::parseUseDecl() {
2013   assert(Tok.is(MMToken::UseKeyword));
2014   auto KWLoc = consumeToken();
2015   // Parse the module-id.
2016   ModuleId ParsedModuleId;
2017   parseModuleId(ParsedModuleId);
2018 
2019   if (ActiveModule->Parent)
2020     Diags.Report(KWLoc, diag::err_mmap_use_decl_submodule);
2021   else
2022     ActiveModule->UnresolvedDirectUses.push_back(ParsedModuleId);
2023 }
2024 
2025 /// \brief Parse a link declaration.
2026 ///
2027 ///   module-declaration:
2028 ///     'link' 'framework'[opt] string-literal
2029 void ModuleMapParser::parseLinkDecl() {
2030   assert(Tok.is(MMToken::LinkKeyword));
2031   SourceLocation LinkLoc = consumeToken();
2032 
2033   // Parse the optional 'framework' keyword.
2034   bool IsFramework = false;
2035   if (Tok.is(MMToken::FrameworkKeyword)) {
2036     consumeToken();
2037     IsFramework = true;
2038   }
2039 
2040   // Parse the library name
2041   if (!Tok.is(MMToken::StringLiteral)) {
2042     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_library_name)
2043       << IsFramework << SourceRange(LinkLoc);
2044     HadError = true;
2045     return;
2046   }
2047 
2048   std::string LibraryName = Tok.getString();
2049   consumeToken();
2050   ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName,
2051                                                             IsFramework));
2052 }
2053 
2054 /// \brief Parse a configuration macro declaration.
2055 ///
2056 ///   module-declaration:
2057 ///     'config_macros' attributes[opt] config-macro-list?
2058 ///
2059 ///   config-macro-list:
2060 ///     identifier (',' identifier)?
2061 void ModuleMapParser::parseConfigMacros() {
2062   assert(Tok.is(MMToken::ConfigMacros));
2063   SourceLocation ConfigMacrosLoc = consumeToken();
2064 
2065   // Only top-level modules can have configuration macros.
2066   if (ActiveModule->Parent) {
2067     Diags.Report(ConfigMacrosLoc, diag::err_mmap_config_macro_submodule);
2068   }
2069 
2070   // Parse the optional attributes.
2071   Attributes Attrs;
2072   if (parseOptionalAttributes(Attrs))
2073     return;
2074 
2075   if (Attrs.IsExhaustive && !ActiveModule->Parent) {
2076     ActiveModule->ConfigMacrosExhaustive = true;
2077   }
2078 
2079   // If we don't have an identifier, we're done.
2080   // FIXME: Support macros with the same name as a keyword here.
2081   if (!Tok.is(MMToken::Identifier))
2082     return;
2083 
2084   // Consume the first identifier.
2085   if (!ActiveModule->Parent) {
2086     ActiveModule->ConfigMacros.push_back(Tok.getString().str());
2087   }
2088   consumeToken();
2089 
2090   do {
2091     // If there's a comma, consume it.
2092     if (!Tok.is(MMToken::Comma))
2093       break;
2094     consumeToken();
2095 
2096     // We expect to see a macro name here.
2097     // FIXME: Support macros with the same name as a keyword here.
2098     if (!Tok.is(MMToken::Identifier)) {
2099       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_config_macro);
2100       break;
2101     }
2102 
2103     // Consume the macro name.
2104     if (!ActiveModule->Parent) {
2105       ActiveModule->ConfigMacros.push_back(Tok.getString().str());
2106     }
2107     consumeToken();
2108   } while (true);
2109 }
2110 
2111 /// \brief Format a module-id into a string.
2112 static std::string formatModuleId(const ModuleId &Id) {
2113   std::string result;
2114   {
2115     llvm::raw_string_ostream OS(result);
2116 
2117     for (unsigned I = 0, N = Id.size(); I != N; ++I) {
2118       if (I)
2119         OS << ".";
2120       OS << Id[I].first;
2121     }
2122   }
2123 
2124   return result;
2125 }
2126 
2127 /// \brief Parse a conflict declaration.
2128 ///
2129 ///   module-declaration:
2130 ///     'conflict' module-id ',' string-literal
2131 void ModuleMapParser::parseConflict() {
2132   assert(Tok.is(MMToken::Conflict));
2133   SourceLocation ConflictLoc = consumeToken();
2134   Module::UnresolvedConflict Conflict;
2135 
2136   // Parse the module-id.
2137   if (parseModuleId(Conflict.Id))
2138     return;
2139 
2140   // Parse the ','.
2141   if (!Tok.is(MMToken::Comma)) {
2142     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_comma)
2143       << SourceRange(ConflictLoc);
2144     return;
2145   }
2146   consumeToken();
2147 
2148   // Parse the message.
2149   if (!Tok.is(MMToken::StringLiteral)) {
2150     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_message)
2151       << formatModuleId(Conflict.Id);
2152     return;
2153   }
2154   Conflict.Message = Tok.getString().str();
2155   consumeToken();
2156 
2157   // Add this unresolved conflict.
2158   ActiveModule->UnresolvedConflicts.push_back(Conflict);
2159 }
2160 
2161 /// \brief Parse an inferred module declaration (wildcard modules).
2162 ///
2163 ///   module-declaration:
2164 ///     'explicit'[opt] 'framework'[opt] 'module' * attributes[opt]
2165 ///       { inferred-module-member* }
2166 ///
2167 ///   inferred-module-member:
2168 ///     'export' '*'
2169 ///     'exclude' identifier
2170 void ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) {
2171   assert(Tok.is(MMToken::Star));
2172   SourceLocation StarLoc = consumeToken();
2173   bool Failed = false;
2174 
2175   // Inferred modules must be submodules.
2176   if (!ActiveModule && !Framework) {
2177     Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule);
2178     Failed = true;
2179   }
2180 
2181   if (ActiveModule) {
2182     // Inferred modules must have umbrella directories.
2183     if (!Failed && ActiveModule->IsAvailable &&
2184         !ActiveModule->getUmbrellaDir()) {
2185       Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
2186       Failed = true;
2187     }
2188 
2189     // Check for redefinition of an inferred module.
2190     if (!Failed && ActiveModule->InferSubmodules) {
2191       Diags.Report(StarLoc, diag::err_mmap_inferred_redef);
2192       if (ActiveModule->InferredSubmoduleLoc.isValid())
2193         Diags.Report(ActiveModule->InferredSubmoduleLoc,
2194                      diag::note_mmap_prev_definition);
2195       Failed = true;
2196     }
2197 
2198     // Check for the 'framework' keyword, which is not permitted here.
2199     if (Framework) {
2200       Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule);
2201       Framework = false;
2202     }
2203   } else if (Explicit) {
2204     Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework);
2205     Explicit = false;
2206   }
2207 
2208   // If there were any problems with this inferred submodule, skip its body.
2209   if (Failed) {
2210     if (Tok.is(MMToken::LBrace)) {
2211       consumeToken();
2212       skipUntil(MMToken::RBrace);
2213       if (Tok.is(MMToken::RBrace))
2214         consumeToken();
2215     }
2216     HadError = true;
2217     return;
2218   }
2219 
2220   // Parse optional attributes.
2221   Attributes Attrs;
2222   if (parseOptionalAttributes(Attrs))
2223     return;
2224 
2225   if (ActiveModule) {
2226     // Note that we have an inferred submodule.
2227     ActiveModule->InferSubmodules = true;
2228     ActiveModule->InferredSubmoduleLoc = StarLoc;
2229     ActiveModule->InferExplicitSubmodules = Explicit;
2230   } else {
2231     // We'll be inferring framework modules for this directory.
2232     Map.InferredDirectories[Directory].InferModules = true;
2233     Map.InferredDirectories[Directory].Attrs = Attrs;
2234     Map.InferredDirectories[Directory].ModuleMapFile = ModuleMapFile;
2235     // FIXME: Handle the 'framework' keyword.
2236   }
2237 
2238   // Parse the opening brace.
2239   if (!Tok.is(MMToken::LBrace)) {
2240     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard);
2241     HadError = true;
2242     return;
2243   }
2244   SourceLocation LBraceLoc = consumeToken();
2245 
2246   // Parse the body of the inferred submodule.
2247   bool Done = false;
2248   do {
2249     switch (Tok.Kind) {
2250     case MMToken::EndOfFile:
2251     case MMToken::RBrace:
2252       Done = true;
2253       break;
2254 
2255     case MMToken::ExcludeKeyword: {
2256       if (ActiveModule) {
2257         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2258           << (ActiveModule != nullptr);
2259         consumeToken();
2260         break;
2261       }
2262 
2263       consumeToken();
2264       // FIXME: Support string-literal module names here.
2265       if (!Tok.is(MMToken::Identifier)) {
2266         Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name);
2267         break;
2268       }
2269 
2270       Map.InferredDirectories[Directory].ExcludedModules
2271         .push_back(Tok.getString());
2272       consumeToken();
2273       break;
2274     }
2275 
2276     case MMToken::ExportKeyword:
2277       if (!ActiveModule) {
2278         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2279           << (ActiveModule != nullptr);
2280         consumeToken();
2281         break;
2282       }
2283 
2284       consumeToken();
2285       if (Tok.is(MMToken::Star))
2286         ActiveModule->InferExportWildcard = true;
2287       else
2288         Diags.Report(Tok.getLocation(),
2289                      diag::err_mmap_expected_export_wildcard);
2290       consumeToken();
2291       break;
2292 
2293     case MMToken::ExplicitKeyword:
2294     case MMToken::ModuleKeyword:
2295     case MMToken::HeaderKeyword:
2296     case MMToken::PrivateKeyword:
2297     case MMToken::UmbrellaKeyword:
2298     default:
2299       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2300           << (ActiveModule != nullptr);
2301       consumeToken();
2302       break;
2303     }
2304   } while (!Done);
2305 
2306   if (Tok.is(MMToken::RBrace))
2307     consumeToken();
2308   else {
2309     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
2310     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
2311     HadError = true;
2312   }
2313 }
2314 
2315 /// \brief Parse optional attributes.
2316 ///
2317 ///   attributes:
2318 ///     attribute attributes
2319 ///     attribute
2320 ///
2321 ///   attribute:
2322 ///     [ identifier ]
2323 ///
2324 /// \param Attrs Will be filled in with the parsed attributes.
2325 ///
2326 /// \returns true if an error occurred, false otherwise.
2327 bool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) {
2328   bool HadError = false;
2329 
2330   while (Tok.is(MMToken::LSquare)) {
2331     // Consume the '['.
2332     SourceLocation LSquareLoc = consumeToken();
2333 
2334     // Check whether we have an attribute name here.
2335     if (!Tok.is(MMToken::Identifier)) {
2336       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute);
2337       skipUntil(MMToken::RSquare);
2338       if (Tok.is(MMToken::RSquare))
2339         consumeToken();
2340       HadError = true;
2341     }
2342 
2343     // Decode the attribute name.
2344     AttributeKind Attribute
2345       = llvm::StringSwitch<AttributeKind>(Tok.getString())
2346           .Case("exhaustive", AT_exhaustive)
2347           .Case("extern_c", AT_extern_c)
2348           .Case("system", AT_system)
2349           .Default(AT_unknown);
2350     switch (Attribute) {
2351     case AT_unknown:
2352       Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute)
2353         << Tok.getString();
2354       break;
2355 
2356     case AT_system:
2357       Attrs.IsSystem = true;
2358       break;
2359 
2360     case AT_extern_c:
2361       Attrs.IsExternC = true;
2362       break;
2363 
2364     case AT_exhaustive:
2365       Attrs.IsExhaustive = true;
2366       break;
2367     }
2368     consumeToken();
2369 
2370     // Consume the ']'.
2371     if (!Tok.is(MMToken::RSquare)) {
2372       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare);
2373       Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match);
2374       skipUntil(MMToken::RSquare);
2375       HadError = true;
2376     }
2377 
2378     if (Tok.is(MMToken::RSquare))
2379       consumeToken();
2380   }
2381 
2382   return HadError;
2383 }
2384 
2385 /// \brief Parse a module map file.
2386 ///
2387 ///   module-map-file:
2388 ///     module-declaration*
2389 bool ModuleMapParser::parseModuleMapFile() {
2390   do {
2391     switch (Tok.Kind) {
2392     case MMToken::EndOfFile:
2393       return HadError;
2394 
2395     case MMToken::ExplicitKeyword:
2396     case MMToken::ExternKeyword:
2397     case MMToken::ModuleKeyword:
2398     case MMToken::FrameworkKeyword:
2399       parseModuleDecl();
2400       break;
2401 
2402     case MMToken::Comma:
2403     case MMToken::ConfigMacros:
2404     case MMToken::Conflict:
2405     case MMToken::Exclaim:
2406     case MMToken::ExcludeKeyword:
2407     case MMToken::ExportKeyword:
2408     case MMToken::HeaderKeyword:
2409     case MMToken::Identifier:
2410     case MMToken::LBrace:
2411     case MMToken::LinkKeyword:
2412     case MMToken::LSquare:
2413     case MMToken::Period:
2414     case MMToken::PrivateKeyword:
2415     case MMToken::RBrace:
2416     case MMToken::RSquare:
2417     case MMToken::RequiresKeyword:
2418     case MMToken::Star:
2419     case MMToken::StringLiteral:
2420     case MMToken::TextualKeyword:
2421     case MMToken::UmbrellaKeyword:
2422     case MMToken::UseKeyword:
2423       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
2424       HadError = true;
2425       consumeToken();
2426       break;
2427     }
2428   } while (true);
2429 }
2430 
2431 bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem,
2432                                    const DirectoryEntry *Dir,
2433                                    SourceLocation ExternModuleLoc) {
2434   llvm::DenseMap<const FileEntry *, bool>::iterator Known
2435     = ParsedModuleMap.find(File);
2436   if (Known != ParsedModuleMap.end())
2437     return Known->second;
2438 
2439   assert(Target && "Missing target information");
2440   auto FileCharacter = IsSystem ? SrcMgr::C_System : SrcMgr::C_User;
2441   FileID ID = SourceMgr.createFileID(File, ExternModuleLoc, FileCharacter);
2442   const llvm::MemoryBuffer *Buffer = SourceMgr.getBuffer(ID);
2443   if (!Buffer)
2444     return ParsedModuleMap[File] = true;
2445 
2446   // Parse this module map file.
2447   Lexer L(ID, SourceMgr.getBuffer(ID), SourceMgr, MMapLangOpts);
2448   SourceLocation Start = L.getSourceLocation();
2449   ModuleMapParser Parser(L, SourceMgr, Target, Diags, *this, File, Dir,
2450                          BuiltinIncludeDir, IsSystem);
2451   bool Result = Parser.parseModuleMapFile();
2452   ParsedModuleMap[File] = Result;
2453 
2454   // Notify callbacks that we parsed it.
2455   for (const auto &Cb : Callbacks)
2456     Cb->moduleMapFileRead(Start, *File, IsSystem);
2457   return Result;
2458 }
2459