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