xref: /freebsd/contrib/llvm-project/clang/lib/Lex/ModuleMap.cpp (revision dd41de95a84d979615a2ef11df6850622bf6184e)
1 //===- ModuleMap.cpp - Describe the layout of modules ---------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines the ModuleMap implementation, which describes the layout
10 // of a module as it relates to headers.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "clang/Lex/ModuleMap.h"
15 #include "clang/Basic/CharInfo.h"
16 #include "clang/Basic/Diagnostic.h"
17 #include "clang/Basic/FileManager.h"
18 #include "clang/Basic/LLVM.h"
19 #include "clang/Basic/LangOptions.h"
20 #include "clang/Basic/Module.h"
21 #include "clang/Basic/SourceLocation.h"
22 #include "clang/Basic/SourceManager.h"
23 #include "clang/Basic/TargetInfo.h"
24 #include "clang/Lex/HeaderSearch.h"
25 #include "clang/Lex/HeaderSearchOptions.h"
26 #include "clang/Lex/LexDiagnostic.h"
27 #include "clang/Lex/Lexer.h"
28 #include "clang/Lex/LiteralSupport.h"
29 #include "clang/Lex/Token.h"
30 #include "llvm/ADT/DenseMap.h"
31 #include "llvm/ADT/None.h"
32 #include "llvm/ADT/STLExtras.h"
33 #include "llvm/ADT/SmallPtrSet.h"
34 #include "llvm/ADT/SmallString.h"
35 #include "llvm/ADT/SmallVector.h"
36 #include "llvm/ADT/StringMap.h"
37 #include "llvm/ADT/StringRef.h"
38 #include "llvm/ADT/StringSwitch.h"
39 #include "llvm/Support/Allocator.h"
40 #include "llvm/Support/Compiler.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include "llvm/Support/MemoryBuffer.h"
43 #include "llvm/Support/Path.h"
44 #include "llvm/Support/VirtualFileSystem.h"
45 #include "llvm/Support/raw_ostream.h"
46 #include <algorithm>
47 #include <cassert>
48 #include <cstdint>
49 #include <cstring>
50 #include <string>
51 #include <system_error>
52 #include <utility>
53 
54 using namespace clang;
55 
56 void ModuleMapCallbacks::anchor() {}
57 
58 void ModuleMap::resolveLinkAsDependencies(Module *Mod) {
59   auto PendingLinkAs = PendingLinkAsModule.find(Mod->Name);
60   if (PendingLinkAs != PendingLinkAsModule.end()) {
61     for (auto &Name : PendingLinkAs->second) {
62       auto *M = findModule(Name.getKey());
63       if (M)
64         M->UseExportAsModuleLinkName = true;
65     }
66   }
67 }
68 
69 void ModuleMap::addLinkAsDependency(Module *Mod) {
70   if (findModule(Mod->ExportAsModule))
71     Mod->UseExportAsModuleLinkName = true;
72   else
73     PendingLinkAsModule[Mod->ExportAsModule].insert(Mod->Name);
74 }
75 
76 Module::HeaderKind ModuleMap::headerRoleToKind(ModuleHeaderRole Role) {
77   switch ((int)Role) {
78   default: llvm_unreachable("unknown header role");
79   case NormalHeader:
80     return Module::HK_Normal;
81   case PrivateHeader:
82     return Module::HK_Private;
83   case TextualHeader:
84     return Module::HK_Textual;
85   case PrivateHeader | TextualHeader:
86     return Module::HK_PrivateTextual;
87   }
88 }
89 
90 ModuleMap::ModuleHeaderRole
91 ModuleMap::headerKindToRole(Module::HeaderKind Kind) {
92   switch ((int)Kind) {
93   case Module::HK_Normal:
94     return NormalHeader;
95   case Module::HK_Private:
96     return PrivateHeader;
97   case Module::HK_Textual:
98     return TextualHeader;
99   case Module::HK_PrivateTextual:
100     return ModuleHeaderRole(PrivateHeader | TextualHeader);
101   case Module::HK_Excluded:
102     llvm_unreachable("unexpected header kind");
103   }
104   llvm_unreachable("unknown header kind");
105 }
106 
107 Module::ExportDecl
108 ModuleMap::resolveExport(Module *Mod,
109                          const Module::UnresolvedExportDecl &Unresolved,
110                          bool Complain) const {
111   // We may have just a wildcard.
112   if (Unresolved.Id.empty()) {
113     assert(Unresolved.Wildcard && "Invalid unresolved export");
114     return Module::ExportDecl(nullptr, true);
115   }
116 
117   // Resolve the module-id.
118   Module *Context = resolveModuleId(Unresolved.Id, Mod, Complain);
119   if (!Context)
120     return {};
121 
122   return Module::ExportDecl(Context, Unresolved.Wildcard);
123 }
124 
125 Module *ModuleMap::resolveModuleId(const ModuleId &Id, Module *Mod,
126                                    bool Complain) const {
127   // Find the starting module.
128   Module *Context = lookupModuleUnqualified(Id[0].first, Mod);
129   if (!Context) {
130     if (Complain)
131       Diags.Report(Id[0].second, diag::err_mmap_missing_module_unqualified)
132       << Id[0].first << Mod->getFullModuleName();
133 
134     return nullptr;
135   }
136 
137   // Dig into the module path.
138   for (unsigned I = 1, N = Id.size(); I != N; ++I) {
139     Module *Sub = lookupModuleQualified(Id[I].first, Context);
140     if (!Sub) {
141       if (Complain)
142         Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified)
143         << Id[I].first << Context->getFullModuleName()
144         << SourceRange(Id[0].second, Id[I-1].second);
145 
146       return nullptr;
147     }
148 
149     Context = Sub;
150   }
151 
152   return Context;
153 }
154 
155 /// Append to \p Paths the set of paths needed to get to the
156 /// subframework in which the given module lives.
157 static void appendSubframeworkPaths(Module *Mod,
158                                     SmallVectorImpl<char> &Path) {
159   // Collect the framework names from the given module to the top-level module.
160   SmallVector<StringRef, 2> Paths;
161   for (; Mod; Mod = Mod->Parent) {
162     if (Mod->IsFramework)
163       Paths.push_back(Mod->Name);
164   }
165 
166   if (Paths.empty())
167     return;
168 
169   // Add Frameworks/Name.framework for each subframework.
170   for (unsigned I = Paths.size() - 1; I != 0; --I)
171     llvm::sys::path::append(Path, "Frameworks", Paths[I-1] + ".framework");
172 }
173 
174 const FileEntry *ModuleMap::findHeader(
175     Module *M, const Module::UnresolvedHeaderDirective &Header,
176     SmallVectorImpl<char> &RelativePathName, bool &NeedsFramework) {
177   // Search for the header file within the module's home directory.
178   auto *Directory = M->Directory;
179   SmallString<128> FullPathName(Directory->getName());
180 
181   auto GetFile = [&](StringRef Filename) -> const FileEntry * {
182     auto File = SourceMgr.getFileManager().getFile(Filename);
183     if (!File ||
184         (Header.Size && (*File)->getSize() != *Header.Size) ||
185         (Header.ModTime && (*File)->getModificationTime() != *Header.ModTime))
186       return nullptr;
187     return *File;
188   };
189 
190   auto GetFrameworkFile = [&]() -> const FileEntry * {
191     unsigned FullPathLength = FullPathName.size();
192     appendSubframeworkPaths(M, RelativePathName);
193     unsigned RelativePathLength = RelativePathName.size();
194 
195     // Check whether this file is in the public headers.
196     llvm::sys::path::append(RelativePathName, "Headers", Header.FileName);
197     llvm::sys::path::append(FullPathName, RelativePathName);
198     if (auto *File = GetFile(FullPathName))
199       return File;
200 
201     // Check whether this file is in the private headers.
202     // Ideally, private modules in the form 'FrameworkName.Private' should
203     // be defined as 'module FrameworkName.Private', and not as
204     // 'framework module FrameworkName.Private', since a 'Private.Framework'
205     // does not usually exist. However, since both are currently widely used
206     // for private modules, make sure we find the right path in both cases.
207     if (M->IsFramework && M->Name == "Private")
208       RelativePathName.clear();
209     else
210       RelativePathName.resize(RelativePathLength);
211     FullPathName.resize(FullPathLength);
212     llvm::sys::path::append(RelativePathName, "PrivateHeaders",
213                             Header.FileName);
214     llvm::sys::path::append(FullPathName, RelativePathName);
215     return GetFile(FullPathName);
216   };
217 
218   if (llvm::sys::path::is_absolute(Header.FileName)) {
219     RelativePathName.clear();
220     RelativePathName.append(Header.FileName.begin(), Header.FileName.end());
221     return GetFile(Header.FileName);
222   }
223 
224   if (M->isPartOfFramework())
225     return GetFrameworkFile();
226 
227   // Lookup for normal headers.
228   llvm::sys::path::append(RelativePathName, Header.FileName);
229   llvm::sys::path::append(FullPathName, RelativePathName);
230   auto *NormalHdrFile = GetFile(FullPathName);
231 
232   if (!NormalHdrFile && Directory->getName().endswith(".framework")) {
233     // The lack of 'framework' keyword in a module declaration it's a simple
234     // mistake we can diagnose when the header exists within the proper
235     // framework style path.
236     FullPathName.assign(Directory->getName());
237     RelativePathName.clear();
238     if (GetFrameworkFile()) {
239       Diags.Report(Header.FileNameLoc,
240                    diag::warn_mmap_incomplete_framework_module_declaration)
241           << Header.FileName << M->getFullModuleName();
242       NeedsFramework = true;
243     }
244     return nullptr;
245   }
246 
247   return NormalHdrFile;
248 }
249 
250 void ModuleMap::resolveHeader(Module *Mod,
251                               const Module::UnresolvedHeaderDirective &Header,
252                               bool &NeedsFramework) {
253   SmallString<128> RelativePathName;
254   if (const FileEntry *File =
255           findHeader(Mod, Header, RelativePathName, NeedsFramework)) {
256     if (Header.IsUmbrella) {
257       const DirectoryEntry *UmbrellaDir = File->getDir();
258       if (Module *UmbrellaMod = UmbrellaDirs[UmbrellaDir])
259         Diags.Report(Header.FileNameLoc, diag::err_mmap_umbrella_clash)
260           << UmbrellaMod->getFullModuleName();
261       else
262         // Record this umbrella header.
263         setUmbrellaHeader(Mod, File, RelativePathName.str());
264     } else {
265       Module::Header H = {std::string(RelativePathName.str()), File};
266       if (Header.Kind == Module::HK_Excluded)
267         excludeHeader(Mod, H);
268       else
269         addHeader(Mod, H, headerKindToRole(Header.Kind));
270     }
271   } else if (Header.HasBuiltinHeader && !Header.Size && !Header.ModTime) {
272     // There's a builtin header but no corresponding on-disk header. Assume
273     // this was supposed to modularize the builtin header alone.
274   } else if (Header.Kind == Module::HK_Excluded) {
275     // Ignore missing excluded header files. They're optional anyway.
276   } else {
277     // If we find a module that has a missing header, we mark this module as
278     // unavailable and store the header directive for displaying diagnostics.
279     Mod->MissingHeaders.push_back(Header);
280     // A missing header with stat information doesn't make the module
281     // unavailable; this keeps our behavior consistent as headers are lazily
282     // resolved. (Such a module still can't be built though, except from
283     // preprocessed source.)
284     if (!Header.Size && !Header.ModTime)
285       Mod->markUnavailable(/*Unimportable=*/false);
286   }
287 }
288 
289 bool ModuleMap::resolveAsBuiltinHeader(
290     Module *Mod, const Module::UnresolvedHeaderDirective &Header) {
291   if (Header.Kind == Module::HK_Excluded ||
292       llvm::sys::path::is_absolute(Header.FileName) ||
293       Mod->isPartOfFramework() || !Mod->IsSystem || Header.IsUmbrella ||
294       !BuiltinIncludeDir || BuiltinIncludeDir == Mod->Directory ||
295       !isBuiltinHeader(Header.FileName))
296     return false;
297 
298   // This is a system module with a top-level header. This header
299   // may have a counterpart (or replacement) in the set of headers
300   // supplied by Clang. Find that builtin header.
301   SmallString<128> Path;
302   llvm::sys::path::append(Path, BuiltinIncludeDir->getName(), Header.FileName);
303   auto File = SourceMgr.getFileManager().getFile(Path);
304   if (!File)
305     return false;
306 
307   auto Role = headerKindToRole(Header.Kind);
308   Module::Header H = {std::string(Path.str()), *File};
309   addHeader(Mod, H, Role);
310   return true;
311 }
312 
313 ModuleMap::ModuleMap(SourceManager &SourceMgr, DiagnosticsEngine &Diags,
314                      const LangOptions &LangOpts, const TargetInfo *Target,
315                      HeaderSearch &HeaderInfo)
316     : SourceMgr(SourceMgr), Diags(Diags), LangOpts(LangOpts), Target(Target),
317       HeaderInfo(HeaderInfo) {
318   MMapLangOpts.LineComment = true;
319 }
320 
321 ModuleMap::~ModuleMap() {
322   for (auto &M : Modules)
323     delete M.getValue();
324   for (auto *M : ShadowModules)
325     delete M;
326 }
327 
328 void ModuleMap::setTarget(const TargetInfo &Target) {
329   assert((!this->Target || this->Target == &Target) &&
330          "Improper target override");
331   this->Target = &Target;
332 }
333 
334 /// "Sanitize" a filename so that it can be used as an identifier.
335 static StringRef sanitizeFilenameAsIdentifier(StringRef Name,
336                                               SmallVectorImpl<char> &Buffer) {
337   if (Name.empty())
338     return Name;
339 
340   if (!isValidIdentifier(Name)) {
341     // If we don't already have something with the form of an identifier,
342     // create a buffer with the sanitized name.
343     Buffer.clear();
344     if (isDigit(Name[0]))
345       Buffer.push_back('_');
346     Buffer.reserve(Buffer.size() + Name.size());
347     for (unsigned I = 0, N = Name.size(); I != N; ++I) {
348       if (isIdentifierBody(Name[I]))
349         Buffer.push_back(Name[I]);
350       else
351         Buffer.push_back('_');
352     }
353 
354     Name = StringRef(Buffer.data(), Buffer.size());
355   }
356 
357   while (llvm::StringSwitch<bool>(Name)
358 #define KEYWORD(Keyword,Conditions) .Case(#Keyword, true)
359 #define ALIAS(Keyword, AliasOf, Conditions) .Case(Keyword, true)
360 #include "clang/Basic/TokenKinds.def"
361            .Default(false)) {
362     if (Name.data() != Buffer.data())
363       Buffer.append(Name.begin(), Name.end());
364     Buffer.push_back('_');
365     Name = StringRef(Buffer.data(), Buffer.size());
366   }
367 
368   return Name;
369 }
370 
371 /// Determine whether the given file name is the name of a builtin
372 /// header, supplied by Clang to replace, override, or augment existing system
373 /// headers.
374 bool ModuleMap::isBuiltinHeader(StringRef FileName) {
375   return llvm::StringSwitch<bool>(FileName)
376            .Case("float.h", true)
377            .Case("iso646.h", true)
378            .Case("limits.h", true)
379            .Case("stdalign.h", true)
380            .Case("stdarg.h", true)
381            .Case("stdatomic.h", true)
382            .Case("stdbool.h", true)
383            .Case("stddef.h", true)
384            .Case("stdint.h", true)
385            .Case("tgmath.h", true)
386            .Case("unwind.h", true)
387            .Default(false);
388 }
389 
390 bool ModuleMap::isBuiltinHeader(const FileEntry *File) {
391   return File->getDir() == BuiltinIncludeDir &&
392          ModuleMap::isBuiltinHeader(llvm::sys::path::filename(File->getName()));
393 }
394 
395 ModuleMap::HeadersMap::iterator
396 ModuleMap::findKnownHeader(const FileEntry *File) {
397   resolveHeaderDirectives(File);
398   HeadersMap::iterator Known = Headers.find(File);
399   if (HeaderInfo.getHeaderSearchOpts().ImplicitModuleMaps &&
400       Known == Headers.end() && ModuleMap::isBuiltinHeader(File)) {
401     HeaderInfo.loadTopLevelSystemModules();
402     return Headers.find(File);
403   }
404   return Known;
405 }
406 
407 ModuleMap::KnownHeader
408 ModuleMap::findHeaderInUmbrellaDirs(const FileEntry *File,
409                     SmallVectorImpl<const DirectoryEntry *> &IntermediateDirs) {
410   if (UmbrellaDirs.empty())
411     return {};
412 
413   const DirectoryEntry *Dir = File->getDir();
414   assert(Dir && "file in no directory");
415 
416   // Note: as an egregious but useful hack we use the real path here, because
417   // frameworks moving from top-level frameworks to embedded frameworks tend
418   // to be symlinked from the top-level location to the embedded location,
419   // and we need to resolve lookups as if we had found the embedded location.
420   StringRef DirName = SourceMgr.getFileManager().getCanonicalName(Dir);
421 
422   // Keep walking up the directory hierarchy, looking for a directory with
423   // an umbrella header.
424   do {
425     auto KnownDir = UmbrellaDirs.find(Dir);
426     if (KnownDir != UmbrellaDirs.end())
427       return KnownHeader(KnownDir->second, NormalHeader);
428 
429     IntermediateDirs.push_back(Dir);
430 
431     // Retrieve our parent path.
432     DirName = llvm::sys::path::parent_path(DirName);
433     if (DirName.empty())
434       break;
435 
436     // Resolve the parent path to a directory entry.
437     if (auto DirEntry = SourceMgr.getFileManager().getDirectory(DirName))
438       Dir = *DirEntry;
439     else
440       Dir = nullptr;
441   } while (Dir);
442   return {};
443 }
444 
445 static bool violatesPrivateInclude(Module *RequestingModule,
446                                    const FileEntry *IncFileEnt,
447                                    ModuleMap::KnownHeader Header) {
448 #ifndef NDEBUG
449   if (Header.getRole() & ModuleMap::PrivateHeader) {
450     // Check for consistency between the module header role
451     // as obtained from the lookup and as obtained from the module.
452     // This check is not cheap, so enable it only for debugging.
453     bool IsPrivate = false;
454     SmallVectorImpl<Module::Header> *HeaderList[] = {
455         &Header.getModule()->Headers[Module::HK_Private],
456         &Header.getModule()->Headers[Module::HK_PrivateTextual]};
457     for (auto *Hs : HeaderList)
458       IsPrivate |=
459           std::find_if(Hs->begin(), Hs->end(), [&](const Module::Header &H) {
460             return H.Entry == IncFileEnt;
461           }) != Hs->end();
462     assert(IsPrivate && "inconsistent headers and roles");
463   }
464 #endif
465   return !Header.isAccessibleFrom(RequestingModule);
466 }
467 
468 static Module *getTopLevelOrNull(Module *M) {
469   return M ? M->getTopLevelModule() : nullptr;
470 }
471 
472 void ModuleMap::diagnoseHeaderInclusion(Module *RequestingModule,
473                                         bool RequestingModuleIsModuleInterface,
474                                         SourceLocation FilenameLoc,
475                                         StringRef Filename,
476                                         const FileEntry *File) {
477   // No errors for indirect modules. This may be a bit of a problem for modules
478   // with no source files.
479   if (getTopLevelOrNull(RequestingModule) != getTopLevelOrNull(SourceModule))
480     return;
481 
482   if (RequestingModule) {
483     resolveUses(RequestingModule, /*Complain=*/false);
484     resolveHeaderDirectives(RequestingModule);
485   }
486 
487   bool Excluded = false;
488   Module *Private = nullptr;
489   Module *NotUsed = nullptr;
490 
491   HeadersMap::iterator Known = findKnownHeader(File);
492   if (Known != Headers.end()) {
493     for (const KnownHeader &Header : Known->second) {
494       // Remember private headers for later printing of a diagnostic.
495       if (violatesPrivateInclude(RequestingModule, File, Header)) {
496         Private = Header.getModule();
497         continue;
498       }
499 
500       // If uses need to be specified explicitly, we are only allowed to return
501       // modules that are explicitly used by the requesting module.
502       if (RequestingModule && LangOpts.ModulesDeclUse &&
503           !RequestingModule->directlyUses(Header.getModule())) {
504         NotUsed = Header.getModule();
505         continue;
506       }
507 
508       // We have found a module that we can happily use.
509       return;
510     }
511 
512     Excluded = true;
513   }
514 
515   // We have found a header, but it is private.
516   if (Private) {
517     Diags.Report(FilenameLoc, diag::warn_use_of_private_header_outside_module)
518         << Filename;
519     return;
520   }
521 
522   // We have found a module, but we don't use it.
523   if (NotUsed) {
524     Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module)
525         << RequestingModule->getTopLevelModule()->Name << Filename;
526     return;
527   }
528 
529   if (Excluded || isHeaderInUmbrellaDirs(File))
530     return;
531 
532   // At this point, only non-modular includes remain.
533 
534   if (RequestingModule && LangOpts.ModulesStrictDeclUse) {
535     Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module)
536         << RequestingModule->getTopLevelModule()->Name << Filename;
537   } else if (RequestingModule && RequestingModuleIsModuleInterface &&
538              LangOpts.isCompilingModule()) {
539     // Do not diagnose when we are not compiling a module.
540     diag::kind DiagID = RequestingModule->getTopLevelModule()->IsFramework ?
541         diag::warn_non_modular_include_in_framework_module :
542         diag::warn_non_modular_include_in_module;
543     Diags.Report(FilenameLoc, DiagID) << RequestingModule->getFullModuleName()
544         << File->getName();
545   }
546 }
547 
548 static bool isBetterKnownHeader(const ModuleMap::KnownHeader &New,
549                                 const ModuleMap::KnownHeader &Old) {
550   // Prefer available modules.
551   // FIXME: Considering whether the module is available rather than merely
552   // importable is non-hermetic and can result in surprising behavior for
553   // prebuilt modules. Consider only checking for importability here.
554   if (New.getModule()->isAvailable() && !Old.getModule()->isAvailable())
555     return true;
556 
557   // Prefer a public header over a private header.
558   if ((New.getRole() & ModuleMap::PrivateHeader) !=
559       (Old.getRole() & ModuleMap::PrivateHeader))
560     return !(New.getRole() & ModuleMap::PrivateHeader);
561 
562   // Prefer a non-textual header over a textual header.
563   if ((New.getRole() & ModuleMap::TextualHeader) !=
564       (Old.getRole() & ModuleMap::TextualHeader))
565     return !(New.getRole() & ModuleMap::TextualHeader);
566 
567   // Don't have a reason to choose between these. Just keep the first one.
568   return false;
569 }
570 
571 ModuleMap::KnownHeader ModuleMap::findModuleForHeader(const FileEntry *File,
572                                                       bool AllowTextual) {
573   auto MakeResult = [&](ModuleMap::KnownHeader R) -> ModuleMap::KnownHeader {
574     if (!AllowTextual && R.getRole() & ModuleMap::TextualHeader)
575       return {};
576     return R;
577   };
578 
579   HeadersMap::iterator Known = findKnownHeader(File);
580   if (Known != Headers.end()) {
581     ModuleMap::KnownHeader Result;
582     // Iterate over all modules that 'File' is part of to find the best fit.
583     for (KnownHeader &H : Known->second) {
584       // Prefer a header from the source module over all others.
585       if (H.getModule()->getTopLevelModule() == SourceModule)
586         return MakeResult(H);
587       if (!Result || isBetterKnownHeader(H, Result))
588         Result = H;
589     }
590     return MakeResult(Result);
591   }
592 
593   return MakeResult(findOrCreateModuleForHeaderInUmbrellaDir(File));
594 }
595 
596 ModuleMap::KnownHeader
597 ModuleMap::findOrCreateModuleForHeaderInUmbrellaDir(const FileEntry *File) {
598   assert(!Headers.count(File) && "already have a module for this header");
599 
600   SmallVector<const DirectoryEntry *, 2> SkippedDirs;
601   KnownHeader H = findHeaderInUmbrellaDirs(File, SkippedDirs);
602   if (H) {
603     Module *Result = H.getModule();
604 
605     // Search up the module stack until we find a module with an umbrella
606     // directory.
607     Module *UmbrellaModule = Result;
608     while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
609       UmbrellaModule = UmbrellaModule->Parent;
610 
611     if (UmbrellaModule->InferSubmodules) {
612       const FileEntry *UmbrellaModuleMap =
613           getModuleMapFileForUniquing(UmbrellaModule);
614 
615       // Infer submodules for each of the directories we found between
616       // the directory of the umbrella header and the directory where
617       // the actual header is located.
618       bool Explicit = UmbrellaModule->InferExplicitSubmodules;
619 
620       for (unsigned I = SkippedDirs.size(); I != 0; --I) {
621         // Find or create the module that corresponds to this directory name.
622         SmallString<32> NameBuf;
623         StringRef Name = sanitizeFilenameAsIdentifier(
624             llvm::sys::path::stem(SkippedDirs[I-1]->getName()), NameBuf);
625         Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
626                                     Explicit).first;
627         InferredModuleAllowedBy[Result] = UmbrellaModuleMap;
628         Result->IsInferred = true;
629 
630         // Associate the module and the directory.
631         UmbrellaDirs[SkippedDirs[I-1]] = Result;
632 
633         // If inferred submodules export everything they import, add a
634         // wildcard to the set of exports.
635         if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
636           Result->Exports.push_back(Module::ExportDecl(nullptr, true));
637       }
638 
639       // Infer a submodule with the same name as this header file.
640       SmallString<32> NameBuf;
641       StringRef Name = sanitizeFilenameAsIdentifier(
642                          llvm::sys::path::stem(File->getName()), NameBuf);
643       Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
644                                   Explicit).first;
645       InferredModuleAllowedBy[Result] = UmbrellaModuleMap;
646       Result->IsInferred = true;
647       Result->addTopHeader(File);
648 
649       // If inferred submodules export everything they import, add a
650       // wildcard to the set of exports.
651       if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
652         Result->Exports.push_back(Module::ExportDecl(nullptr, true));
653     } else {
654       // Record each of the directories we stepped through as being part of
655       // the module we found, since the umbrella header covers them all.
656       for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I)
657         UmbrellaDirs[SkippedDirs[I]] = Result;
658     }
659 
660     KnownHeader Header(Result, NormalHeader);
661     Headers[File].push_back(Header);
662     return Header;
663   }
664 
665   return {};
666 }
667 
668 ArrayRef<ModuleMap::KnownHeader>
669 ModuleMap::findAllModulesForHeader(const FileEntry *File) {
670   HeadersMap::iterator Known = findKnownHeader(File);
671   if (Known != Headers.end())
672     return Known->second;
673 
674   if (findOrCreateModuleForHeaderInUmbrellaDir(File))
675     return Headers.find(File)->second;
676 
677   return None;
678 }
679 
680 ArrayRef<ModuleMap::KnownHeader>
681 ModuleMap::findResolvedModulesForHeader(const FileEntry *File) const {
682   // FIXME: Is this necessary?
683   resolveHeaderDirectives(File);
684   auto It = Headers.find(File);
685   if (It == Headers.end())
686     return None;
687   return It->second;
688 }
689 
690 bool ModuleMap::isHeaderInUnavailableModule(const FileEntry *Header) const {
691   return isHeaderUnavailableInModule(Header, nullptr);
692 }
693 
694 bool
695 ModuleMap::isHeaderUnavailableInModule(const FileEntry *Header,
696                                        const Module *RequestingModule) const {
697   resolveHeaderDirectives(Header);
698   HeadersMap::const_iterator Known = Headers.find(Header);
699   if (Known != Headers.end()) {
700     for (SmallVectorImpl<KnownHeader>::const_iterator
701              I = Known->second.begin(),
702              E = Known->second.end();
703          I != E; ++I) {
704 
705       if (I->isAvailable() &&
706           (!RequestingModule ||
707            I->getModule()->isSubModuleOf(RequestingModule))) {
708         // When no requesting module is available, the caller is looking if a
709         // header is part a module by only looking into the module map. This is
710         // done by warn_uncovered_module_header checks; don't consider textual
711         // headers part of it in this mode, otherwise we get misleading warnings
712         // that a umbrella header is not including a textual header.
713         if (!RequestingModule && I->getRole() == ModuleMap::TextualHeader)
714           continue;
715         return false;
716       }
717     }
718     return true;
719   }
720 
721   const DirectoryEntry *Dir = Header->getDir();
722   SmallVector<const DirectoryEntry *, 2> SkippedDirs;
723   StringRef DirName = Dir->getName();
724 
725   auto IsUnavailable = [&](const Module *M) {
726     return !M->isAvailable() && (!RequestingModule ||
727                                  M->isSubModuleOf(RequestingModule));
728   };
729 
730   // Keep walking up the directory hierarchy, looking for a directory with
731   // an umbrella header.
732   do {
733     llvm::DenseMap<const DirectoryEntry *, Module *>::const_iterator KnownDir
734       = UmbrellaDirs.find(Dir);
735     if (KnownDir != UmbrellaDirs.end()) {
736       Module *Found = KnownDir->second;
737       if (IsUnavailable(Found))
738         return true;
739 
740       // Search up the module stack until we find a module with an umbrella
741       // directory.
742       Module *UmbrellaModule = Found;
743       while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
744         UmbrellaModule = UmbrellaModule->Parent;
745 
746       if (UmbrellaModule->InferSubmodules) {
747         for (unsigned I = SkippedDirs.size(); I != 0; --I) {
748           // Find or create the module that corresponds to this directory name.
749           SmallString<32> NameBuf;
750           StringRef Name = sanitizeFilenameAsIdentifier(
751                              llvm::sys::path::stem(SkippedDirs[I-1]->getName()),
752                              NameBuf);
753           Found = lookupModuleQualified(Name, Found);
754           if (!Found)
755             return false;
756           if (IsUnavailable(Found))
757             return true;
758         }
759 
760         // Infer a submodule with the same name as this header file.
761         SmallString<32> NameBuf;
762         StringRef Name = sanitizeFilenameAsIdentifier(
763                            llvm::sys::path::stem(Header->getName()),
764                            NameBuf);
765         Found = lookupModuleQualified(Name, Found);
766         if (!Found)
767           return false;
768       }
769 
770       return IsUnavailable(Found);
771     }
772 
773     SkippedDirs.push_back(Dir);
774 
775     // Retrieve our parent path.
776     DirName = llvm::sys::path::parent_path(DirName);
777     if (DirName.empty())
778       break;
779 
780     // Resolve the parent path to a directory entry.
781     if (auto DirEntry = SourceMgr.getFileManager().getDirectory(DirName))
782       Dir = *DirEntry;
783     else
784       Dir = nullptr;
785   } while (Dir);
786 
787   return false;
788 }
789 
790 Module *ModuleMap::findModule(StringRef Name) const {
791   llvm::StringMap<Module *>::const_iterator Known = Modules.find(Name);
792   if (Known != Modules.end())
793     return Known->getValue();
794 
795   return nullptr;
796 }
797 
798 Module *ModuleMap::lookupModuleUnqualified(StringRef Name,
799                                            Module *Context) const {
800   for(; Context; Context = Context->Parent) {
801     if (Module *Sub = lookupModuleQualified(Name, Context))
802       return Sub;
803   }
804 
805   return findModule(Name);
806 }
807 
808 Module *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) const{
809   if (!Context)
810     return findModule(Name);
811 
812   return Context->findSubmodule(Name);
813 }
814 
815 std::pair<Module *, bool> ModuleMap::findOrCreateModule(StringRef Name,
816                                                         Module *Parent,
817                                                         bool IsFramework,
818                                                         bool IsExplicit) {
819   // Try to find an existing module with this name.
820   if (Module *Sub = lookupModuleQualified(Name, Parent))
821     return std::make_pair(Sub, false);
822 
823   // Create a new module with this name.
824   Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework,
825                               IsExplicit, NumCreatedModules++);
826   if (!Parent) {
827     if (LangOpts.CurrentModule == Name)
828       SourceModule = Result;
829     Modules[Name] = Result;
830     ModuleScopeIDs[Result] = CurrentModuleScopeID;
831   }
832   return std::make_pair(Result, true);
833 }
834 
835 Module *ModuleMap::createGlobalModuleFragmentForModuleUnit(SourceLocation Loc) {
836   PendingSubmodules.emplace_back(
837       new Module("<global>", Loc, nullptr, /*IsFramework*/ false,
838                  /*IsExplicit*/ true, NumCreatedModules++));
839   PendingSubmodules.back()->Kind = Module::GlobalModuleFragment;
840   return PendingSubmodules.back().get();
841 }
842 
843 Module *
844 ModuleMap::createPrivateModuleFragmentForInterfaceUnit(Module *Parent,
845                                                        SourceLocation Loc) {
846   auto *Result =
847       new Module("<private>", Loc, Parent, /*IsFramework*/ false,
848                  /*IsExplicit*/ true, NumCreatedModules++);
849   Result->Kind = Module::PrivateModuleFragment;
850   return Result;
851 }
852 
853 Module *ModuleMap::createModuleForInterfaceUnit(SourceLocation Loc,
854                                                 StringRef Name,
855                                                 Module *GlobalModule) {
856   assert(LangOpts.CurrentModule == Name && "module name mismatch");
857   assert(!Modules[Name] && "redefining existing module");
858 
859   auto *Result =
860       new Module(Name, Loc, nullptr, /*IsFramework*/ false,
861                  /*IsExplicit*/ false, NumCreatedModules++);
862   Result->Kind = Module::ModuleInterfaceUnit;
863   Modules[Name] = SourceModule = Result;
864 
865   // Reparent the current global module fragment as a submodule of this module.
866   for (auto &Submodule : PendingSubmodules) {
867     Submodule->setParent(Result);
868     Submodule.release(); // now owned by parent
869   }
870   PendingSubmodules.clear();
871 
872   // Mark the main source file as being within the newly-created module so that
873   // declarations and macros are properly visibility-restricted to it.
874   auto *MainFile = SourceMgr.getFileEntryForID(SourceMgr.getMainFileID());
875   assert(MainFile && "no input file for module interface");
876   Headers[MainFile].push_back(KnownHeader(Result, PrivateHeader));
877 
878   return Result;
879 }
880 
881 Module *ModuleMap::createHeaderModule(StringRef Name,
882                                       ArrayRef<Module::Header> Headers) {
883   assert(LangOpts.CurrentModule == Name && "module name mismatch");
884   assert(!Modules[Name] && "redefining existing module");
885 
886   auto *Result =
887       new Module(Name, SourceLocation(), nullptr, /*IsFramework*/ false,
888                  /*IsExplicit*/ false, NumCreatedModules++);
889   Result->Kind = Module::ModuleInterfaceUnit;
890   Modules[Name] = SourceModule = Result;
891 
892   for (const Module::Header &H : Headers) {
893     auto *M = new Module(H.NameAsWritten, SourceLocation(), Result,
894                          /*IsFramework*/ false,
895                          /*IsExplicit*/ true, NumCreatedModules++);
896     // Header modules are implicitly 'export *'.
897     M->Exports.push_back(Module::ExportDecl(nullptr, true));
898     addHeader(M, H, NormalHeader);
899   }
900 
901   return Result;
902 }
903 
904 /// For a framework module, infer the framework against which we
905 /// should link.
906 static void inferFrameworkLink(Module *Mod, const DirectoryEntry *FrameworkDir,
907                                FileManager &FileMgr) {
908   assert(Mod->IsFramework && "Can only infer linking for framework modules");
909   assert(!Mod->isSubFramework() &&
910          "Can only infer linking for top-level frameworks");
911 
912   SmallString<128> LibName;
913   LibName += FrameworkDir->getName();
914   llvm::sys::path::append(LibName, Mod->Name);
915 
916   // The library name of a framework has more than one possible extension since
917   // the introduction of the text-based dynamic library format. We need to check
918   // for both before we give up.
919   for (const char *extension : {"", ".tbd"}) {
920     llvm::sys::path::replace_extension(LibName, extension);
921     if (FileMgr.getFile(LibName)) {
922       Mod->LinkLibraries.push_back(Module::LinkLibrary(Mod->Name,
923                                                        /*IsFramework=*/true));
924       return;
925     }
926   }
927 }
928 
929 Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir,
930                                         bool IsSystem, Module *Parent) {
931   Attributes Attrs;
932   Attrs.IsSystem = IsSystem;
933   return inferFrameworkModule(FrameworkDir, Attrs, Parent);
934 }
935 
936 Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir,
937                                         Attributes Attrs, Module *Parent) {
938   // Note: as an egregious but useful hack we use the real path here, because
939   // we might be looking at an embedded framework that symlinks out to a
940   // top-level framework, and we need to infer as if we were naming the
941   // top-level framework.
942   StringRef FrameworkDirName =
943       SourceMgr.getFileManager().getCanonicalName(FrameworkDir);
944 
945   // In case this is a case-insensitive filesystem, use the canonical
946   // directory name as the ModuleName, since modules are case-sensitive.
947   // FIXME: we should be able to give a fix-it hint for the correct spelling.
948   SmallString<32> ModuleNameStorage;
949   StringRef ModuleName = sanitizeFilenameAsIdentifier(
950       llvm::sys::path::stem(FrameworkDirName), ModuleNameStorage);
951 
952   // Check whether we've already found this module.
953   if (Module *Mod = lookupModuleQualified(ModuleName, Parent))
954     return Mod;
955 
956   FileManager &FileMgr = SourceMgr.getFileManager();
957 
958   // If the framework has a parent path from which we're allowed to infer
959   // a framework module, do so.
960   const FileEntry *ModuleMapFile = nullptr;
961   if (!Parent) {
962     // Determine whether we're allowed to infer a module map.
963     bool canInfer = false;
964     if (llvm::sys::path::has_parent_path(FrameworkDirName)) {
965       // Figure out the parent path.
966       StringRef Parent = llvm::sys::path::parent_path(FrameworkDirName);
967       if (auto ParentDir = FileMgr.getDirectory(Parent)) {
968         // Check whether we have already looked into the parent directory
969         // for a module map.
970         llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator
971           inferred = InferredDirectories.find(*ParentDir);
972         if (inferred == InferredDirectories.end()) {
973           // We haven't looked here before. Load a module map, if there is
974           // one.
975           bool IsFrameworkDir = Parent.endswith(".framework");
976           if (const FileEntry *ModMapFile =
977                 HeaderInfo.lookupModuleMapFile(*ParentDir, IsFrameworkDir)) {
978             parseModuleMapFile(ModMapFile, Attrs.IsSystem, *ParentDir);
979             inferred = InferredDirectories.find(*ParentDir);
980           }
981 
982           if (inferred == InferredDirectories.end())
983             inferred = InferredDirectories.insert(
984                          std::make_pair(*ParentDir, InferredDirectory())).first;
985         }
986 
987         if (inferred->second.InferModules) {
988           // We're allowed to infer for this directory, but make sure it's okay
989           // to infer this particular module.
990           StringRef Name = llvm::sys::path::stem(FrameworkDirName);
991           canInfer = std::find(inferred->second.ExcludedModules.begin(),
992                                inferred->second.ExcludedModules.end(),
993                                Name) == inferred->second.ExcludedModules.end();
994 
995           Attrs.IsSystem |= inferred->second.Attrs.IsSystem;
996           Attrs.IsExternC |= inferred->second.Attrs.IsExternC;
997           Attrs.IsExhaustive |= inferred->second.Attrs.IsExhaustive;
998           Attrs.NoUndeclaredIncludes |=
999               inferred->second.Attrs.NoUndeclaredIncludes;
1000           ModuleMapFile = inferred->second.ModuleMapFile;
1001         }
1002       }
1003     }
1004 
1005     // If we're not allowed to infer a framework module, don't.
1006     if (!canInfer)
1007       return nullptr;
1008   } else
1009     ModuleMapFile = getModuleMapFileForUniquing(Parent);
1010 
1011 
1012   // Look for an umbrella header.
1013   SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName());
1014   llvm::sys::path::append(UmbrellaName, "Headers", ModuleName + ".h");
1015   auto UmbrellaHeader = FileMgr.getFile(UmbrellaName);
1016 
1017   // FIXME: If there's no umbrella header, we could probably scan the
1018   // framework to load *everything*. But, it's not clear that this is a good
1019   // idea.
1020   if (!UmbrellaHeader)
1021     return nullptr;
1022 
1023   Module *Result = new Module(ModuleName, SourceLocation(), Parent,
1024                               /*IsFramework=*/true, /*IsExplicit=*/false,
1025                               NumCreatedModules++);
1026   InferredModuleAllowedBy[Result] = ModuleMapFile;
1027   Result->IsInferred = true;
1028   if (!Parent) {
1029     if (LangOpts.CurrentModule == ModuleName)
1030       SourceModule = Result;
1031     Modules[ModuleName] = Result;
1032     ModuleScopeIDs[Result] = CurrentModuleScopeID;
1033   }
1034 
1035   Result->IsSystem |= Attrs.IsSystem;
1036   Result->IsExternC |= Attrs.IsExternC;
1037   Result->ConfigMacrosExhaustive |= Attrs.IsExhaustive;
1038   Result->NoUndeclaredIncludes |= Attrs.NoUndeclaredIncludes;
1039   Result->Directory = FrameworkDir;
1040 
1041   // umbrella header "umbrella-header-name"
1042   //
1043   // The "Headers/" component of the name is implied because this is
1044   // a framework module.
1045   setUmbrellaHeader(Result, *UmbrellaHeader, ModuleName + ".h");
1046 
1047   // export *
1048   Result->Exports.push_back(Module::ExportDecl(nullptr, true));
1049 
1050   // module * { export * }
1051   Result->InferSubmodules = true;
1052   Result->InferExportWildcard = true;
1053 
1054   // Look for subframeworks.
1055   std::error_code EC;
1056   SmallString<128> SubframeworksDirName
1057     = StringRef(FrameworkDir->getName());
1058   llvm::sys::path::append(SubframeworksDirName, "Frameworks");
1059   llvm::sys::path::native(SubframeworksDirName);
1060   llvm::vfs::FileSystem &FS = FileMgr.getVirtualFileSystem();
1061   for (llvm::vfs::directory_iterator
1062            Dir = FS.dir_begin(SubframeworksDirName, EC),
1063            DirEnd;
1064        Dir != DirEnd && !EC; Dir.increment(EC)) {
1065     if (!StringRef(Dir->path()).endswith(".framework"))
1066       continue;
1067 
1068     if (auto SubframeworkDir =
1069             FileMgr.getDirectory(Dir->path())) {
1070       // Note: as an egregious but useful hack, we use the real path here and
1071       // check whether it is actually a subdirectory of the parent directory.
1072       // This will not be the case if the 'subframework' is actually a symlink
1073       // out to a top-level framework.
1074       StringRef SubframeworkDirName =
1075           FileMgr.getCanonicalName(*SubframeworkDir);
1076       bool FoundParent = false;
1077       do {
1078         // Get the parent directory name.
1079         SubframeworkDirName
1080           = llvm::sys::path::parent_path(SubframeworkDirName);
1081         if (SubframeworkDirName.empty())
1082           break;
1083 
1084         if (auto SubDir = FileMgr.getDirectory(SubframeworkDirName)) {
1085           if (*SubDir == FrameworkDir) {
1086             FoundParent = true;
1087             break;
1088           }
1089         }
1090       } while (true);
1091 
1092       if (!FoundParent)
1093         continue;
1094 
1095       // FIXME: Do we want to warn about subframeworks without umbrella headers?
1096       inferFrameworkModule(*SubframeworkDir, Attrs, Result);
1097     }
1098   }
1099 
1100   // If the module is a top-level framework, automatically link against the
1101   // framework.
1102   if (!Result->isSubFramework()) {
1103     inferFrameworkLink(Result, FrameworkDir, FileMgr);
1104   }
1105 
1106   return Result;
1107 }
1108 
1109 Module *ModuleMap::createShadowedModule(StringRef Name, bool IsFramework,
1110                                         Module *ShadowingModule) {
1111 
1112   // Create a new module with this name.
1113   Module *Result =
1114       new Module(Name, SourceLocation(), /*Parent=*/nullptr, IsFramework,
1115                  /*IsExplicit=*/false, NumCreatedModules++);
1116   Result->ShadowingModule = ShadowingModule;
1117   Result->markUnavailable(/*Unimportable*/true);
1118   ModuleScopeIDs[Result] = CurrentModuleScopeID;
1119   ShadowModules.push_back(Result);
1120 
1121   return Result;
1122 }
1123 
1124 void ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader,
1125                                   Twine NameAsWritten) {
1126   Headers[UmbrellaHeader].push_back(KnownHeader(Mod, NormalHeader));
1127   Mod->Umbrella = UmbrellaHeader;
1128   Mod->HasUmbrellaDir = false;
1129   Mod->UmbrellaAsWritten = NameAsWritten.str();
1130   UmbrellaDirs[UmbrellaHeader->getDir()] = Mod;
1131 
1132   // Notify callbacks that we just added a new header.
1133   for (const auto &Cb : Callbacks)
1134     Cb->moduleMapAddUmbrellaHeader(&SourceMgr.getFileManager(), UmbrellaHeader);
1135 }
1136 
1137 void ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir,
1138                                Twine NameAsWritten) {
1139   Mod->Umbrella = UmbrellaDir;
1140   Mod->HasUmbrellaDir = true;
1141   Mod->UmbrellaAsWritten = NameAsWritten.str();
1142   UmbrellaDirs[UmbrellaDir] = Mod;
1143 }
1144 
1145 void ModuleMap::addUnresolvedHeader(Module *Mod,
1146                                     Module::UnresolvedHeaderDirective Header,
1147                                     bool &NeedsFramework) {
1148   // If there is a builtin counterpart to this file, add it now so it can
1149   // wrap the system header.
1150   if (resolveAsBuiltinHeader(Mod, Header)) {
1151     // If we have both a builtin and system version of the file, the
1152     // builtin version may want to inject macros into the system header, so
1153     // force the system header to be treated as a textual header in this
1154     // case.
1155     Header.Kind = headerRoleToKind(ModuleMap::ModuleHeaderRole(
1156         headerKindToRole(Header.Kind) | ModuleMap::TextualHeader));
1157     Header.HasBuiltinHeader = true;
1158   }
1159 
1160   // If possible, don't stat the header until we need to. This requires the
1161   // user to have provided us with some stat information about the file.
1162   // FIXME: Add support for lazily stat'ing umbrella headers and excluded
1163   // headers.
1164   if ((Header.Size || Header.ModTime) && !Header.IsUmbrella &&
1165       Header.Kind != Module::HK_Excluded) {
1166     // We expect more variation in mtime than size, so if we're given both,
1167     // use the mtime as the key.
1168     if (Header.ModTime)
1169       LazyHeadersByModTime[*Header.ModTime].push_back(Mod);
1170     else
1171       LazyHeadersBySize[*Header.Size].push_back(Mod);
1172     Mod->UnresolvedHeaders.push_back(Header);
1173     return;
1174   }
1175 
1176   // We don't have stat information or can't defer looking this file up.
1177   // Perform the lookup now.
1178   resolveHeader(Mod, Header, NeedsFramework);
1179 }
1180 
1181 void ModuleMap::resolveHeaderDirectives(const FileEntry *File) const {
1182   auto BySize = LazyHeadersBySize.find(File->getSize());
1183   if (BySize != LazyHeadersBySize.end()) {
1184     for (auto *M : BySize->second)
1185       resolveHeaderDirectives(M);
1186     LazyHeadersBySize.erase(BySize);
1187   }
1188 
1189   auto ByModTime = LazyHeadersByModTime.find(File->getModificationTime());
1190   if (ByModTime != LazyHeadersByModTime.end()) {
1191     for (auto *M : ByModTime->second)
1192       resolveHeaderDirectives(M);
1193     LazyHeadersByModTime.erase(ByModTime);
1194   }
1195 }
1196 
1197 void ModuleMap::resolveHeaderDirectives(Module *Mod) const {
1198   bool NeedsFramework = false;
1199   for (auto &Header : Mod->UnresolvedHeaders)
1200     // This operation is logically const; we're just changing how we represent
1201     // the header information for this file.
1202     const_cast<ModuleMap*>(this)->resolveHeader(Mod, Header, NeedsFramework);
1203   Mod->UnresolvedHeaders.clear();
1204 }
1205 
1206 void ModuleMap::addHeader(Module *Mod, Module::Header Header,
1207                           ModuleHeaderRole Role, bool Imported) {
1208   KnownHeader KH(Mod, Role);
1209 
1210   // Only add each header to the headers list once.
1211   // FIXME: Should we diagnose if a header is listed twice in the
1212   // same module definition?
1213   auto &HeaderList = Headers[Header.Entry];
1214   for (auto H : HeaderList)
1215     if (H == KH)
1216       return;
1217 
1218   HeaderList.push_back(KH);
1219   Mod->Headers[headerRoleToKind(Role)].push_back(Header);
1220 
1221   bool isCompilingModuleHeader =
1222       LangOpts.isCompilingModule() && Mod->getTopLevelModule() == SourceModule;
1223   if (!Imported || isCompilingModuleHeader) {
1224     // When we import HeaderFileInfo, the external source is expected to
1225     // set the isModuleHeader flag itself.
1226     HeaderInfo.MarkFileModuleHeader(Header.Entry, Role,
1227                                     isCompilingModuleHeader);
1228   }
1229 
1230   // Notify callbacks that we just added a new header.
1231   for (const auto &Cb : Callbacks)
1232     Cb->moduleMapAddHeader(Header.Entry->getName());
1233 }
1234 
1235 void ModuleMap::excludeHeader(Module *Mod, Module::Header Header) {
1236   // Add this as a known header so we won't implicitly add it to any
1237   // umbrella directory module.
1238   // FIXME: Should we only exclude it from umbrella modules within the
1239   // specified module?
1240   (void) Headers[Header.Entry];
1241 
1242   Mod->Headers[Module::HK_Excluded].push_back(std::move(Header));
1243 }
1244 
1245 const FileEntry *
1246 ModuleMap::getContainingModuleMapFile(const Module *Module) const {
1247   if (Module->DefinitionLoc.isInvalid())
1248     return nullptr;
1249 
1250   return SourceMgr.getFileEntryForID(
1251            SourceMgr.getFileID(Module->DefinitionLoc));
1252 }
1253 
1254 const FileEntry *ModuleMap::getModuleMapFileForUniquing(const Module *M) const {
1255   if (M->IsInferred) {
1256     assert(InferredModuleAllowedBy.count(M) && "missing inferred module map");
1257     return InferredModuleAllowedBy.find(M)->second;
1258   }
1259   return getContainingModuleMapFile(M);
1260 }
1261 
1262 void ModuleMap::setInferredModuleAllowedBy(Module *M, const FileEntry *ModMap) {
1263   assert(M->IsInferred && "module not inferred");
1264   InferredModuleAllowedBy[M] = ModMap;
1265 }
1266 
1267 void ModuleMap::addAdditionalModuleMapFile(const Module *M,
1268                                            const FileEntry *ModuleMap) {
1269   AdditionalModMaps[M].insert(ModuleMap);
1270 }
1271 
1272 LLVM_DUMP_METHOD void ModuleMap::dump() {
1273   llvm::errs() << "Modules:";
1274   for (llvm::StringMap<Module *>::iterator M = Modules.begin(),
1275                                         MEnd = Modules.end();
1276        M != MEnd; ++M)
1277     M->getValue()->print(llvm::errs(), 2);
1278 
1279   llvm::errs() << "Headers:";
1280   for (HeadersMap::iterator H = Headers.begin(), HEnd = Headers.end();
1281        H != HEnd; ++H) {
1282     llvm::errs() << "  \"" << H->first->getName() << "\" -> ";
1283     for (SmallVectorImpl<KnownHeader>::const_iterator I = H->second.begin(),
1284                                                       E = H->second.end();
1285          I != E; ++I) {
1286       if (I != H->second.begin())
1287         llvm::errs() << ",";
1288       llvm::errs() << I->getModule()->getFullModuleName();
1289     }
1290     llvm::errs() << "\n";
1291   }
1292 }
1293 
1294 bool ModuleMap::resolveExports(Module *Mod, bool Complain) {
1295   auto Unresolved = std::move(Mod->UnresolvedExports);
1296   Mod->UnresolvedExports.clear();
1297   for (auto &UE : Unresolved) {
1298     Module::ExportDecl Export = resolveExport(Mod, UE, Complain);
1299     if (Export.getPointer() || Export.getInt())
1300       Mod->Exports.push_back(Export);
1301     else
1302       Mod->UnresolvedExports.push_back(UE);
1303   }
1304   return !Mod->UnresolvedExports.empty();
1305 }
1306 
1307 bool ModuleMap::resolveUses(Module *Mod, bool Complain) {
1308   auto Unresolved = std::move(Mod->UnresolvedDirectUses);
1309   Mod->UnresolvedDirectUses.clear();
1310   for (auto &UDU : Unresolved) {
1311     Module *DirectUse = resolveModuleId(UDU, Mod, Complain);
1312     if (DirectUse)
1313       Mod->DirectUses.push_back(DirectUse);
1314     else
1315       Mod->UnresolvedDirectUses.push_back(UDU);
1316   }
1317   return !Mod->UnresolvedDirectUses.empty();
1318 }
1319 
1320 bool ModuleMap::resolveConflicts(Module *Mod, bool Complain) {
1321   auto Unresolved = std::move(Mod->UnresolvedConflicts);
1322   Mod->UnresolvedConflicts.clear();
1323   for (auto &UC : Unresolved) {
1324     if (Module *OtherMod = resolveModuleId(UC.Id, Mod, Complain)) {
1325       Module::Conflict Conflict;
1326       Conflict.Other = OtherMod;
1327       Conflict.Message = UC.Message;
1328       Mod->Conflicts.push_back(Conflict);
1329     } else
1330       Mod->UnresolvedConflicts.push_back(UC);
1331   }
1332   return !Mod->UnresolvedConflicts.empty();
1333 }
1334 
1335 //----------------------------------------------------------------------------//
1336 // Module map file parser
1337 //----------------------------------------------------------------------------//
1338 
1339 namespace clang {
1340 
1341   /// A token in a module map file.
1342   struct MMToken {
1343     enum TokenKind {
1344       Comma,
1345       ConfigMacros,
1346       Conflict,
1347       EndOfFile,
1348       HeaderKeyword,
1349       Identifier,
1350       Exclaim,
1351       ExcludeKeyword,
1352       ExplicitKeyword,
1353       ExportKeyword,
1354       ExportAsKeyword,
1355       ExternKeyword,
1356       FrameworkKeyword,
1357       LinkKeyword,
1358       ModuleKeyword,
1359       Period,
1360       PrivateKeyword,
1361       UmbrellaKeyword,
1362       UseKeyword,
1363       RequiresKeyword,
1364       Star,
1365       StringLiteral,
1366       IntegerLiteral,
1367       TextualKeyword,
1368       LBrace,
1369       RBrace,
1370       LSquare,
1371       RSquare
1372     } Kind;
1373 
1374     unsigned Location;
1375     unsigned StringLength;
1376     union {
1377       // If Kind != IntegerLiteral.
1378       const char *StringData;
1379 
1380       // If Kind == IntegerLiteral.
1381       uint64_t IntegerValue;
1382     };
1383 
1384     void clear() {
1385       Kind = EndOfFile;
1386       Location = 0;
1387       StringLength = 0;
1388       StringData = nullptr;
1389     }
1390 
1391     bool is(TokenKind K) const { return Kind == K; }
1392 
1393     SourceLocation getLocation() const {
1394       return SourceLocation::getFromRawEncoding(Location);
1395     }
1396 
1397     uint64_t getInteger() const {
1398       return Kind == IntegerLiteral ? IntegerValue : 0;
1399     }
1400 
1401     StringRef getString() const {
1402       return Kind == IntegerLiteral ? StringRef()
1403                                     : StringRef(StringData, StringLength);
1404     }
1405   };
1406 
1407   class ModuleMapParser {
1408     Lexer &L;
1409     SourceManager &SourceMgr;
1410 
1411     /// Default target information, used only for string literal
1412     /// parsing.
1413     const TargetInfo *Target;
1414 
1415     DiagnosticsEngine &Diags;
1416     ModuleMap &Map;
1417 
1418     /// The current module map file.
1419     const FileEntry *ModuleMapFile;
1420 
1421     /// Source location of most recent parsed module declaration
1422     SourceLocation CurrModuleDeclLoc;
1423 
1424     /// The directory that file names in this module map file should
1425     /// be resolved relative to.
1426     const DirectoryEntry *Directory;
1427 
1428     /// Whether this module map is in a system header directory.
1429     bool IsSystem;
1430 
1431     /// Whether an error occurred.
1432     bool HadError = false;
1433 
1434     /// Stores string data for the various string literals referenced
1435     /// during parsing.
1436     llvm::BumpPtrAllocator StringData;
1437 
1438     /// The current token.
1439     MMToken Tok;
1440 
1441     /// The active module.
1442     Module *ActiveModule = nullptr;
1443 
1444     /// Whether a module uses the 'requires excluded' hack to mark its
1445     /// contents as 'textual'.
1446     ///
1447     /// On older Darwin SDK versions, 'requires excluded' is used to mark the
1448     /// contents of the Darwin.C.excluded (assert.h) and Tcl.Private modules as
1449     /// non-modular headers.  For backwards compatibility, we continue to
1450     /// support this idiom for just these modules, and map the headers to
1451     /// 'textual' to match the original intent.
1452     llvm::SmallPtrSet<Module *, 2> UsesRequiresExcludedHack;
1453 
1454     /// Consume the current token and return its location.
1455     SourceLocation consumeToken();
1456 
1457     /// Skip tokens until we reach the a token with the given kind
1458     /// (or the end of the file).
1459     void skipUntil(MMToken::TokenKind K);
1460 
1461     using ModuleId = SmallVector<std::pair<std::string, SourceLocation>, 2>;
1462 
1463     bool parseModuleId(ModuleId &Id);
1464     void parseModuleDecl();
1465     void parseExternModuleDecl();
1466     void parseRequiresDecl();
1467     void parseHeaderDecl(MMToken::TokenKind, SourceLocation LeadingLoc);
1468     void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc);
1469     void parseExportDecl();
1470     void parseExportAsDecl();
1471     void parseUseDecl();
1472     void parseLinkDecl();
1473     void parseConfigMacros();
1474     void parseConflict();
1475     void parseInferredModuleDecl(bool Framework, bool Explicit);
1476 
1477     /// Private modules are canonicalized as Foo_Private. Clang provides extra
1478     /// module map search logic to find the appropriate private module when PCH
1479     /// is used with implicit module maps. Warn when private modules are written
1480     /// in other ways (FooPrivate and Foo.Private), providing notes and fixits.
1481     void diagnosePrivateModules(SourceLocation ExplicitLoc,
1482                                 SourceLocation FrameworkLoc);
1483 
1484     using Attributes = ModuleMap::Attributes;
1485 
1486     bool parseOptionalAttributes(Attributes &Attrs);
1487 
1488   public:
1489     explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr,
1490                              const TargetInfo *Target, DiagnosticsEngine &Diags,
1491                              ModuleMap &Map, const FileEntry *ModuleMapFile,
1492                              const DirectoryEntry *Directory, bool IsSystem)
1493         : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map),
1494           ModuleMapFile(ModuleMapFile), Directory(Directory),
1495           IsSystem(IsSystem) {
1496       Tok.clear();
1497       consumeToken();
1498     }
1499 
1500     bool parseModuleMapFile();
1501 
1502     bool terminatedByDirective() { return false; }
1503     SourceLocation getLocation() { return Tok.getLocation(); }
1504   };
1505 
1506 } // namespace clang
1507 
1508 SourceLocation ModuleMapParser::consumeToken() {
1509   SourceLocation Result = Tok.getLocation();
1510 
1511 retry:
1512   Tok.clear();
1513   Token LToken;
1514   L.LexFromRawLexer(LToken);
1515   Tok.Location = LToken.getLocation().getRawEncoding();
1516   switch (LToken.getKind()) {
1517   case tok::raw_identifier: {
1518     StringRef RI = LToken.getRawIdentifier();
1519     Tok.StringData = RI.data();
1520     Tok.StringLength = RI.size();
1521     Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(RI)
1522                  .Case("config_macros", MMToken::ConfigMacros)
1523                  .Case("conflict", MMToken::Conflict)
1524                  .Case("exclude", MMToken::ExcludeKeyword)
1525                  .Case("explicit", MMToken::ExplicitKeyword)
1526                  .Case("export", MMToken::ExportKeyword)
1527                  .Case("export_as", MMToken::ExportAsKeyword)
1528                  .Case("extern", MMToken::ExternKeyword)
1529                  .Case("framework", MMToken::FrameworkKeyword)
1530                  .Case("header", MMToken::HeaderKeyword)
1531                  .Case("link", MMToken::LinkKeyword)
1532                  .Case("module", MMToken::ModuleKeyword)
1533                  .Case("private", MMToken::PrivateKeyword)
1534                  .Case("requires", MMToken::RequiresKeyword)
1535                  .Case("textual", MMToken::TextualKeyword)
1536                  .Case("umbrella", MMToken::UmbrellaKeyword)
1537                  .Case("use", MMToken::UseKeyword)
1538                  .Default(MMToken::Identifier);
1539     break;
1540   }
1541 
1542   case tok::comma:
1543     Tok.Kind = MMToken::Comma;
1544     break;
1545 
1546   case tok::eof:
1547     Tok.Kind = MMToken::EndOfFile;
1548     break;
1549 
1550   case tok::l_brace:
1551     Tok.Kind = MMToken::LBrace;
1552     break;
1553 
1554   case tok::l_square:
1555     Tok.Kind = MMToken::LSquare;
1556     break;
1557 
1558   case tok::period:
1559     Tok.Kind = MMToken::Period;
1560     break;
1561 
1562   case tok::r_brace:
1563     Tok.Kind = MMToken::RBrace;
1564     break;
1565 
1566   case tok::r_square:
1567     Tok.Kind = MMToken::RSquare;
1568     break;
1569 
1570   case tok::star:
1571     Tok.Kind = MMToken::Star;
1572     break;
1573 
1574   case tok::exclaim:
1575     Tok.Kind = MMToken::Exclaim;
1576     break;
1577 
1578   case tok::string_literal: {
1579     if (LToken.hasUDSuffix()) {
1580       Diags.Report(LToken.getLocation(), diag::err_invalid_string_udl);
1581       HadError = true;
1582       goto retry;
1583     }
1584 
1585     // Parse the string literal.
1586     LangOptions LangOpts;
1587     StringLiteralParser StringLiteral(LToken, SourceMgr, LangOpts, *Target);
1588     if (StringLiteral.hadError)
1589       goto retry;
1590 
1591     // Copy the string literal into our string data allocator.
1592     unsigned Length = StringLiteral.GetStringLength();
1593     char *Saved = StringData.Allocate<char>(Length + 1);
1594     memcpy(Saved, StringLiteral.GetString().data(), Length);
1595     Saved[Length] = 0;
1596 
1597     // Form the token.
1598     Tok.Kind = MMToken::StringLiteral;
1599     Tok.StringData = Saved;
1600     Tok.StringLength = Length;
1601     break;
1602   }
1603 
1604   case tok::numeric_constant: {
1605     // We don't support any suffixes or other complications.
1606     SmallString<32> SpellingBuffer;
1607     SpellingBuffer.resize(LToken.getLength() + 1);
1608     const char *Start = SpellingBuffer.data();
1609     unsigned Length =
1610         Lexer::getSpelling(LToken, Start, SourceMgr, L.getLangOpts());
1611     uint64_t Value;
1612     if (StringRef(Start, Length).getAsInteger(0, Value)) {
1613       Diags.Report(Tok.getLocation(), diag::err_mmap_unknown_token);
1614       HadError = true;
1615       goto retry;
1616     }
1617 
1618     Tok.Kind = MMToken::IntegerLiteral;
1619     Tok.IntegerValue = Value;
1620     break;
1621   }
1622 
1623   case tok::comment:
1624     goto retry;
1625 
1626   case tok::hash:
1627     // A module map can be terminated prematurely by
1628     //   #pragma clang module contents
1629     // When building the module, we'll treat the rest of the file as the
1630     // contents of the module.
1631     {
1632       auto NextIsIdent = [&](StringRef Str) -> bool {
1633         L.LexFromRawLexer(LToken);
1634         return !LToken.isAtStartOfLine() && LToken.is(tok::raw_identifier) &&
1635                LToken.getRawIdentifier() == Str;
1636       };
1637       if (NextIsIdent("pragma") && NextIsIdent("clang") &&
1638           NextIsIdent("module") && NextIsIdent("contents")) {
1639         Tok.Kind = MMToken::EndOfFile;
1640         break;
1641       }
1642     }
1643     LLVM_FALLTHROUGH;
1644 
1645   default:
1646     Diags.Report(Tok.getLocation(), diag::err_mmap_unknown_token);
1647     HadError = true;
1648     goto retry;
1649   }
1650 
1651   return Result;
1652 }
1653 
1654 void ModuleMapParser::skipUntil(MMToken::TokenKind K) {
1655   unsigned braceDepth = 0;
1656   unsigned squareDepth = 0;
1657   do {
1658     switch (Tok.Kind) {
1659     case MMToken::EndOfFile:
1660       return;
1661 
1662     case MMToken::LBrace:
1663       if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
1664         return;
1665 
1666       ++braceDepth;
1667       break;
1668 
1669     case MMToken::LSquare:
1670       if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
1671         return;
1672 
1673       ++squareDepth;
1674       break;
1675 
1676     case MMToken::RBrace:
1677       if (braceDepth > 0)
1678         --braceDepth;
1679       else if (Tok.is(K))
1680         return;
1681       break;
1682 
1683     case MMToken::RSquare:
1684       if (squareDepth > 0)
1685         --squareDepth;
1686       else if (Tok.is(K))
1687         return;
1688       break;
1689 
1690     default:
1691       if (braceDepth == 0 && squareDepth == 0 && Tok.is(K))
1692         return;
1693       break;
1694     }
1695 
1696    consumeToken();
1697   } while (true);
1698 }
1699 
1700 /// Parse a module-id.
1701 ///
1702 ///   module-id:
1703 ///     identifier
1704 ///     identifier '.' module-id
1705 ///
1706 /// \returns true if an error occurred, false otherwise.
1707 bool ModuleMapParser::parseModuleId(ModuleId &Id) {
1708   Id.clear();
1709   do {
1710     if (Tok.is(MMToken::Identifier) || Tok.is(MMToken::StringLiteral)) {
1711       Id.push_back(
1712           std::make_pair(std::string(Tok.getString()), Tok.getLocation()));
1713       consumeToken();
1714     } else {
1715       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name);
1716       return true;
1717     }
1718 
1719     if (!Tok.is(MMToken::Period))
1720       break;
1721 
1722     consumeToken();
1723   } while (true);
1724 
1725   return false;
1726 }
1727 
1728 namespace {
1729 
1730   /// Enumerates the known attributes.
1731   enum AttributeKind {
1732     /// An unknown attribute.
1733     AT_unknown,
1734 
1735     /// The 'system' attribute.
1736     AT_system,
1737 
1738     /// The 'extern_c' attribute.
1739     AT_extern_c,
1740 
1741     /// The 'exhaustive' attribute.
1742     AT_exhaustive,
1743 
1744     /// The 'no_undeclared_includes' attribute.
1745     AT_no_undeclared_includes
1746   };
1747 
1748 } // namespace
1749 
1750 /// Private modules are canonicalized as Foo_Private. Clang provides extra
1751 /// module map search logic to find the appropriate private module when PCH
1752 /// is used with implicit module maps. Warn when private modules are written
1753 /// in other ways (FooPrivate and Foo.Private), providing notes and fixits.
1754 void ModuleMapParser::diagnosePrivateModules(SourceLocation ExplicitLoc,
1755                                              SourceLocation FrameworkLoc) {
1756   auto GenNoteAndFixIt = [&](StringRef BadName, StringRef Canonical,
1757                              const Module *M, SourceRange ReplLoc) {
1758     auto D = Diags.Report(ActiveModule->DefinitionLoc,
1759                           diag::note_mmap_rename_top_level_private_module);
1760     D << BadName << M->Name;
1761     D << FixItHint::CreateReplacement(ReplLoc, Canonical);
1762   };
1763 
1764   for (auto E = Map.module_begin(); E != Map.module_end(); ++E) {
1765     auto const *M = E->getValue();
1766     if (M->Directory != ActiveModule->Directory)
1767       continue;
1768 
1769     SmallString<128> FullName(ActiveModule->getFullModuleName());
1770     if (!FullName.startswith(M->Name) && !FullName.endswith("Private"))
1771       continue;
1772     SmallString<128> FixedPrivModDecl;
1773     SmallString<128> Canonical(M->Name);
1774     Canonical.append("_Private");
1775 
1776     // Foo.Private -> Foo_Private
1777     if (ActiveModule->Parent && ActiveModule->Name == "Private" && !M->Parent &&
1778         M->Name == ActiveModule->Parent->Name) {
1779       Diags.Report(ActiveModule->DefinitionLoc,
1780                    diag::warn_mmap_mismatched_private_submodule)
1781           << FullName;
1782 
1783       SourceLocation FixItInitBegin = CurrModuleDeclLoc;
1784       if (FrameworkLoc.isValid())
1785         FixItInitBegin = FrameworkLoc;
1786       if (ExplicitLoc.isValid())
1787         FixItInitBegin = ExplicitLoc;
1788 
1789       if (FrameworkLoc.isValid() || ActiveModule->Parent->IsFramework)
1790         FixedPrivModDecl.append("framework ");
1791       FixedPrivModDecl.append("module ");
1792       FixedPrivModDecl.append(Canonical);
1793 
1794       GenNoteAndFixIt(FullName, FixedPrivModDecl, M,
1795                       SourceRange(FixItInitBegin, ActiveModule->DefinitionLoc));
1796       continue;
1797     }
1798 
1799     // FooPrivate and whatnots -> Foo_Private
1800     if (!ActiveModule->Parent && !M->Parent && M->Name != ActiveModule->Name &&
1801         ActiveModule->Name != Canonical) {
1802       Diags.Report(ActiveModule->DefinitionLoc,
1803                    diag::warn_mmap_mismatched_private_module_name)
1804           << ActiveModule->Name;
1805       GenNoteAndFixIt(ActiveModule->Name, Canonical, M,
1806                       SourceRange(ActiveModule->DefinitionLoc));
1807     }
1808   }
1809 }
1810 
1811 /// Parse a module declaration.
1812 ///
1813 ///   module-declaration:
1814 ///     'extern' 'module' module-id string-literal
1815 ///     'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt]
1816 ///       { module-member* }
1817 ///
1818 ///   module-member:
1819 ///     requires-declaration
1820 ///     header-declaration
1821 ///     submodule-declaration
1822 ///     export-declaration
1823 ///     export-as-declaration
1824 ///     link-declaration
1825 ///
1826 ///   submodule-declaration:
1827 ///     module-declaration
1828 ///     inferred-submodule-declaration
1829 void ModuleMapParser::parseModuleDecl() {
1830   assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) ||
1831          Tok.is(MMToken::FrameworkKeyword) || Tok.is(MMToken::ExternKeyword));
1832   if (Tok.is(MMToken::ExternKeyword)) {
1833     parseExternModuleDecl();
1834     return;
1835   }
1836 
1837   // Parse 'explicit' or 'framework' keyword, if present.
1838   SourceLocation ExplicitLoc;
1839   SourceLocation FrameworkLoc;
1840   bool Explicit = false;
1841   bool Framework = false;
1842 
1843   // Parse 'explicit' keyword, if present.
1844   if (Tok.is(MMToken::ExplicitKeyword)) {
1845     ExplicitLoc = consumeToken();
1846     Explicit = true;
1847   }
1848 
1849   // Parse 'framework' keyword, if present.
1850   if (Tok.is(MMToken::FrameworkKeyword)) {
1851     FrameworkLoc = consumeToken();
1852     Framework = true;
1853   }
1854 
1855   // Parse 'module' keyword.
1856   if (!Tok.is(MMToken::ModuleKeyword)) {
1857     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1858     consumeToken();
1859     HadError = true;
1860     return;
1861   }
1862   CurrModuleDeclLoc = consumeToken(); // 'module' keyword
1863 
1864   // If we have a wildcard for the module name, this is an inferred submodule.
1865   // Parse it.
1866   if (Tok.is(MMToken::Star))
1867     return parseInferredModuleDecl(Framework, Explicit);
1868 
1869   // Parse the module name.
1870   ModuleId Id;
1871   if (parseModuleId(Id)) {
1872     HadError = true;
1873     return;
1874   }
1875 
1876   if (ActiveModule) {
1877     if (Id.size() > 1) {
1878       Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id)
1879         << SourceRange(Id.front().second, Id.back().second);
1880 
1881       HadError = true;
1882       return;
1883     }
1884   } else if (Id.size() == 1 && Explicit) {
1885     // Top-level modules can't be explicit.
1886     Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level);
1887     Explicit = false;
1888     ExplicitLoc = SourceLocation();
1889     HadError = true;
1890   }
1891 
1892   Module *PreviousActiveModule = ActiveModule;
1893   if (Id.size() > 1) {
1894     // This module map defines a submodule. Go find the module of which it
1895     // is a submodule.
1896     ActiveModule = nullptr;
1897     const Module *TopLevelModule = nullptr;
1898     for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) {
1899       if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) {
1900         if (I == 0)
1901           TopLevelModule = Next;
1902         ActiveModule = Next;
1903         continue;
1904       }
1905 
1906       if (ActiveModule) {
1907         Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified)
1908           << Id[I].first
1909           << ActiveModule->getTopLevelModule()->getFullModuleName();
1910       } else {
1911         Diags.Report(Id[I].second, diag::err_mmap_expected_module_name);
1912       }
1913       HadError = true;
1914       return;
1915     }
1916 
1917     if (ModuleMapFile != Map.getContainingModuleMapFile(TopLevelModule)) {
1918       assert(ModuleMapFile != Map.getModuleMapFileForUniquing(TopLevelModule) &&
1919              "submodule defined in same file as 'module *' that allowed its "
1920              "top-level module");
1921       Map.addAdditionalModuleMapFile(TopLevelModule, ModuleMapFile);
1922     }
1923   }
1924 
1925   StringRef ModuleName = Id.back().first;
1926   SourceLocation ModuleNameLoc = Id.back().second;
1927 
1928   // Parse the optional attribute list.
1929   Attributes Attrs;
1930   if (parseOptionalAttributes(Attrs))
1931     return;
1932 
1933   // Parse the opening brace.
1934   if (!Tok.is(MMToken::LBrace)) {
1935     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace)
1936       << ModuleName;
1937     HadError = true;
1938     return;
1939   }
1940   SourceLocation LBraceLoc = consumeToken();
1941 
1942   // Determine whether this (sub)module has already been defined.
1943   Module *ShadowingModule = nullptr;
1944   if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) {
1945     // We might see a (re)definition of a module that we already have a
1946     // definition for in two cases:
1947     //  - If we loaded one definition from an AST file and we've just found a
1948     //    corresponding definition in a module map file, or
1949     bool LoadedFromASTFile = Existing->DefinitionLoc.isInvalid();
1950     //  - If we're building a (preprocessed) module and we've just loaded the
1951     //    module map file from which it was created.
1952     bool ParsedAsMainInput =
1953         Map.LangOpts.getCompilingModule() == LangOptions::CMK_ModuleMap &&
1954         Map.LangOpts.CurrentModule == ModuleName &&
1955         SourceMgr.getDecomposedLoc(ModuleNameLoc).first !=
1956             SourceMgr.getDecomposedLoc(Existing->DefinitionLoc).first;
1957     if (!ActiveModule && (LoadedFromASTFile || ParsedAsMainInput)) {
1958       // Skip the module definition.
1959       skipUntil(MMToken::RBrace);
1960       if (Tok.is(MMToken::RBrace))
1961         consumeToken();
1962       else {
1963         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1964         Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1965         HadError = true;
1966       }
1967       return;
1968     }
1969 
1970     if (!Existing->Parent && Map.mayShadowNewModule(Existing)) {
1971       ShadowingModule = Existing;
1972     } else {
1973       // This is not a shawdowed module decl, it is an illegal redefinition.
1974       Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition)
1975           << ModuleName;
1976       Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition);
1977 
1978       // Skip the module definition.
1979       skipUntil(MMToken::RBrace);
1980       if (Tok.is(MMToken::RBrace))
1981         consumeToken();
1982 
1983       HadError = true;
1984       return;
1985     }
1986   }
1987 
1988   // Start defining this module.
1989   if (ShadowingModule) {
1990     ActiveModule =
1991         Map.createShadowedModule(ModuleName, Framework, ShadowingModule);
1992   } else {
1993     ActiveModule =
1994         Map.findOrCreateModule(ModuleName, ActiveModule, Framework, Explicit)
1995             .first;
1996   }
1997 
1998   ActiveModule->DefinitionLoc = ModuleNameLoc;
1999   if (Attrs.IsSystem || IsSystem)
2000     ActiveModule->IsSystem = true;
2001   if (Attrs.IsExternC)
2002     ActiveModule->IsExternC = true;
2003   if (Attrs.NoUndeclaredIncludes ||
2004       (!ActiveModule->Parent && ModuleName == "Darwin"))
2005     ActiveModule->NoUndeclaredIncludes = true;
2006   ActiveModule->Directory = Directory;
2007 
2008   StringRef MapFileName(ModuleMapFile->getName());
2009   if (MapFileName.endswith("module.private.modulemap") ||
2010       MapFileName.endswith("module_private.map")) {
2011     ActiveModule->ModuleMapIsPrivate = true;
2012   }
2013 
2014   // Private modules named as FooPrivate, Foo.Private or similar are likely a
2015   // user error; provide warnings, notes and fixits to direct users to use
2016   // Foo_Private instead.
2017   SourceLocation StartLoc =
2018       SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID());
2019   if (Map.HeaderInfo.getHeaderSearchOpts().ImplicitModuleMaps &&
2020       !Diags.isIgnored(diag::warn_mmap_mismatched_private_submodule,
2021                        StartLoc) &&
2022       !Diags.isIgnored(diag::warn_mmap_mismatched_private_module_name,
2023                        StartLoc) &&
2024       ActiveModule->ModuleMapIsPrivate)
2025     diagnosePrivateModules(ExplicitLoc, FrameworkLoc);
2026 
2027   bool Done = false;
2028   do {
2029     switch (Tok.Kind) {
2030     case MMToken::EndOfFile:
2031     case MMToken::RBrace:
2032       Done = true;
2033       break;
2034 
2035     case MMToken::ConfigMacros:
2036       parseConfigMacros();
2037       break;
2038 
2039     case MMToken::Conflict:
2040       parseConflict();
2041       break;
2042 
2043     case MMToken::ExplicitKeyword:
2044     case MMToken::ExternKeyword:
2045     case MMToken::FrameworkKeyword:
2046     case MMToken::ModuleKeyword:
2047       parseModuleDecl();
2048       break;
2049 
2050     case MMToken::ExportKeyword:
2051       parseExportDecl();
2052       break;
2053 
2054     case MMToken::ExportAsKeyword:
2055       parseExportAsDecl();
2056       break;
2057 
2058     case MMToken::UseKeyword:
2059       parseUseDecl();
2060       break;
2061 
2062     case MMToken::RequiresKeyword:
2063       parseRequiresDecl();
2064       break;
2065 
2066     case MMToken::TextualKeyword:
2067       parseHeaderDecl(MMToken::TextualKeyword, consumeToken());
2068       break;
2069 
2070     case MMToken::UmbrellaKeyword: {
2071       SourceLocation UmbrellaLoc = consumeToken();
2072       if (Tok.is(MMToken::HeaderKeyword))
2073         parseHeaderDecl(MMToken::UmbrellaKeyword, UmbrellaLoc);
2074       else
2075         parseUmbrellaDirDecl(UmbrellaLoc);
2076       break;
2077     }
2078 
2079     case MMToken::ExcludeKeyword:
2080       parseHeaderDecl(MMToken::ExcludeKeyword, consumeToken());
2081       break;
2082 
2083     case MMToken::PrivateKeyword:
2084       parseHeaderDecl(MMToken::PrivateKeyword, consumeToken());
2085       break;
2086 
2087     case MMToken::HeaderKeyword:
2088       parseHeaderDecl(MMToken::HeaderKeyword, consumeToken());
2089       break;
2090 
2091     case MMToken::LinkKeyword:
2092       parseLinkDecl();
2093       break;
2094 
2095     default:
2096       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member);
2097       consumeToken();
2098       break;
2099     }
2100   } while (!Done);
2101 
2102   if (Tok.is(MMToken::RBrace))
2103     consumeToken();
2104   else {
2105     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
2106     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
2107     HadError = true;
2108   }
2109 
2110   // If the active module is a top-level framework, and there are no link
2111   // libraries, automatically link against the framework.
2112   if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() &&
2113       ActiveModule->LinkLibraries.empty()) {
2114     inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager());
2115   }
2116 
2117   // If the module meets all requirements but is still unavailable, mark the
2118   // whole tree as unavailable to prevent it from building.
2119   if (!ActiveModule->IsAvailable && !ActiveModule->IsUnimportable &&
2120       ActiveModule->Parent) {
2121     ActiveModule->getTopLevelModule()->markUnavailable(/*Unimportable=*/false);
2122     ActiveModule->getTopLevelModule()->MissingHeaders.append(
2123       ActiveModule->MissingHeaders.begin(), ActiveModule->MissingHeaders.end());
2124   }
2125 
2126   // We're done parsing this module. Pop back to the previous module.
2127   ActiveModule = PreviousActiveModule;
2128 }
2129 
2130 /// Parse an extern module declaration.
2131 ///
2132 ///   extern module-declaration:
2133 ///     'extern' 'module' module-id string-literal
2134 void ModuleMapParser::parseExternModuleDecl() {
2135   assert(Tok.is(MMToken::ExternKeyword));
2136   SourceLocation ExternLoc = consumeToken(); // 'extern' keyword
2137 
2138   // Parse 'module' keyword.
2139   if (!Tok.is(MMToken::ModuleKeyword)) {
2140     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
2141     consumeToken();
2142     HadError = true;
2143     return;
2144   }
2145   consumeToken(); // 'module' keyword
2146 
2147   // Parse the module name.
2148   ModuleId Id;
2149   if (parseModuleId(Id)) {
2150     HadError = true;
2151     return;
2152   }
2153 
2154   // Parse the referenced module map file name.
2155   if (!Tok.is(MMToken::StringLiteral)) {
2156     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_mmap_file);
2157     HadError = true;
2158     return;
2159   }
2160   std::string FileName = std::string(Tok.getString());
2161   consumeToken(); // filename
2162 
2163   StringRef FileNameRef = FileName;
2164   SmallString<128> ModuleMapFileName;
2165   if (llvm::sys::path::is_relative(FileNameRef)) {
2166     ModuleMapFileName += Directory->getName();
2167     llvm::sys::path::append(ModuleMapFileName, FileName);
2168     FileNameRef = ModuleMapFileName;
2169   }
2170   if (auto File = SourceMgr.getFileManager().getFile(FileNameRef))
2171     Map.parseModuleMapFile(
2172         *File, /*IsSystem=*/false,
2173         Map.HeaderInfo.getHeaderSearchOpts().ModuleMapFileHomeIsCwd
2174             ? Directory
2175             : (*File)->getDir(),
2176         FileID(), nullptr, ExternLoc);
2177 }
2178 
2179 /// Whether to add the requirement \p Feature to the module \p M.
2180 ///
2181 /// This preserves backwards compatibility for two hacks in the Darwin system
2182 /// module map files:
2183 ///
2184 /// 1. The use of 'requires excluded' to make headers non-modular, which
2185 ///    should really be mapped to 'textual' now that we have this feature.  We
2186 ///    drop the 'excluded' requirement, and set \p IsRequiresExcludedHack to
2187 ///    true.  Later, this bit will be used to map all the headers inside this
2188 ///    module to 'textual'.
2189 ///
2190 ///    This affects Darwin.C.excluded (for assert.h) and Tcl.Private.
2191 ///
2192 /// 2. Removes a bogus cplusplus requirement from IOKit.avc.  This requirement
2193 ///    was never correct and causes issues now that we check it, so drop it.
2194 static bool shouldAddRequirement(Module *M, StringRef Feature,
2195                                  bool &IsRequiresExcludedHack) {
2196   if (Feature == "excluded" &&
2197       (M->fullModuleNameIs({"Darwin", "C", "excluded"}) ||
2198        M->fullModuleNameIs({"Tcl", "Private"}))) {
2199     IsRequiresExcludedHack = true;
2200     return false;
2201   } else if (Feature == "cplusplus" && M->fullModuleNameIs({"IOKit", "avc"})) {
2202     return false;
2203   }
2204 
2205   return true;
2206 }
2207 
2208 /// Parse a requires declaration.
2209 ///
2210 ///   requires-declaration:
2211 ///     'requires' feature-list
2212 ///
2213 ///   feature-list:
2214 ///     feature ',' feature-list
2215 ///     feature
2216 ///
2217 ///   feature:
2218 ///     '!'[opt] identifier
2219 void ModuleMapParser::parseRequiresDecl() {
2220   assert(Tok.is(MMToken::RequiresKeyword));
2221 
2222   // Parse 'requires' keyword.
2223   consumeToken();
2224 
2225   // Parse the feature-list.
2226   do {
2227     bool RequiredState = true;
2228     if (Tok.is(MMToken::Exclaim)) {
2229       RequiredState = false;
2230       consumeToken();
2231     }
2232 
2233     if (!Tok.is(MMToken::Identifier)) {
2234       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature);
2235       HadError = true;
2236       return;
2237     }
2238 
2239     // Consume the feature name.
2240     std::string Feature = std::string(Tok.getString());
2241     consumeToken();
2242 
2243     bool IsRequiresExcludedHack = false;
2244     bool ShouldAddRequirement =
2245         shouldAddRequirement(ActiveModule, Feature, IsRequiresExcludedHack);
2246 
2247     if (IsRequiresExcludedHack)
2248       UsesRequiresExcludedHack.insert(ActiveModule);
2249 
2250     if (ShouldAddRequirement) {
2251       // Add this feature.
2252       ActiveModule->addRequirement(Feature, RequiredState, Map.LangOpts,
2253                                    *Map.Target);
2254     }
2255 
2256     if (!Tok.is(MMToken::Comma))
2257       break;
2258 
2259     // Consume the comma.
2260     consumeToken();
2261   } while (true);
2262 }
2263 
2264 /// Parse a header declaration.
2265 ///
2266 ///   header-declaration:
2267 ///     'textual'[opt] 'header' string-literal
2268 ///     'private' 'textual'[opt] 'header' string-literal
2269 ///     'exclude' 'header' string-literal
2270 ///     'umbrella' 'header' string-literal
2271 ///
2272 /// FIXME: Support 'private textual header'.
2273 void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken,
2274                                       SourceLocation LeadingLoc) {
2275   // We've already consumed the first token.
2276   ModuleMap::ModuleHeaderRole Role = ModuleMap::NormalHeader;
2277   if (LeadingToken == MMToken::PrivateKeyword) {
2278     Role = ModuleMap::PrivateHeader;
2279     // 'private' may optionally be followed by 'textual'.
2280     if (Tok.is(MMToken::TextualKeyword)) {
2281       LeadingToken = Tok.Kind;
2282       consumeToken();
2283     }
2284   }
2285 
2286   if (LeadingToken == MMToken::TextualKeyword)
2287     Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader);
2288 
2289   if (UsesRequiresExcludedHack.count(ActiveModule)) {
2290     // Mark this header 'textual' (see doc comment for
2291     // Module::UsesRequiresExcludedHack).
2292     Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader);
2293   }
2294 
2295   if (LeadingToken != MMToken::HeaderKeyword) {
2296     if (!Tok.is(MMToken::HeaderKeyword)) {
2297       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
2298           << (LeadingToken == MMToken::PrivateKeyword ? "private" :
2299               LeadingToken == MMToken::ExcludeKeyword ? "exclude" :
2300               LeadingToken == MMToken::TextualKeyword ? "textual" : "umbrella");
2301       return;
2302     }
2303     consumeToken();
2304   }
2305 
2306   // Parse the header name.
2307   if (!Tok.is(MMToken::StringLiteral)) {
2308     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
2309       << "header";
2310     HadError = true;
2311     return;
2312   }
2313   Module::UnresolvedHeaderDirective Header;
2314   Header.FileName = std::string(Tok.getString());
2315   Header.FileNameLoc = consumeToken();
2316   Header.IsUmbrella = LeadingToken == MMToken::UmbrellaKeyword;
2317   Header.Kind =
2318       (LeadingToken == MMToken::ExcludeKeyword ? Module::HK_Excluded
2319                                                : Map.headerRoleToKind(Role));
2320 
2321   // Check whether we already have an umbrella.
2322   if (Header.IsUmbrella && ActiveModule->Umbrella) {
2323     Diags.Report(Header.FileNameLoc, diag::err_mmap_umbrella_clash)
2324       << ActiveModule->getFullModuleName();
2325     HadError = true;
2326     return;
2327   }
2328 
2329   // If we were given stat information, parse it so we can skip looking for
2330   // the file.
2331   if (Tok.is(MMToken::LBrace)) {
2332     SourceLocation LBraceLoc = consumeToken();
2333 
2334     while (!Tok.is(MMToken::RBrace) && !Tok.is(MMToken::EndOfFile)) {
2335       enum Attribute { Size, ModTime, Unknown };
2336       StringRef Str = Tok.getString();
2337       SourceLocation Loc = consumeToken();
2338       switch (llvm::StringSwitch<Attribute>(Str)
2339                   .Case("size", Size)
2340                   .Case("mtime", ModTime)
2341                   .Default(Unknown)) {
2342       case Size:
2343         if (Header.Size)
2344           Diags.Report(Loc, diag::err_mmap_duplicate_header_attribute) << Str;
2345         if (!Tok.is(MMToken::IntegerLiteral)) {
2346           Diags.Report(Tok.getLocation(),
2347                        diag::err_mmap_invalid_header_attribute_value) << Str;
2348           skipUntil(MMToken::RBrace);
2349           break;
2350         }
2351         Header.Size = Tok.getInteger();
2352         consumeToken();
2353         break;
2354 
2355       case ModTime:
2356         if (Header.ModTime)
2357           Diags.Report(Loc, diag::err_mmap_duplicate_header_attribute) << Str;
2358         if (!Tok.is(MMToken::IntegerLiteral)) {
2359           Diags.Report(Tok.getLocation(),
2360                        diag::err_mmap_invalid_header_attribute_value) << Str;
2361           skipUntil(MMToken::RBrace);
2362           break;
2363         }
2364         Header.ModTime = Tok.getInteger();
2365         consumeToken();
2366         break;
2367 
2368       case Unknown:
2369         Diags.Report(Loc, diag::err_mmap_expected_header_attribute);
2370         skipUntil(MMToken::RBrace);
2371         break;
2372       }
2373     }
2374 
2375     if (Tok.is(MMToken::RBrace))
2376       consumeToken();
2377     else {
2378       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
2379       Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
2380       HadError = true;
2381     }
2382   }
2383 
2384   bool NeedsFramework = false;
2385   Map.addUnresolvedHeader(ActiveModule, std::move(Header), NeedsFramework);
2386 
2387   if (NeedsFramework && ActiveModule)
2388     Diags.Report(CurrModuleDeclLoc, diag::note_mmap_add_framework_keyword)
2389       << ActiveModule->getFullModuleName()
2390       << FixItHint::CreateReplacement(CurrModuleDeclLoc, "framework module");
2391 }
2392 
2393 static int compareModuleHeaders(const Module::Header *A,
2394                                 const Module::Header *B) {
2395   return A->NameAsWritten.compare(B->NameAsWritten);
2396 }
2397 
2398 /// Parse an umbrella directory declaration.
2399 ///
2400 ///   umbrella-dir-declaration:
2401 ///     umbrella string-literal
2402 void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) {
2403   // Parse the directory name.
2404   if (!Tok.is(MMToken::StringLiteral)) {
2405     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
2406       << "umbrella";
2407     HadError = true;
2408     return;
2409   }
2410 
2411   std::string DirName = std::string(Tok.getString());
2412   SourceLocation DirNameLoc = consumeToken();
2413 
2414   // Check whether we already have an umbrella.
2415   if (ActiveModule->Umbrella) {
2416     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash)
2417       << ActiveModule->getFullModuleName();
2418     HadError = true;
2419     return;
2420   }
2421 
2422   // Look for this file.
2423   const DirectoryEntry *Dir = nullptr;
2424   if (llvm::sys::path::is_absolute(DirName)) {
2425     if (auto D = SourceMgr.getFileManager().getDirectory(DirName))
2426       Dir = *D;
2427   } else {
2428     SmallString<128> PathName;
2429     PathName = Directory->getName();
2430     llvm::sys::path::append(PathName, DirName);
2431     if (auto D = SourceMgr.getFileManager().getDirectory(PathName))
2432       Dir = *D;
2433   }
2434 
2435   if (!Dir) {
2436     Diags.Report(DirNameLoc, diag::warn_mmap_umbrella_dir_not_found)
2437       << DirName;
2438     return;
2439   }
2440 
2441   if (UsesRequiresExcludedHack.count(ActiveModule)) {
2442     // Mark this header 'textual' (see doc comment for
2443     // ModuleMapParser::UsesRequiresExcludedHack). Although iterating over the
2444     // directory is relatively expensive, in practice this only applies to the
2445     // uncommonly used Tcl module on Darwin platforms.
2446     std::error_code EC;
2447     SmallVector<Module::Header, 6> Headers;
2448     llvm::vfs::FileSystem &FS =
2449         SourceMgr.getFileManager().getVirtualFileSystem();
2450     for (llvm::vfs::recursive_directory_iterator I(FS, Dir->getName(), EC), E;
2451          I != E && !EC; I.increment(EC)) {
2452       if (auto FE = SourceMgr.getFileManager().getFile(I->path())) {
2453         Module::Header Header = {std::string(I->path()), *FE};
2454         Headers.push_back(std::move(Header));
2455       }
2456     }
2457 
2458     // Sort header paths so that the pcm doesn't depend on iteration order.
2459     llvm::array_pod_sort(Headers.begin(), Headers.end(), compareModuleHeaders);
2460 
2461     for (auto &Header : Headers)
2462       Map.addHeader(ActiveModule, std::move(Header), ModuleMap::TextualHeader);
2463     return;
2464   }
2465 
2466   if (Module *OwningModule = Map.UmbrellaDirs[Dir]) {
2467     Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
2468       << OwningModule->getFullModuleName();
2469     HadError = true;
2470     return;
2471   }
2472 
2473   // Record this umbrella directory.
2474   Map.setUmbrellaDir(ActiveModule, Dir, DirName);
2475 }
2476 
2477 /// Parse a module export declaration.
2478 ///
2479 ///   export-declaration:
2480 ///     'export' wildcard-module-id
2481 ///
2482 ///   wildcard-module-id:
2483 ///     identifier
2484 ///     '*'
2485 ///     identifier '.' wildcard-module-id
2486 void ModuleMapParser::parseExportDecl() {
2487   assert(Tok.is(MMToken::ExportKeyword));
2488   SourceLocation ExportLoc = consumeToken();
2489 
2490   // Parse the module-id with an optional wildcard at the end.
2491   ModuleId ParsedModuleId;
2492   bool Wildcard = false;
2493   do {
2494     // FIXME: Support string-literal module names here.
2495     if (Tok.is(MMToken::Identifier)) {
2496       ParsedModuleId.push_back(
2497           std::make_pair(std::string(Tok.getString()), Tok.getLocation()));
2498       consumeToken();
2499 
2500       if (Tok.is(MMToken::Period)) {
2501         consumeToken();
2502         continue;
2503       }
2504 
2505       break;
2506     }
2507 
2508     if(Tok.is(MMToken::Star)) {
2509       Wildcard = true;
2510       consumeToken();
2511       break;
2512     }
2513 
2514     Diags.Report(Tok.getLocation(), diag::err_mmap_module_id);
2515     HadError = true;
2516     return;
2517   } while (true);
2518 
2519   Module::UnresolvedExportDecl Unresolved = {
2520     ExportLoc, ParsedModuleId, Wildcard
2521   };
2522   ActiveModule->UnresolvedExports.push_back(Unresolved);
2523 }
2524 
2525 /// Parse a module export_as declaration.
2526 ///
2527 ///   export-as-declaration:
2528 ///     'export_as' identifier
2529 void ModuleMapParser::parseExportAsDecl() {
2530   assert(Tok.is(MMToken::ExportAsKeyword));
2531   consumeToken();
2532 
2533   if (!Tok.is(MMToken::Identifier)) {
2534     Diags.Report(Tok.getLocation(), diag::err_mmap_module_id);
2535     HadError = true;
2536     return;
2537   }
2538 
2539   if (ActiveModule->Parent) {
2540     Diags.Report(Tok.getLocation(), diag::err_mmap_submodule_export_as);
2541     consumeToken();
2542     return;
2543   }
2544 
2545   if (!ActiveModule->ExportAsModule.empty()) {
2546     if (ActiveModule->ExportAsModule == Tok.getString()) {
2547       Diags.Report(Tok.getLocation(), diag::warn_mmap_redundant_export_as)
2548         << ActiveModule->Name << Tok.getString();
2549     } else {
2550       Diags.Report(Tok.getLocation(), diag::err_mmap_conflicting_export_as)
2551         << ActiveModule->Name << ActiveModule->ExportAsModule
2552         << Tok.getString();
2553     }
2554   }
2555 
2556   ActiveModule->ExportAsModule = std::string(Tok.getString());
2557   Map.addLinkAsDependency(ActiveModule);
2558 
2559   consumeToken();
2560 }
2561 
2562 /// Parse a module use declaration.
2563 ///
2564 ///   use-declaration:
2565 ///     'use' wildcard-module-id
2566 void ModuleMapParser::parseUseDecl() {
2567   assert(Tok.is(MMToken::UseKeyword));
2568   auto KWLoc = consumeToken();
2569   // Parse the module-id.
2570   ModuleId ParsedModuleId;
2571   parseModuleId(ParsedModuleId);
2572 
2573   if (ActiveModule->Parent)
2574     Diags.Report(KWLoc, diag::err_mmap_use_decl_submodule);
2575   else
2576     ActiveModule->UnresolvedDirectUses.push_back(ParsedModuleId);
2577 }
2578 
2579 /// Parse a link declaration.
2580 ///
2581 ///   module-declaration:
2582 ///     'link' 'framework'[opt] string-literal
2583 void ModuleMapParser::parseLinkDecl() {
2584   assert(Tok.is(MMToken::LinkKeyword));
2585   SourceLocation LinkLoc = consumeToken();
2586 
2587   // Parse the optional 'framework' keyword.
2588   bool IsFramework = false;
2589   if (Tok.is(MMToken::FrameworkKeyword)) {
2590     consumeToken();
2591     IsFramework = true;
2592   }
2593 
2594   // Parse the library name
2595   if (!Tok.is(MMToken::StringLiteral)) {
2596     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_library_name)
2597       << IsFramework << SourceRange(LinkLoc);
2598     HadError = true;
2599     return;
2600   }
2601 
2602   std::string LibraryName = std::string(Tok.getString());
2603   consumeToken();
2604   ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName,
2605                                                             IsFramework));
2606 }
2607 
2608 /// Parse a configuration macro declaration.
2609 ///
2610 ///   module-declaration:
2611 ///     'config_macros' attributes[opt] config-macro-list?
2612 ///
2613 ///   config-macro-list:
2614 ///     identifier (',' identifier)?
2615 void ModuleMapParser::parseConfigMacros() {
2616   assert(Tok.is(MMToken::ConfigMacros));
2617   SourceLocation ConfigMacrosLoc = consumeToken();
2618 
2619   // Only top-level modules can have configuration macros.
2620   if (ActiveModule->Parent) {
2621     Diags.Report(ConfigMacrosLoc, diag::err_mmap_config_macro_submodule);
2622   }
2623 
2624   // Parse the optional attributes.
2625   Attributes Attrs;
2626   if (parseOptionalAttributes(Attrs))
2627     return;
2628 
2629   if (Attrs.IsExhaustive && !ActiveModule->Parent) {
2630     ActiveModule->ConfigMacrosExhaustive = true;
2631   }
2632 
2633   // If we don't have an identifier, we're done.
2634   // FIXME: Support macros with the same name as a keyword here.
2635   if (!Tok.is(MMToken::Identifier))
2636     return;
2637 
2638   // Consume the first identifier.
2639   if (!ActiveModule->Parent) {
2640     ActiveModule->ConfigMacros.push_back(Tok.getString().str());
2641   }
2642   consumeToken();
2643 
2644   do {
2645     // If there's a comma, consume it.
2646     if (!Tok.is(MMToken::Comma))
2647       break;
2648     consumeToken();
2649 
2650     // We expect to see a macro name here.
2651     // FIXME: Support macros with the same name as a keyword here.
2652     if (!Tok.is(MMToken::Identifier)) {
2653       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_config_macro);
2654       break;
2655     }
2656 
2657     // Consume the macro name.
2658     if (!ActiveModule->Parent) {
2659       ActiveModule->ConfigMacros.push_back(Tok.getString().str());
2660     }
2661     consumeToken();
2662   } while (true);
2663 }
2664 
2665 /// Format a module-id into a string.
2666 static std::string formatModuleId(const ModuleId &Id) {
2667   std::string result;
2668   {
2669     llvm::raw_string_ostream OS(result);
2670 
2671     for (unsigned I = 0, N = Id.size(); I != N; ++I) {
2672       if (I)
2673         OS << ".";
2674       OS << Id[I].first;
2675     }
2676   }
2677 
2678   return result;
2679 }
2680 
2681 /// Parse a conflict declaration.
2682 ///
2683 ///   module-declaration:
2684 ///     'conflict' module-id ',' string-literal
2685 void ModuleMapParser::parseConflict() {
2686   assert(Tok.is(MMToken::Conflict));
2687   SourceLocation ConflictLoc = consumeToken();
2688   Module::UnresolvedConflict Conflict;
2689 
2690   // Parse the module-id.
2691   if (parseModuleId(Conflict.Id))
2692     return;
2693 
2694   // Parse the ','.
2695   if (!Tok.is(MMToken::Comma)) {
2696     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_comma)
2697       << SourceRange(ConflictLoc);
2698     return;
2699   }
2700   consumeToken();
2701 
2702   // Parse the message.
2703   if (!Tok.is(MMToken::StringLiteral)) {
2704     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_message)
2705       << formatModuleId(Conflict.Id);
2706     return;
2707   }
2708   Conflict.Message = Tok.getString().str();
2709   consumeToken();
2710 
2711   // Add this unresolved conflict.
2712   ActiveModule->UnresolvedConflicts.push_back(Conflict);
2713 }
2714 
2715 /// Parse an inferred module declaration (wildcard modules).
2716 ///
2717 ///   module-declaration:
2718 ///     'explicit'[opt] 'framework'[opt] 'module' * attributes[opt]
2719 ///       { inferred-module-member* }
2720 ///
2721 ///   inferred-module-member:
2722 ///     'export' '*'
2723 ///     'exclude' identifier
2724 void ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) {
2725   assert(Tok.is(MMToken::Star));
2726   SourceLocation StarLoc = consumeToken();
2727   bool Failed = false;
2728 
2729   // Inferred modules must be submodules.
2730   if (!ActiveModule && !Framework) {
2731     Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule);
2732     Failed = true;
2733   }
2734 
2735   if (ActiveModule) {
2736     // Inferred modules must have umbrella directories.
2737     if (!Failed && ActiveModule->IsAvailable &&
2738         !ActiveModule->getUmbrellaDir()) {
2739       Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
2740       Failed = true;
2741     }
2742 
2743     // Check for redefinition of an inferred module.
2744     if (!Failed && ActiveModule->InferSubmodules) {
2745       Diags.Report(StarLoc, diag::err_mmap_inferred_redef);
2746       if (ActiveModule->InferredSubmoduleLoc.isValid())
2747         Diags.Report(ActiveModule->InferredSubmoduleLoc,
2748                      diag::note_mmap_prev_definition);
2749       Failed = true;
2750     }
2751 
2752     // Check for the 'framework' keyword, which is not permitted here.
2753     if (Framework) {
2754       Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule);
2755       Framework = false;
2756     }
2757   } else if (Explicit) {
2758     Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework);
2759     Explicit = false;
2760   }
2761 
2762   // If there were any problems with this inferred submodule, skip its body.
2763   if (Failed) {
2764     if (Tok.is(MMToken::LBrace)) {
2765       consumeToken();
2766       skipUntil(MMToken::RBrace);
2767       if (Tok.is(MMToken::RBrace))
2768         consumeToken();
2769     }
2770     HadError = true;
2771     return;
2772   }
2773 
2774   // Parse optional attributes.
2775   Attributes Attrs;
2776   if (parseOptionalAttributes(Attrs))
2777     return;
2778 
2779   if (ActiveModule) {
2780     // Note that we have an inferred submodule.
2781     ActiveModule->InferSubmodules = true;
2782     ActiveModule->InferredSubmoduleLoc = StarLoc;
2783     ActiveModule->InferExplicitSubmodules = Explicit;
2784   } else {
2785     // We'll be inferring framework modules for this directory.
2786     Map.InferredDirectories[Directory].InferModules = true;
2787     Map.InferredDirectories[Directory].Attrs = Attrs;
2788     Map.InferredDirectories[Directory].ModuleMapFile = ModuleMapFile;
2789     // FIXME: Handle the 'framework' keyword.
2790   }
2791 
2792   // Parse the opening brace.
2793   if (!Tok.is(MMToken::LBrace)) {
2794     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard);
2795     HadError = true;
2796     return;
2797   }
2798   SourceLocation LBraceLoc = consumeToken();
2799 
2800   // Parse the body of the inferred submodule.
2801   bool Done = false;
2802   do {
2803     switch (Tok.Kind) {
2804     case MMToken::EndOfFile:
2805     case MMToken::RBrace:
2806       Done = true;
2807       break;
2808 
2809     case MMToken::ExcludeKeyword:
2810       if (ActiveModule) {
2811         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2812           << (ActiveModule != nullptr);
2813         consumeToken();
2814         break;
2815       }
2816 
2817       consumeToken();
2818       // FIXME: Support string-literal module names here.
2819       if (!Tok.is(MMToken::Identifier)) {
2820         Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name);
2821         break;
2822       }
2823 
2824       Map.InferredDirectories[Directory].ExcludedModules.push_back(
2825           std::string(Tok.getString()));
2826       consumeToken();
2827       break;
2828 
2829     case MMToken::ExportKeyword:
2830       if (!ActiveModule) {
2831         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2832           << (ActiveModule != nullptr);
2833         consumeToken();
2834         break;
2835       }
2836 
2837       consumeToken();
2838       if (Tok.is(MMToken::Star))
2839         ActiveModule->InferExportWildcard = true;
2840       else
2841         Diags.Report(Tok.getLocation(),
2842                      diag::err_mmap_expected_export_wildcard);
2843       consumeToken();
2844       break;
2845 
2846     case MMToken::ExplicitKeyword:
2847     case MMToken::ModuleKeyword:
2848     case MMToken::HeaderKeyword:
2849     case MMToken::PrivateKeyword:
2850     case MMToken::UmbrellaKeyword:
2851     default:
2852       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2853           << (ActiveModule != nullptr);
2854       consumeToken();
2855       break;
2856     }
2857   } while (!Done);
2858 
2859   if (Tok.is(MMToken::RBrace))
2860     consumeToken();
2861   else {
2862     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
2863     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
2864     HadError = true;
2865   }
2866 }
2867 
2868 /// Parse optional attributes.
2869 ///
2870 ///   attributes:
2871 ///     attribute attributes
2872 ///     attribute
2873 ///
2874 ///   attribute:
2875 ///     [ identifier ]
2876 ///
2877 /// \param Attrs Will be filled in with the parsed attributes.
2878 ///
2879 /// \returns true if an error occurred, false otherwise.
2880 bool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) {
2881   bool HadError = false;
2882 
2883   while (Tok.is(MMToken::LSquare)) {
2884     // Consume the '['.
2885     SourceLocation LSquareLoc = consumeToken();
2886 
2887     // Check whether we have an attribute name here.
2888     if (!Tok.is(MMToken::Identifier)) {
2889       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute);
2890       skipUntil(MMToken::RSquare);
2891       if (Tok.is(MMToken::RSquare))
2892         consumeToken();
2893       HadError = true;
2894     }
2895 
2896     // Decode the attribute name.
2897     AttributeKind Attribute
2898       = llvm::StringSwitch<AttributeKind>(Tok.getString())
2899           .Case("exhaustive", AT_exhaustive)
2900           .Case("extern_c", AT_extern_c)
2901           .Case("no_undeclared_includes", AT_no_undeclared_includes)
2902           .Case("system", AT_system)
2903           .Default(AT_unknown);
2904     switch (Attribute) {
2905     case AT_unknown:
2906       Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute)
2907         << Tok.getString();
2908       break;
2909 
2910     case AT_system:
2911       Attrs.IsSystem = true;
2912       break;
2913 
2914     case AT_extern_c:
2915       Attrs.IsExternC = true;
2916       break;
2917 
2918     case AT_exhaustive:
2919       Attrs.IsExhaustive = true;
2920       break;
2921 
2922     case AT_no_undeclared_includes:
2923       Attrs.NoUndeclaredIncludes = true;
2924       break;
2925     }
2926     consumeToken();
2927 
2928     // Consume the ']'.
2929     if (!Tok.is(MMToken::RSquare)) {
2930       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare);
2931       Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match);
2932       skipUntil(MMToken::RSquare);
2933       HadError = true;
2934     }
2935 
2936     if (Tok.is(MMToken::RSquare))
2937       consumeToken();
2938   }
2939 
2940   return HadError;
2941 }
2942 
2943 /// Parse a module map file.
2944 ///
2945 ///   module-map-file:
2946 ///     module-declaration*
2947 bool ModuleMapParser::parseModuleMapFile() {
2948   do {
2949     switch (Tok.Kind) {
2950     case MMToken::EndOfFile:
2951       return HadError;
2952 
2953     case MMToken::ExplicitKeyword:
2954     case MMToken::ExternKeyword:
2955     case MMToken::ModuleKeyword:
2956     case MMToken::FrameworkKeyword:
2957       parseModuleDecl();
2958       break;
2959 
2960     case MMToken::Comma:
2961     case MMToken::ConfigMacros:
2962     case MMToken::Conflict:
2963     case MMToken::Exclaim:
2964     case MMToken::ExcludeKeyword:
2965     case MMToken::ExportKeyword:
2966     case MMToken::ExportAsKeyword:
2967     case MMToken::HeaderKeyword:
2968     case MMToken::Identifier:
2969     case MMToken::LBrace:
2970     case MMToken::LinkKeyword:
2971     case MMToken::LSquare:
2972     case MMToken::Period:
2973     case MMToken::PrivateKeyword:
2974     case MMToken::RBrace:
2975     case MMToken::RSquare:
2976     case MMToken::RequiresKeyword:
2977     case MMToken::Star:
2978     case MMToken::StringLiteral:
2979     case MMToken::IntegerLiteral:
2980     case MMToken::TextualKeyword:
2981     case MMToken::UmbrellaKeyword:
2982     case MMToken::UseKeyword:
2983       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
2984       HadError = true;
2985       consumeToken();
2986       break;
2987     }
2988   } while (true);
2989 }
2990 
2991 bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem,
2992                                    const DirectoryEntry *Dir, FileID ID,
2993                                    unsigned *Offset,
2994                                    SourceLocation ExternModuleLoc) {
2995   assert(Target && "Missing target information");
2996   llvm::DenseMap<const FileEntry *, bool>::iterator Known
2997     = ParsedModuleMap.find(File);
2998   if (Known != ParsedModuleMap.end())
2999     return Known->second;
3000 
3001   // If the module map file wasn't already entered, do so now.
3002   if (ID.isInvalid()) {
3003     auto FileCharacter =
3004         IsSystem ? SrcMgr::C_System_ModuleMap : SrcMgr::C_User_ModuleMap;
3005     ID = SourceMgr.createFileID(File, ExternModuleLoc, FileCharacter);
3006   }
3007 
3008   assert(Target && "Missing target information");
3009   const llvm::MemoryBuffer *Buffer = SourceMgr.getBuffer(ID);
3010   if (!Buffer)
3011     return ParsedModuleMap[File] = true;
3012   assert((!Offset || *Offset <= Buffer->getBufferSize()) &&
3013          "invalid buffer offset");
3014 
3015   // Parse this module map file.
3016   Lexer L(SourceMgr.getLocForStartOfFile(ID), MMapLangOpts,
3017           Buffer->getBufferStart(),
3018           Buffer->getBufferStart() + (Offset ? *Offset : 0),
3019           Buffer->getBufferEnd());
3020   SourceLocation Start = L.getSourceLocation();
3021   ModuleMapParser Parser(L, SourceMgr, Target, Diags, *this, File, Dir,
3022                          IsSystem);
3023   bool Result = Parser.parseModuleMapFile();
3024   ParsedModuleMap[File] = Result;
3025 
3026   if (Offset) {
3027     auto Loc = SourceMgr.getDecomposedLoc(Parser.getLocation());
3028     assert(Loc.first == ID && "stopped in a different file?");
3029     *Offset = Loc.second;
3030   }
3031 
3032   // Notify callbacks that we parsed it.
3033   for (const auto &Cb : Callbacks)
3034     Cb->moduleMapFileRead(Start, *File, IsSystem);
3035 
3036   return Result;
3037 }
3038