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