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       CompilingModule(nullptr), 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 &&
235          // FIXME: Should we map RequestingModule to its top-level module here
236          //        too? This check is redundant with the isSubModuleOf check in
237          //        diagnoseHeaderInclusion.
238          RequestedModule->getTopLevelModule() != RequestingModule;
239 }
240 
241 static Module *getTopLevelOrNull(Module *M) {
242   return M ? M->getTopLevelModule() : nullptr;
243 }
244 
245 void ModuleMap::diagnoseHeaderInclusion(Module *RequestingModule,
246                                         SourceLocation FilenameLoc,
247                                         StringRef Filename,
248                                         const FileEntry *File) {
249   // No errors for indirect modules. This may be a bit of a problem for modules
250   // with no source files.
251   if (getTopLevelOrNull(RequestingModule) != getTopLevelOrNull(SourceModule))
252     return;
253 
254   if (RequestingModule)
255     resolveUses(RequestingModule, /*Complain=*/false);
256 
257   bool Excluded = false;
258   Module *Private = nullptr;
259   Module *NotUsed = nullptr;
260 
261   HeadersMap::iterator Known = findKnownHeader(File);
262   if (Known != Headers.end()) {
263     for (const KnownHeader &Header : Known->second) {
264       // If 'File' is part of 'RequestingModule' we can definitely include it.
265       if (Header.getModule() &&
266           Header.getModule()->isSubModuleOf(RequestingModule))
267         return;
268 
269       // Remember private headers for later printing of a diagnostic.
270       if (violatesPrivateInclude(RequestingModule, File, Header.getRole(),
271                                  Header.getModule())) {
272         Private = Header.getModule();
273         continue;
274       }
275 
276       // If uses need to be specified explicitly, we are only allowed to return
277       // modules that are explicitly used by the requesting module.
278       if (RequestingModule && LangOpts.ModulesDeclUse &&
279           !RequestingModule->directlyUses(Header.getModule())) {
280         NotUsed = Header.getModule();
281         continue;
282       }
283 
284       // We have found a module that we can happily use.
285       return;
286     }
287 
288     Excluded = true;
289   }
290 
291   // We have found a header, but it is private.
292   if (Private) {
293     Diags.Report(FilenameLoc, diag::warn_use_of_private_header_outside_module)
294         << Filename;
295     return;
296   }
297 
298   // We have found a module, but we don't use it.
299   if (NotUsed) {
300     Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module)
301         << RequestingModule->getFullModuleName() << Filename;
302     return;
303   }
304 
305   if (Excluded || isHeaderInUmbrellaDirs(File))
306     return;
307 
308   // At this point, only non-modular includes remain.
309 
310   if (LangOpts.ModulesStrictDeclUse) {
311     Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module)
312         << RequestingModule->getFullModuleName() << Filename;
313   } else if (RequestingModule) {
314     diag::kind DiagID = RequestingModule->getTopLevelModule()->IsFramework ?
315         diag::warn_non_modular_include_in_framework_module :
316         diag::warn_non_modular_include_in_module;
317     Diags.Report(FilenameLoc, DiagID) << RequestingModule->getFullModuleName();
318   }
319 }
320 
321 static bool isBetterKnownHeader(const ModuleMap::KnownHeader &New,
322                                 const ModuleMap::KnownHeader &Old) {
323   // Prefer available modules.
324   if (New.getModule()->isAvailable() && !Old.getModule()->isAvailable())
325     return true;
326 
327   // Prefer a public header over a private header.
328   if ((New.getRole() & ModuleMap::PrivateHeader) !=
329       (Old.getRole() & ModuleMap::PrivateHeader))
330     return !(New.getRole() & ModuleMap::PrivateHeader);
331 
332   // Prefer a non-textual header over a textual header.
333   if ((New.getRole() & ModuleMap::TextualHeader) !=
334       (Old.getRole() & ModuleMap::TextualHeader))
335     return !(New.getRole() & ModuleMap::TextualHeader);
336 
337   // Don't have a reason to choose between these. Just keep the first one.
338   return false;
339 }
340 
341 ModuleMap::KnownHeader ModuleMap::findModuleForHeader(const FileEntry *File) {
342   auto MakeResult = [&](ModuleMap::KnownHeader R) -> ModuleMap::KnownHeader {
343     if (R.getRole() & ModuleMap::TextualHeader)
344       return ModuleMap::KnownHeader();
345     return R;
346   };
347 
348   HeadersMap::iterator Known = findKnownHeader(File);
349   if (Known != Headers.end()) {
350     ModuleMap::KnownHeader Result;
351     // Iterate over all modules that 'File' is part of to find the best fit.
352     for (KnownHeader &H : Known->second) {
353       // Prefer a header from the current module over all others.
354       if (H.getModule()->getTopLevelModule() == CompilingModule)
355         return MakeResult(H);
356       if (!Result || isBetterKnownHeader(H, Result))
357         Result = H;
358     }
359     return MakeResult(Result);
360   }
361 
362   return MakeResult(findOrCreateModuleForHeaderInUmbrellaDir(File));
363 }
364 
365 ModuleMap::KnownHeader
366 ModuleMap::findOrCreateModuleForHeaderInUmbrellaDir(const FileEntry *File) {
367   assert(!Headers.count(File) && "already have a module for this header");
368 
369   SmallVector<const DirectoryEntry *, 2> SkippedDirs;
370   KnownHeader H = findHeaderInUmbrellaDirs(File, SkippedDirs);
371   if (H) {
372     Module *Result = H.getModule();
373 
374     // Search up the module stack until we find a module with an umbrella
375     // directory.
376     Module *UmbrellaModule = Result;
377     while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
378       UmbrellaModule = UmbrellaModule->Parent;
379 
380     if (UmbrellaModule->InferSubmodules) {
381       const FileEntry *UmbrellaModuleMap =
382           getModuleMapFileForUniquing(UmbrellaModule);
383 
384       // Infer submodules for each of the directories we found between
385       // the directory of the umbrella header and the directory where
386       // the actual header is located.
387       bool Explicit = UmbrellaModule->InferExplicitSubmodules;
388 
389       for (unsigned I = SkippedDirs.size(); I != 0; --I) {
390         // Find or create the module that corresponds to this directory name.
391         SmallString<32> NameBuf;
392         StringRef Name = sanitizeFilenameAsIdentifier(
393             llvm::sys::path::stem(SkippedDirs[I-1]->getName()), NameBuf);
394         Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
395                                     Explicit).first;
396         InferredModuleAllowedBy[Result] = UmbrellaModuleMap;
397         Result->IsInferred = true;
398 
399         // Associate the module and the directory.
400         UmbrellaDirs[SkippedDirs[I-1]] = Result;
401 
402         // If inferred submodules export everything they import, add a
403         // wildcard to the set of exports.
404         if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
405           Result->Exports.push_back(Module::ExportDecl(nullptr, true));
406       }
407 
408       // Infer a submodule with the same name as this header file.
409       SmallString<32> NameBuf;
410       StringRef Name = sanitizeFilenameAsIdentifier(
411                          llvm::sys::path::stem(File->getName()), NameBuf);
412       Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
413                                   Explicit).first;
414       InferredModuleAllowedBy[Result] = UmbrellaModuleMap;
415       Result->IsInferred = true;
416       Result->addTopHeader(File);
417 
418       // If inferred submodules export everything they import, add a
419       // wildcard to the set of exports.
420       if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
421         Result->Exports.push_back(Module::ExportDecl(nullptr, true));
422     } else {
423       // Record each of the directories we stepped through as being part of
424       // the module we found, since the umbrella header covers them all.
425       for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I)
426         UmbrellaDirs[SkippedDirs[I]] = Result;
427     }
428 
429     KnownHeader Header(Result, NormalHeader);
430     Headers[File].push_back(Header);
431     return Header;
432   }
433 
434   return KnownHeader();
435 }
436 
437 ArrayRef<ModuleMap::KnownHeader>
438 ModuleMap::findAllModulesForHeader(const FileEntry *File) const {
439   auto It = Headers.find(File);
440   if (It == Headers.end())
441     return None;
442   return It->second;
443 }
444 
445 bool ModuleMap::isHeaderInUnavailableModule(const FileEntry *Header) const {
446   return isHeaderUnavailableInModule(Header, nullptr);
447 }
448 
449 bool
450 ModuleMap::isHeaderUnavailableInModule(const FileEntry *Header,
451                                        const Module *RequestingModule) const {
452   HeadersMap::const_iterator Known = Headers.find(Header);
453   if (Known != Headers.end()) {
454     for (SmallVectorImpl<KnownHeader>::const_iterator
455              I = Known->second.begin(),
456              E = Known->second.end();
457          I != E; ++I) {
458       if (I->isAvailable() && (!RequestingModule ||
459                                I->getModule()->isSubModuleOf(RequestingModule)))
460         return false;
461     }
462     return true;
463   }
464 
465   const DirectoryEntry *Dir = Header->getDir();
466   SmallVector<const DirectoryEntry *, 2> SkippedDirs;
467   StringRef DirName = Dir->getName();
468 
469   auto IsUnavailable = [&](const Module *M) {
470     return !M->isAvailable() && (!RequestingModule ||
471                                  M->isSubModuleOf(RequestingModule));
472   };
473 
474   // Keep walking up the directory hierarchy, looking for a directory with
475   // an umbrella header.
476   do {
477     llvm::DenseMap<const DirectoryEntry *, Module *>::const_iterator KnownDir
478       = UmbrellaDirs.find(Dir);
479     if (KnownDir != UmbrellaDirs.end()) {
480       Module *Found = KnownDir->second;
481       if (IsUnavailable(Found))
482         return true;
483 
484       // Search up the module stack until we find a module with an umbrella
485       // directory.
486       Module *UmbrellaModule = Found;
487       while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
488         UmbrellaModule = UmbrellaModule->Parent;
489 
490       if (UmbrellaModule->InferSubmodules) {
491         for (unsigned I = SkippedDirs.size(); I != 0; --I) {
492           // Find or create the module that corresponds to this directory name.
493           SmallString<32> NameBuf;
494           StringRef Name = sanitizeFilenameAsIdentifier(
495                              llvm::sys::path::stem(SkippedDirs[I-1]->getName()),
496                              NameBuf);
497           Found = lookupModuleQualified(Name, Found);
498           if (!Found)
499             return false;
500           if (IsUnavailable(Found))
501             return true;
502         }
503 
504         // Infer a submodule with the same name as this header file.
505         SmallString<32> NameBuf;
506         StringRef Name = sanitizeFilenameAsIdentifier(
507                            llvm::sys::path::stem(Header->getName()),
508                            NameBuf);
509         Found = lookupModuleQualified(Name, Found);
510         if (!Found)
511           return false;
512       }
513 
514       return IsUnavailable(Found);
515     }
516 
517     SkippedDirs.push_back(Dir);
518 
519     // Retrieve our parent path.
520     DirName = llvm::sys::path::parent_path(DirName);
521     if (DirName.empty())
522       break;
523 
524     // Resolve the parent path to a directory entry.
525     Dir = SourceMgr.getFileManager().getDirectory(DirName);
526   } while (Dir);
527 
528   return false;
529 }
530 
531 Module *ModuleMap::findModule(StringRef Name) const {
532   llvm::StringMap<Module *>::const_iterator Known = Modules.find(Name);
533   if (Known != Modules.end())
534     return Known->getValue();
535 
536   return nullptr;
537 }
538 
539 Module *ModuleMap::lookupModuleUnqualified(StringRef Name,
540                                            Module *Context) const {
541   for(; Context; Context = Context->Parent) {
542     if (Module *Sub = lookupModuleQualified(Name, Context))
543       return Sub;
544   }
545 
546   return findModule(Name);
547 }
548 
549 Module *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) const{
550   if (!Context)
551     return findModule(Name);
552 
553   return Context->findSubmodule(Name);
554 }
555 
556 std::pair<Module *, bool>
557 ModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework,
558                               bool IsExplicit) {
559   // Try to find an existing module with this name.
560   if (Module *Sub = lookupModuleQualified(Name, Parent))
561     return std::make_pair(Sub, false);
562 
563   // Create a new module with this name.
564   Module *Result = new Module(Name, SourceLocation(), Parent,
565                               IsFramework, IsExplicit, NumCreatedModules++);
566   if (LangOpts.CurrentModule == Name) {
567     SourceModule = Result;
568     SourceModuleName = Name;
569   }
570   if (!Parent) {
571     Modules[Name] = Result;
572     if (!LangOpts.CurrentModule.empty() && !CompilingModule &&
573         Name == LangOpts.CurrentModule) {
574       CompilingModule = Result;
575     }
576   }
577   return std::make_pair(Result, true);
578 }
579 
580 /// \brief For a framework module, infer the framework against which we
581 /// should link.
582 static void inferFrameworkLink(Module *Mod, const DirectoryEntry *FrameworkDir,
583                                FileManager &FileMgr) {
584   assert(Mod->IsFramework && "Can only infer linking for framework modules");
585   assert(!Mod->isSubFramework() &&
586          "Can only infer linking for top-level frameworks");
587 
588   SmallString<128> LibName;
589   LibName += FrameworkDir->getName();
590   llvm::sys::path::append(LibName, Mod->Name);
591   if (FileMgr.getFile(LibName)) {
592     Mod->LinkLibraries.push_back(Module::LinkLibrary(Mod->Name,
593                                                      /*IsFramework=*/true));
594   }
595 }
596 
597 Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir,
598                                         bool IsSystem, Module *Parent) {
599   Attributes Attrs;
600   Attrs.IsSystem = IsSystem;
601   return inferFrameworkModule(FrameworkDir, Attrs, Parent);
602 }
603 
604 Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir,
605                                         Attributes Attrs, Module *Parent) {
606   // Note: as an egregious but useful hack we use the real path here, because
607   // we might be looking at an embedded framework that symlinks out to a
608   // top-level framework, and we need to infer as if we were naming the
609   // top-level framework.
610   StringRef FrameworkDirName =
611       SourceMgr.getFileManager().getCanonicalName(FrameworkDir);
612 
613   // In case this is a case-insensitive filesystem, use the canonical
614   // directory name as the ModuleName, since modules are case-sensitive.
615   // FIXME: we should be able to give a fix-it hint for the correct spelling.
616   SmallString<32> ModuleNameStorage;
617   StringRef ModuleName = sanitizeFilenameAsIdentifier(
618       llvm::sys::path::stem(FrameworkDirName), ModuleNameStorage);
619 
620   // Check whether we've already found this module.
621   if (Module *Mod = lookupModuleQualified(ModuleName, Parent))
622     return Mod;
623 
624   FileManager &FileMgr = SourceMgr.getFileManager();
625 
626   // If the framework has a parent path from which we're allowed to infer
627   // a framework module, do so.
628   const FileEntry *ModuleMapFile = nullptr;
629   if (!Parent) {
630     // Determine whether we're allowed to infer a module map.
631     bool canInfer = false;
632     if (llvm::sys::path::has_parent_path(FrameworkDirName)) {
633       // Figure out the parent path.
634       StringRef Parent = llvm::sys::path::parent_path(FrameworkDirName);
635       if (const DirectoryEntry *ParentDir = FileMgr.getDirectory(Parent)) {
636         // Check whether we have already looked into the parent directory
637         // for a module map.
638         llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator
639           inferred = InferredDirectories.find(ParentDir);
640         if (inferred == InferredDirectories.end()) {
641           // We haven't looked here before. Load a module map, if there is
642           // one.
643           bool IsFrameworkDir = Parent.endswith(".framework");
644           if (const FileEntry *ModMapFile =
645                 HeaderInfo.lookupModuleMapFile(ParentDir, IsFrameworkDir)) {
646             parseModuleMapFile(ModMapFile, Attrs.IsSystem, ParentDir);
647             inferred = InferredDirectories.find(ParentDir);
648           }
649 
650           if (inferred == InferredDirectories.end())
651             inferred = InferredDirectories.insert(
652                          std::make_pair(ParentDir, InferredDirectory())).first;
653         }
654 
655         if (inferred->second.InferModules) {
656           // We're allowed to infer for this directory, but make sure it's okay
657           // to infer this particular module.
658           StringRef Name = llvm::sys::path::stem(FrameworkDirName);
659           canInfer = std::find(inferred->second.ExcludedModules.begin(),
660                                inferred->second.ExcludedModules.end(),
661                                Name) == inferred->second.ExcludedModules.end();
662 
663           Attrs.IsSystem |= inferred->second.Attrs.IsSystem;
664           Attrs.IsExternC |= inferred->second.Attrs.IsExternC;
665           Attrs.IsExhaustive |= inferred->second.Attrs.IsExhaustive;
666           ModuleMapFile = inferred->second.ModuleMapFile;
667         }
668       }
669     }
670 
671     // If we're not allowed to infer a framework module, don't.
672     if (!canInfer)
673       return nullptr;
674   } else
675     ModuleMapFile = getModuleMapFileForUniquing(Parent);
676 
677 
678   // Look for an umbrella header.
679   SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName());
680   llvm::sys::path::append(UmbrellaName, "Headers", ModuleName + ".h");
681   const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName);
682 
683   // FIXME: If there's no umbrella header, we could probably scan the
684   // framework to load *everything*. But, it's not clear that this is a good
685   // idea.
686   if (!UmbrellaHeader)
687     return nullptr;
688 
689   Module *Result = new Module(ModuleName, SourceLocation(), Parent,
690                               /*IsFramework=*/true, /*IsExplicit=*/false,
691                               NumCreatedModules++);
692   InferredModuleAllowedBy[Result] = ModuleMapFile;
693   Result->IsInferred = true;
694   if (LangOpts.CurrentModule == ModuleName) {
695     SourceModule = Result;
696     SourceModuleName = ModuleName;
697   }
698 
699   Result->IsSystem |= Attrs.IsSystem;
700   Result->IsExternC |= Attrs.IsExternC;
701   Result->ConfigMacrosExhaustive |= Attrs.IsExhaustive;
702   Result->Directory = FrameworkDir;
703 
704   if (!Parent)
705     Modules[ModuleName] = Result;
706 
707   // umbrella header "umbrella-header-name"
708   //
709   // The "Headers/" component of the name is implied because this is
710   // a framework module.
711   setUmbrellaHeader(Result, UmbrellaHeader, ModuleName + ".h");
712 
713   // export *
714   Result->Exports.push_back(Module::ExportDecl(nullptr, true));
715 
716   // module * { export * }
717   Result->InferSubmodules = true;
718   Result->InferExportWildcard = true;
719 
720   // Look for subframeworks.
721   std::error_code EC;
722   SmallString<128> SubframeworksDirName
723     = StringRef(FrameworkDir->getName());
724   llvm::sys::path::append(SubframeworksDirName, "Frameworks");
725   llvm::sys::path::native(SubframeworksDirName);
726   for (llvm::sys::fs::directory_iterator Dir(SubframeworksDirName, EC), DirEnd;
727        Dir != DirEnd && !EC; Dir.increment(EC)) {
728     if (!StringRef(Dir->path()).endswith(".framework"))
729       continue;
730 
731     if (const DirectoryEntry *SubframeworkDir
732           = FileMgr.getDirectory(Dir->path())) {
733       // Note: as an egregious but useful hack, we use the real path here and
734       // check whether it is actually a subdirectory of the parent directory.
735       // This will not be the case if the 'subframework' is actually a symlink
736       // out to a top-level framework.
737       StringRef SubframeworkDirName = FileMgr.getCanonicalName(SubframeworkDir);
738       bool FoundParent = false;
739       do {
740         // Get the parent directory name.
741         SubframeworkDirName
742           = llvm::sys::path::parent_path(SubframeworkDirName);
743         if (SubframeworkDirName.empty())
744           break;
745 
746         if (FileMgr.getDirectory(SubframeworkDirName) == FrameworkDir) {
747           FoundParent = true;
748           break;
749         }
750       } while (true);
751 
752       if (!FoundParent)
753         continue;
754 
755       // FIXME: Do we want to warn about subframeworks without umbrella headers?
756       inferFrameworkModule(SubframeworkDir, Attrs, Result);
757     }
758   }
759 
760   // If the module is a top-level framework, automatically link against the
761   // framework.
762   if (!Result->isSubFramework()) {
763     inferFrameworkLink(Result, FrameworkDir, FileMgr);
764   }
765 
766   return Result;
767 }
768 
769 void ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader,
770                                   Twine NameAsWritten) {
771   Headers[UmbrellaHeader].push_back(KnownHeader(Mod, NormalHeader));
772   Mod->Umbrella = UmbrellaHeader;
773   Mod->UmbrellaAsWritten = NameAsWritten.str();
774   UmbrellaDirs[UmbrellaHeader->getDir()] = Mod;
775 }
776 
777 void ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir,
778                                Twine NameAsWritten) {
779   Mod->Umbrella = UmbrellaDir;
780   Mod->UmbrellaAsWritten = NameAsWritten.str();
781   UmbrellaDirs[UmbrellaDir] = Mod;
782 }
783 
784 static Module::HeaderKind headerRoleToKind(ModuleMap::ModuleHeaderRole Role) {
785   switch ((int)Role) {
786   default: llvm_unreachable("unknown header role");
787   case ModuleMap::NormalHeader:
788     return Module::HK_Normal;
789   case ModuleMap::PrivateHeader:
790     return Module::HK_Private;
791   case ModuleMap::TextualHeader:
792     return Module::HK_Textual;
793   case ModuleMap::PrivateHeader | ModuleMap::TextualHeader:
794     return Module::HK_PrivateTextual;
795   }
796 }
797 
798 void ModuleMap::addHeader(Module *Mod, Module::Header Header,
799                           ModuleHeaderRole Role) {
800   KnownHeader KH(Mod, Role);
801 
802   // Only add each header to the headers list once.
803   // FIXME: Should we diagnose if a header is listed twice in the
804   // same module definition?
805   auto &HeaderList = Headers[Header.Entry];
806   for (auto H : HeaderList)
807     if (H == KH)
808       return;
809 
810   HeaderList.push_back(KH);
811   Mod->Headers[headerRoleToKind(Role)].push_back(std::move(Header));
812 
813   bool isCompilingModuleHeader = Mod->getTopLevelModule() == CompilingModule;
814   HeaderInfo.MarkFileModuleHeader(Header.Entry, Role, isCompilingModuleHeader);
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 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