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   MMapLangOpts.ModularCodegen = LangOpts.ModularCodegen;
95 }
96 
97 ModuleMap::~ModuleMap() {
98   for (auto &M : Modules)
99     delete M.getValue();
100 }
101 
102 void ModuleMap::setTarget(const TargetInfo &Target) {
103   assert((!this->Target || this->Target == &Target) &&
104          "Improper target override");
105   this->Target = &Target;
106 }
107 
108 /// \brief "Sanitize" a filename so that it can be used as an identifier.
109 static StringRef sanitizeFilenameAsIdentifier(StringRef Name,
110                                               SmallVectorImpl<char> &Buffer) {
111   if (Name.empty())
112     return Name;
113 
114   if (!isValidIdentifier(Name)) {
115     // If we don't already have something with the form of an identifier,
116     // create a buffer with the sanitized name.
117     Buffer.clear();
118     if (isDigit(Name[0]))
119       Buffer.push_back('_');
120     Buffer.reserve(Buffer.size() + Name.size());
121     for (unsigned I = 0, N = Name.size(); I != N; ++I) {
122       if (isIdentifierBody(Name[I]))
123         Buffer.push_back(Name[I]);
124       else
125         Buffer.push_back('_');
126     }
127 
128     Name = StringRef(Buffer.data(), Buffer.size());
129   }
130 
131   while (llvm::StringSwitch<bool>(Name)
132 #define KEYWORD(Keyword,Conditions) .Case(#Keyword, true)
133 #define ALIAS(Keyword, AliasOf, Conditions) .Case(Keyword, true)
134 #include "clang/Basic/TokenKinds.def"
135            .Default(false)) {
136     if (Name.data() != Buffer.data())
137       Buffer.append(Name.begin(), Name.end());
138     Buffer.push_back('_');
139     Name = StringRef(Buffer.data(), Buffer.size());
140   }
141 
142   return Name;
143 }
144 
145 /// \brief Determine whether the given file name is the name of a builtin
146 /// header, supplied by Clang to replace, override, or augment existing system
147 /// headers.
148 bool ModuleMap::isBuiltinHeader(StringRef FileName) {
149   return llvm::StringSwitch<bool>(FileName)
150            .Case("float.h", true)
151            .Case("iso646.h", true)
152            .Case("limits.h", true)
153            .Case("stdalign.h", true)
154            .Case("stdarg.h", true)
155            .Case("stdatomic.h", true)
156            .Case("stdbool.h", true)
157            .Case("stddef.h", true)
158            .Case("stdint.h", true)
159            .Case("tgmath.h", true)
160            .Case("unwind.h", true)
161            .Default(false);
162 }
163 
164 ModuleMap::HeadersMap::iterator
165 ModuleMap::findKnownHeader(const FileEntry *File) {
166   HeadersMap::iterator Known = Headers.find(File);
167   if (HeaderInfo.getHeaderSearchOpts().ImplicitModuleMaps &&
168       Known == Headers.end() && File->getDir() == BuiltinIncludeDir &&
169       ModuleMap::isBuiltinHeader(llvm::sys::path::filename(File->getName()))) {
170     HeaderInfo.loadTopLevelSystemModules();
171     return Headers.find(File);
172   }
173   return Known;
174 }
175 
176 ModuleMap::KnownHeader
177 ModuleMap::findHeaderInUmbrellaDirs(const FileEntry *File,
178                     SmallVectorImpl<const DirectoryEntry *> &IntermediateDirs) {
179   if (UmbrellaDirs.empty())
180     return KnownHeader();
181 
182   const DirectoryEntry *Dir = File->getDir();
183   assert(Dir && "file in no directory");
184 
185   // Note: as an egregious but useful hack we use the real path here, because
186   // frameworks moving from top-level frameworks to embedded frameworks tend
187   // to be symlinked from the top-level location to the embedded location,
188   // and we need to resolve lookups as if we had found the embedded location.
189   StringRef DirName = SourceMgr.getFileManager().getCanonicalName(Dir);
190 
191   // Keep walking up the directory hierarchy, looking for a directory with
192   // an umbrella header.
193   do {
194     auto KnownDir = UmbrellaDirs.find(Dir);
195     if (KnownDir != UmbrellaDirs.end())
196       return KnownHeader(KnownDir->second, NormalHeader);
197 
198     IntermediateDirs.push_back(Dir);
199 
200     // Retrieve our parent path.
201     DirName = llvm::sys::path::parent_path(DirName);
202     if (DirName.empty())
203       break;
204 
205     // Resolve the parent path to a directory entry.
206     Dir = SourceMgr.getFileManager().getDirectory(DirName);
207   } while (Dir);
208   return KnownHeader();
209 }
210 
211 static bool violatesPrivateInclude(Module *RequestingModule,
212                                    const FileEntry *IncFileEnt,
213                                    ModuleMap::KnownHeader Header) {
214 #ifndef NDEBUG
215   if (Header.getRole() & ModuleMap::PrivateHeader) {
216     // Check for consistency between the module header role
217     // as obtained from the lookup and as obtained from the module.
218     // This check is not cheap, so enable it only for debugging.
219     bool IsPrivate = false;
220     SmallVectorImpl<Module::Header> *HeaderList[] = {
221         &Header.getModule()->Headers[Module::HK_Private],
222         &Header.getModule()->Headers[Module::HK_PrivateTextual]};
223     for (auto *Hs : HeaderList)
224       IsPrivate |=
225           std::find_if(Hs->begin(), Hs->end(), [&](const Module::Header &H) {
226             return H.Entry == IncFileEnt;
227           }) != Hs->end();
228     assert(IsPrivate && "inconsistent headers and roles");
229   }
230 #endif
231   return !Header.isAccessibleFrom(RequestingModule);
232 }
233 
234 static Module *getTopLevelOrNull(Module *M) {
235   return M ? M->getTopLevelModule() : nullptr;
236 }
237 
238 void ModuleMap::diagnoseHeaderInclusion(Module *RequestingModule,
239                                         bool RequestingModuleIsModuleInterface,
240                                         SourceLocation FilenameLoc,
241                                         StringRef Filename,
242                                         const FileEntry *File) {
243   // No errors for indirect modules. This may be a bit of a problem for modules
244   // with no source files.
245   if (getTopLevelOrNull(RequestingModule) != getTopLevelOrNull(SourceModule))
246     return;
247 
248   if (RequestingModule)
249     resolveUses(RequestingModule, /*Complain=*/false);
250 
251   bool Excluded = false;
252   Module *Private = nullptr;
253   Module *NotUsed = nullptr;
254 
255   HeadersMap::iterator Known = findKnownHeader(File);
256   if (Known != Headers.end()) {
257     for (const KnownHeader &Header : Known->second) {
258       // Remember private headers for later printing of a diagnostic.
259       if (violatesPrivateInclude(RequestingModule, File, Header)) {
260         Private = Header.getModule();
261         continue;
262       }
263 
264       // If uses need to be specified explicitly, we are only allowed to return
265       // modules that are explicitly used by the requesting module.
266       if (RequestingModule && LangOpts.ModulesDeclUse &&
267           !RequestingModule->directlyUses(Header.getModule())) {
268         NotUsed = Header.getModule();
269         continue;
270       }
271 
272       // We have found a module that we can happily use.
273       return;
274     }
275 
276     Excluded = true;
277   }
278 
279   // We have found a header, but it is private.
280   if (Private) {
281     Diags.Report(FilenameLoc, diag::warn_use_of_private_header_outside_module)
282         << Filename;
283     return;
284   }
285 
286   // We have found a module, but we don't use it.
287   if (NotUsed) {
288     Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module)
289         << RequestingModule->getFullModuleName() << Filename;
290     return;
291   }
292 
293   if (Excluded || isHeaderInUmbrellaDirs(File))
294     return;
295 
296   // At this point, only non-modular includes remain.
297 
298   if (LangOpts.ModulesStrictDeclUse) {
299     Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module)
300         << RequestingModule->getFullModuleName() << Filename;
301   } else if (RequestingModule && RequestingModuleIsModuleInterface &&
302              LangOpts.isCompilingModule()) {
303     // Do not diagnose when we are not compiling a module.
304     diag::kind DiagID = RequestingModule->getTopLevelModule()->IsFramework ?
305         diag::warn_non_modular_include_in_framework_module :
306         diag::warn_non_modular_include_in_module;
307     Diags.Report(FilenameLoc, DiagID) << RequestingModule->getFullModuleName()
308         << File->getName();
309   }
310 }
311 
312 static bool isBetterKnownHeader(const ModuleMap::KnownHeader &New,
313                                 const ModuleMap::KnownHeader &Old) {
314   // Prefer available modules.
315   if (New.getModule()->isAvailable() && !Old.getModule()->isAvailable())
316     return true;
317 
318   // Prefer a public header over a private header.
319   if ((New.getRole() & ModuleMap::PrivateHeader) !=
320       (Old.getRole() & ModuleMap::PrivateHeader))
321     return !(New.getRole() & ModuleMap::PrivateHeader);
322 
323   // Prefer a non-textual header over a textual header.
324   if ((New.getRole() & ModuleMap::TextualHeader) !=
325       (Old.getRole() & ModuleMap::TextualHeader))
326     return !(New.getRole() & ModuleMap::TextualHeader);
327 
328   // Don't have a reason to choose between these. Just keep the first one.
329   return false;
330 }
331 
332 ModuleMap::KnownHeader ModuleMap::findModuleForHeader(const FileEntry *File,
333                                                       bool AllowTextual) {
334   auto MakeResult = [&](ModuleMap::KnownHeader R) -> ModuleMap::KnownHeader {
335     if (!AllowTextual && R.getRole() & ModuleMap::TextualHeader)
336       return ModuleMap::KnownHeader();
337     return R;
338   };
339 
340   HeadersMap::iterator Known = findKnownHeader(File);
341   if (Known != Headers.end()) {
342     ModuleMap::KnownHeader Result;
343     // Iterate over all modules that 'File' is part of to find the best fit.
344     for (KnownHeader &H : Known->second) {
345       // Prefer a header from the source module over all others.
346       if (H.getModule()->getTopLevelModule() == SourceModule)
347         return MakeResult(H);
348       if (!Result || isBetterKnownHeader(H, Result))
349         Result = H;
350     }
351     return MakeResult(Result);
352   }
353 
354   return MakeResult(findOrCreateModuleForHeaderInUmbrellaDir(File));
355 }
356 
357 ModuleMap::KnownHeader
358 ModuleMap::findOrCreateModuleForHeaderInUmbrellaDir(const FileEntry *File) {
359   assert(!Headers.count(File) && "already have a module for this header");
360 
361   SmallVector<const DirectoryEntry *, 2> SkippedDirs;
362   KnownHeader H = findHeaderInUmbrellaDirs(File, SkippedDirs);
363   if (H) {
364     Module *Result = H.getModule();
365 
366     // Search up the module stack until we find a module with an umbrella
367     // directory.
368     Module *UmbrellaModule = Result;
369     while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
370       UmbrellaModule = UmbrellaModule->Parent;
371 
372     if (UmbrellaModule->InferSubmodules) {
373       const FileEntry *UmbrellaModuleMap =
374           getModuleMapFileForUniquing(UmbrellaModule);
375 
376       // Infer submodules for each of the directories we found between
377       // the directory of the umbrella header and the directory where
378       // the actual header is located.
379       bool Explicit = UmbrellaModule->InferExplicitSubmodules;
380 
381       for (unsigned I = SkippedDirs.size(); I != 0; --I) {
382         // Find or create the module that corresponds to this directory name.
383         SmallString<32> NameBuf;
384         StringRef Name = sanitizeFilenameAsIdentifier(
385             llvm::sys::path::stem(SkippedDirs[I-1]->getName()), NameBuf);
386         Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
387                                     Explicit).first;
388         InferredModuleAllowedBy[Result] = UmbrellaModuleMap;
389         Result->IsInferred = true;
390 
391         // Associate the module and the directory.
392         UmbrellaDirs[SkippedDirs[I-1]] = Result;
393 
394         // If inferred submodules export everything they import, add a
395         // wildcard to the set of exports.
396         if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
397           Result->Exports.push_back(Module::ExportDecl(nullptr, true));
398       }
399 
400       // Infer a submodule with the same name as this header file.
401       SmallString<32> NameBuf;
402       StringRef Name = sanitizeFilenameAsIdentifier(
403                          llvm::sys::path::stem(File->getName()), NameBuf);
404       Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
405                                   Explicit).first;
406       InferredModuleAllowedBy[Result] = UmbrellaModuleMap;
407       Result->IsInferred = true;
408       Result->addTopHeader(File);
409 
410       // If inferred submodules export everything they import, add a
411       // wildcard to the set of exports.
412       if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
413         Result->Exports.push_back(Module::ExportDecl(nullptr, true));
414     } else {
415       // Record each of the directories we stepped through as being part of
416       // the module we found, since the umbrella header covers them all.
417       for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I)
418         UmbrellaDirs[SkippedDirs[I]] = Result;
419     }
420 
421     KnownHeader Header(Result, NormalHeader);
422     Headers[File].push_back(Header);
423     return Header;
424   }
425 
426   return KnownHeader();
427 }
428 
429 ArrayRef<ModuleMap::KnownHeader>
430 ModuleMap::findAllModulesForHeader(const FileEntry *File) const {
431   auto It = Headers.find(File);
432   if (It == Headers.end())
433     return None;
434   return It->second;
435 }
436 
437 bool ModuleMap::isHeaderInUnavailableModule(const FileEntry *Header) const {
438   return isHeaderUnavailableInModule(Header, nullptr);
439 }
440 
441 bool
442 ModuleMap::isHeaderUnavailableInModule(const FileEntry *Header,
443                                        const Module *RequestingModule) const {
444   HeadersMap::const_iterator Known = Headers.find(Header);
445   if (Known != Headers.end()) {
446     for (SmallVectorImpl<KnownHeader>::const_iterator
447              I = Known->second.begin(),
448              E = Known->second.end();
449          I != E; ++I) {
450 
451       if (I->isAvailable() &&
452           (!RequestingModule ||
453            I->getModule()->isSubModuleOf(RequestingModule))) {
454         // When no requesting module is available, the caller is looking if a
455         // header is part a module by only looking into the module map. This is
456         // done by warn_uncovered_module_header checks; don't consider textual
457         // headers part of it in this mode, otherwise we get misleading warnings
458         // that a umbrella header is not including a textual header.
459         if (!RequestingModule && I->getRole() == ModuleMap::TextualHeader)
460           continue;
461         return false;
462       }
463     }
464     return true;
465   }
466 
467   const DirectoryEntry *Dir = Header->getDir();
468   SmallVector<const DirectoryEntry *, 2> SkippedDirs;
469   StringRef DirName = Dir->getName();
470 
471   auto IsUnavailable = [&](const Module *M) {
472     return !M->isAvailable() && (!RequestingModule ||
473                                  M->isSubModuleOf(RequestingModule));
474   };
475 
476   // Keep walking up the directory hierarchy, looking for a directory with
477   // an umbrella header.
478   do {
479     llvm::DenseMap<const DirectoryEntry *, Module *>::const_iterator KnownDir
480       = UmbrellaDirs.find(Dir);
481     if (KnownDir != UmbrellaDirs.end()) {
482       Module *Found = KnownDir->second;
483       if (IsUnavailable(Found))
484         return true;
485 
486       // Search up the module stack until we find a module with an umbrella
487       // directory.
488       Module *UmbrellaModule = Found;
489       while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
490         UmbrellaModule = UmbrellaModule->Parent;
491 
492       if (UmbrellaModule->InferSubmodules) {
493         for (unsigned I = SkippedDirs.size(); I != 0; --I) {
494           // Find or create the module that corresponds to this directory name.
495           SmallString<32> NameBuf;
496           StringRef Name = sanitizeFilenameAsIdentifier(
497                              llvm::sys::path::stem(SkippedDirs[I-1]->getName()),
498                              NameBuf);
499           Found = lookupModuleQualified(Name, Found);
500           if (!Found)
501             return false;
502           if (IsUnavailable(Found))
503             return true;
504         }
505 
506         // Infer a submodule with the same name as this header file.
507         SmallString<32> NameBuf;
508         StringRef Name = sanitizeFilenameAsIdentifier(
509                            llvm::sys::path::stem(Header->getName()),
510                            NameBuf);
511         Found = lookupModuleQualified(Name, Found);
512         if (!Found)
513           return false;
514       }
515 
516       return IsUnavailable(Found);
517     }
518 
519     SkippedDirs.push_back(Dir);
520 
521     // Retrieve our parent path.
522     DirName = llvm::sys::path::parent_path(DirName);
523     if (DirName.empty())
524       break;
525 
526     // Resolve the parent path to a directory entry.
527     Dir = SourceMgr.getFileManager().getDirectory(DirName);
528   } while (Dir);
529 
530   return false;
531 }
532 
533 Module *ModuleMap::findModule(StringRef Name) const {
534   llvm::StringMap<Module *>::const_iterator Known = Modules.find(Name);
535   if (Known != Modules.end())
536     return Known->getValue();
537 
538   return nullptr;
539 }
540 
541 Module *ModuleMap::lookupModuleUnqualified(StringRef Name,
542                                            Module *Context) const {
543   for(; Context; Context = Context->Parent) {
544     if (Module *Sub = lookupModuleQualified(Name, Context))
545       return Sub;
546   }
547 
548   return findModule(Name);
549 }
550 
551 Module *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) const{
552   if (!Context)
553     return findModule(Name);
554 
555   return Context->findSubmodule(Name);
556 }
557 
558 std::pair<Module *, bool> ModuleMap::findOrCreateModule(StringRef Name,
559                                                         Module *Parent,
560                                                         bool IsFramework,
561                                                         bool IsExplicit) {
562   // Try to find an existing module with this name.
563   if (Module *Sub = lookupModuleQualified(Name, Parent))
564     return std::make_pair(Sub, false);
565 
566   // Create a new module with this name.
567   Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework,
568                               IsExplicit, NumCreatedModules++);
569   if (!Parent) {
570     if (LangOpts.CurrentModule == Name)
571       SourceModule = Result;
572     Modules[Name] = Result;
573   }
574   return std::make_pair(Result, true);
575 }
576 
577 Module *ModuleMap::createModuleForInterfaceUnit(SourceLocation Loc,
578                                                 StringRef Name) {
579   assert(LangOpts.CurrentModule == Name && "module name mismatch");
580   assert(!Modules[Name] && "redefining existing module");
581 
582   auto *Result =
583       new Module(Name, Loc, nullptr, /*IsFramework*/ false,
584                  /*IsExplicit*/ false, NumCreatedModules++);
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   ActiveModule->WithCodegen = L.getLangOpts().ModularCodegen;
1505 
1506   if (!ActiveModule->Parent) {
1507     StringRef MapFileName(ModuleMapFile->getName());
1508     if (MapFileName.endswith("module.private.modulemap") ||
1509         MapFileName.endswith("module_private.map")) {
1510       // Adding a top-level module from a private modulemap is likely a
1511       // user error; we check to see if there's another top-level module
1512       // defined in the non-private map in the same dir, and if so emit a
1513       // warning.
1514       for (auto E = Map.module_begin(); E != Map.module_end(); ++E) {
1515         auto const *M = E->getValue();
1516         if (!M->Parent &&
1517             M->Directory == ActiveModule->Directory &&
1518             M->Name != ActiveModule->Name) {
1519           Diags.Report(ActiveModule->DefinitionLoc,
1520                        diag::warn_mmap_mismatched_top_level_private)
1521             << ActiveModule->Name << M->Name;
1522           // The pattern we're defending against here is typically due to
1523           // a module named FooPrivate which is supposed to be a submodule
1524           // called Foo.Private. Emit a fixit in that case.
1525           auto D =
1526             Diags.Report(ActiveModule->DefinitionLoc,
1527                          diag::note_mmap_rename_top_level_private_as_submodule);
1528           D << ActiveModule->Name << M->Name;
1529           StringRef Bad(ActiveModule->Name);
1530           if (Bad.consume_back("Private")) {
1531             SmallString<128> Fixed = Bad;
1532             Fixed.append(".Private");
1533             D << FixItHint::CreateReplacement(ActiveModule->DefinitionLoc,
1534                                               Fixed);
1535           }
1536           break;
1537         }
1538       }
1539     }
1540   }
1541 
1542   bool Done = false;
1543   do {
1544     switch (Tok.Kind) {
1545     case MMToken::EndOfFile:
1546     case MMToken::RBrace:
1547       Done = true;
1548       break;
1549 
1550     case MMToken::ConfigMacros:
1551       parseConfigMacros();
1552       break;
1553 
1554     case MMToken::Conflict:
1555       parseConflict();
1556       break;
1557 
1558     case MMToken::ExplicitKeyword:
1559     case MMToken::ExternKeyword:
1560     case MMToken::FrameworkKeyword:
1561     case MMToken::ModuleKeyword:
1562       parseModuleDecl();
1563       break;
1564 
1565     case MMToken::ExportKeyword:
1566       parseExportDecl();
1567       break;
1568 
1569     case MMToken::UseKeyword:
1570       parseUseDecl();
1571       break;
1572 
1573     case MMToken::RequiresKeyword:
1574       parseRequiresDecl();
1575       break;
1576 
1577     case MMToken::TextualKeyword:
1578       parseHeaderDecl(MMToken::TextualKeyword, consumeToken());
1579       break;
1580 
1581     case MMToken::UmbrellaKeyword: {
1582       SourceLocation UmbrellaLoc = consumeToken();
1583       if (Tok.is(MMToken::HeaderKeyword))
1584         parseHeaderDecl(MMToken::UmbrellaKeyword, UmbrellaLoc);
1585       else
1586         parseUmbrellaDirDecl(UmbrellaLoc);
1587       break;
1588     }
1589 
1590     case MMToken::ExcludeKeyword:
1591       parseHeaderDecl(MMToken::ExcludeKeyword, consumeToken());
1592       break;
1593 
1594     case MMToken::PrivateKeyword:
1595       parseHeaderDecl(MMToken::PrivateKeyword, consumeToken());
1596       break;
1597 
1598     case MMToken::HeaderKeyword:
1599       parseHeaderDecl(MMToken::HeaderKeyword, consumeToken());
1600       break;
1601 
1602     case MMToken::LinkKeyword:
1603       parseLinkDecl();
1604       break;
1605 
1606     default:
1607       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member);
1608       consumeToken();
1609       break;
1610     }
1611   } while (!Done);
1612 
1613   if (Tok.is(MMToken::RBrace))
1614     consumeToken();
1615   else {
1616     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1617     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1618     HadError = true;
1619   }
1620 
1621   // If the active module is a top-level framework, and there are no link
1622   // libraries, automatically link against the framework.
1623   if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() &&
1624       ActiveModule->LinkLibraries.empty()) {
1625     inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager());
1626   }
1627 
1628   // If the module meets all requirements but is still unavailable, mark the
1629   // whole tree as unavailable to prevent it from building.
1630   if (!ActiveModule->IsAvailable && !ActiveModule->IsMissingRequirement &&
1631       ActiveModule->Parent) {
1632     ActiveModule->getTopLevelModule()->markUnavailable();
1633     ActiveModule->getTopLevelModule()->MissingHeaders.append(
1634       ActiveModule->MissingHeaders.begin(), ActiveModule->MissingHeaders.end());
1635   }
1636 
1637   // We're done parsing this module. Pop back to the previous module.
1638   ActiveModule = PreviousActiveModule;
1639 }
1640 
1641 /// \brief Parse an extern module declaration.
1642 ///
1643 ///   extern module-declaration:
1644 ///     'extern' 'module' module-id string-literal
1645 void ModuleMapParser::parseExternModuleDecl() {
1646   assert(Tok.is(MMToken::ExternKeyword));
1647   SourceLocation ExternLoc = consumeToken(); // 'extern' keyword
1648 
1649   // Parse 'module' keyword.
1650   if (!Tok.is(MMToken::ModuleKeyword)) {
1651     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1652     consumeToken();
1653     HadError = true;
1654     return;
1655   }
1656   consumeToken(); // 'module' keyword
1657 
1658   // Parse the module name.
1659   ModuleId Id;
1660   if (parseModuleId(Id)) {
1661     HadError = true;
1662     return;
1663   }
1664 
1665   // Parse the referenced module map file name.
1666   if (!Tok.is(MMToken::StringLiteral)) {
1667     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_mmap_file);
1668     HadError = true;
1669     return;
1670   }
1671   std::string FileName = Tok.getString();
1672   consumeToken(); // filename
1673 
1674   StringRef FileNameRef = FileName;
1675   SmallString<128> ModuleMapFileName;
1676   if (llvm::sys::path::is_relative(FileNameRef)) {
1677     ModuleMapFileName += Directory->getName();
1678     llvm::sys::path::append(ModuleMapFileName, FileName);
1679     FileNameRef = ModuleMapFileName;
1680   }
1681   if (const FileEntry *File = SourceMgr.getFileManager().getFile(FileNameRef))
1682     Map.parseModuleMapFile(
1683         File, /*IsSystem=*/false,
1684         Map.HeaderInfo.getHeaderSearchOpts().ModuleMapFileHomeIsCwd
1685             ? Directory
1686             : File->getDir(), ExternLoc);
1687 }
1688 
1689 /// Whether to add the requirement \p Feature to the module \p M.
1690 ///
1691 /// This preserves backwards compatibility for two hacks in the Darwin system
1692 /// module map files:
1693 ///
1694 /// 1. The use of 'requires excluded' to make headers non-modular, which
1695 ///    should really be mapped to 'textual' now that we have this feature.  We
1696 ///    drop the 'excluded' requirement, and set \p IsRequiresExcludedHack to
1697 ///    true.  Later, this bit will be used to map all the headers inside this
1698 ///    module to 'textual'.
1699 ///
1700 ///    This affects Darwin.C.excluded (for assert.h) and Tcl.Private.
1701 ///
1702 /// 2. Removes a bogus cplusplus requirement from IOKit.avc.  This requirement
1703 ///    was never correct and causes issues now that we check it, so drop it.
1704 static bool shouldAddRequirement(Module *M, StringRef Feature,
1705                                  bool &IsRequiresExcludedHack) {
1706   if (Feature == "excluded" &&
1707       (M->fullModuleNameIs({"Darwin", "C", "excluded"}) ||
1708        M->fullModuleNameIs({"Tcl", "Private"}))) {
1709     IsRequiresExcludedHack = true;
1710     return false;
1711   } else if (Feature == "cplusplus" && M->fullModuleNameIs({"IOKit", "avc"})) {
1712     return false;
1713   }
1714 
1715   return true;
1716 }
1717 
1718 /// \brief Parse a requires declaration.
1719 ///
1720 ///   requires-declaration:
1721 ///     'requires' feature-list
1722 ///
1723 ///   feature-list:
1724 ///     feature ',' feature-list
1725 ///     feature
1726 ///
1727 ///   feature:
1728 ///     '!'[opt] identifier
1729 void ModuleMapParser::parseRequiresDecl() {
1730   assert(Tok.is(MMToken::RequiresKeyword));
1731 
1732   // Parse 'requires' keyword.
1733   consumeToken();
1734 
1735   // Parse the feature-list.
1736   do {
1737     bool RequiredState = true;
1738     if (Tok.is(MMToken::Exclaim)) {
1739       RequiredState = false;
1740       consumeToken();
1741     }
1742 
1743     if (!Tok.is(MMToken::Identifier)) {
1744       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature);
1745       HadError = true;
1746       return;
1747     }
1748 
1749     // Consume the feature name.
1750     std::string Feature = Tok.getString();
1751     consumeToken();
1752 
1753     bool IsRequiresExcludedHack = false;
1754     bool ShouldAddRequirement =
1755         shouldAddRequirement(ActiveModule, Feature, IsRequiresExcludedHack);
1756 
1757     if (IsRequiresExcludedHack)
1758       UsesRequiresExcludedHack.insert(ActiveModule);
1759 
1760     if (ShouldAddRequirement) {
1761       // Add this feature.
1762       ActiveModule->addRequirement(Feature, RequiredState, Map.LangOpts,
1763                                    *Map.Target);
1764     }
1765 
1766     if (!Tok.is(MMToken::Comma))
1767       break;
1768 
1769     // Consume the comma.
1770     consumeToken();
1771   } while (true);
1772 }
1773 
1774 /// \brief Append to \p Paths the set of paths needed to get to the
1775 /// subframework in which the given module lives.
1776 static void appendSubframeworkPaths(Module *Mod,
1777                                     SmallVectorImpl<char> &Path) {
1778   // Collect the framework names from the given module to the top-level module.
1779   SmallVector<StringRef, 2> Paths;
1780   for (; Mod; Mod = Mod->Parent) {
1781     if (Mod->IsFramework)
1782       Paths.push_back(Mod->Name);
1783   }
1784 
1785   if (Paths.empty())
1786     return;
1787 
1788   // Add Frameworks/Name.framework for each subframework.
1789   for (unsigned I = Paths.size() - 1; I != 0; --I)
1790     llvm::sys::path::append(Path, "Frameworks", Paths[I-1] + ".framework");
1791 }
1792 
1793 /// \brief Parse a header declaration.
1794 ///
1795 ///   header-declaration:
1796 ///     'textual'[opt] 'header' string-literal
1797 ///     'private' 'textual'[opt] 'header' string-literal
1798 ///     'exclude' 'header' string-literal
1799 ///     'umbrella' 'header' string-literal
1800 ///
1801 /// FIXME: Support 'private textual header'.
1802 void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken,
1803                                       SourceLocation LeadingLoc) {
1804   // We've already consumed the first token.
1805   ModuleMap::ModuleHeaderRole Role = ModuleMap::NormalHeader;
1806   if (LeadingToken == MMToken::PrivateKeyword) {
1807     Role = ModuleMap::PrivateHeader;
1808     // 'private' may optionally be followed by 'textual'.
1809     if (Tok.is(MMToken::TextualKeyword)) {
1810       LeadingToken = Tok.Kind;
1811       consumeToken();
1812     }
1813   }
1814 
1815   if (LeadingToken == MMToken::TextualKeyword)
1816     Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader);
1817 
1818   if (UsesRequiresExcludedHack.count(ActiveModule)) {
1819     // Mark this header 'textual' (see doc comment for
1820     // Module::UsesRequiresExcludedHack).
1821     Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader);
1822   }
1823 
1824   if (LeadingToken != MMToken::HeaderKeyword) {
1825     if (!Tok.is(MMToken::HeaderKeyword)) {
1826       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1827           << (LeadingToken == MMToken::PrivateKeyword ? "private" :
1828               LeadingToken == MMToken::ExcludeKeyword ? "exclude" :
1829               LeadingToken == MMToken::TextualKeyword ? "textual" : "umbrella");
1830       return;
1831     }
1832     consumeToken();
1833   }
1834 
1835   // Parse the header name.
1836   if (!Tok.is(MMToken::StringLiteral)) {
1837     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1838       << "header";
1839     HadError = true;
1840     return;
1841   }
1842   Module::UnresolvedHeaderDirective Header;
1843   Header.FileName = Tok.getString();
1844   Header.FileNameLoc = consumeToken();
1845 
1846   // Check whether we already have an umbrella.
1847   if (LeadingToken == MMToken::UmbrellaKeyword && ActiveModule->Umbrella) {
1848     Diags.Report(Header.FileNameLoc, diag::err_mmap_umbrella_clash)
1849       << ActiveModule->getFullModuleName();
1850     HadError = true;
1851     return;
1852   }
1853 
1854   // Look for this file.
1855   const FileEntry *File = nullptr;
1856   const FileEntry *BuiltinFile = nullptr;
1857   SmallString<128> RelativePathName;
1858   if (llvm::sys::path::is_absolute(Header.FileName)) {
1859     RelativePathName = Header.FileName;
1860     File = SourceMgr.getFileManager().getFile(RelativePathName);
1861   } else {
1862     // Search for the header file within the search directory.
1863     SmallString<128> FullPathName(Directory->getName());
1864     unsigned FullPathLength = FullPathName.size();
1865 
1866     if (ActiveModule->isPartOfFramework()) {
1867       appendSubframeworkPaths(ActiveModule, RelativePathName);
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       if (!File) {
1875         // Check whether this file is in the private headers.
1876         // FIXME: Should we retain the subframework paths here?
1877         RelativePathName.clear();
1878         FullPathName.resize(FullPathLength);
1879         llvm::sys::path::append(RelativePathName, "PrivateHeaders",
1880                                 Header.FileName);
1881         llvm::sys::path::append(FullPathName, RelativePathName);
1882         File = SourceMgr.getFileManager().getFile(FullPathName);
1883       }
1884     } else {
1885       // Lookup for normal headers.
1886       llvm::sys::path::append(RelativePathName, Header.FileName);
1887       llvm::sys::path::append(FullPathName, RelativePathName);
1888       File = SourceMgr.getFileManager().getFile(FullPathName);
1889 
1890       // If this is a system module with a top-level header, this header
1891       // may have a counterpart (or replacement) in the set of headers
1892       // supplied by Clang. Find that builtin header.
1893       if (ActiveModule->IsSystem && LeadingToken != MMToken::UmbrellaKeyword &&
1894           BuiltinIncludeDir && BuiltinIncludeDir != Directory &&
1895           ModuleMap::isBuiltinHeader(Header.FileName)) {
1896         SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName());
1897         llvm::sys::path::append(BuiltinPathName, Header.FileName);
1898         BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName);
1899 
1900         // If Clang supplies this header but the underlying system does not,
1901         // just silently swap in our builtin version. Otherwise, we'll end
1902         // up adding both (later).
1903         if (BuiltinFile && !File) {
1904           File = BuiltinFile;
1905           RelativePathName = BuiltinPathName;
1906           BuiltinFile = nullptr;
1907         }
1908       }
1909     }
1910   }
1911 
1912   // FIXME: We shouldn't be eagerly stat'ing every file named in a module map.
1913   // Come up with a lazy way to do this.
1914   if (File) {
1915     if (LeadingToken == MMToken::UmbrellaKeyword) {
1916       const DirectoryEntry *UmbrellaDir = File->getDir();
1917       if (Module *UmbrellaModule = Map.UmbrellaDirs[UmbrellaDir]) {
1918         Diags.Report(LeadingLoc, diag::err_mmap_umbrella_clash)
1919           << UmbrellaModule->getFullModuleName();
1920         HadError = true;
1921       } else {
1922         // Record this umbrella header.
1923         Map.setUmbrellaHeader(ActiveModule, File, RelativePathName.str());
1924       }
1925     } else if (LeadingToken == MMToken::ExcludeKeyword) {
1926       Module::Header H = {RelativePathName.str(), File};
1927       Map.excludeHeader(ActiveModule, H);
1928     } else {
1929       // If there is a builtin counterpart to this file, add it now so it can
1930       // wrap the system header.
1931       if (BuiltinFile) {
1932         // FIXME: Taking the name from the FileEntry is unstable and can give
1933         // different results depending on how we've previously named that file
1934         // in this build.
1935         Module::Header H = { BuiltinFile->getName(), BuiltinFile };
1936         Map.addHeader(ActiveModule, H, Role);
1937 
1938         // If we have both a builtin and system version of the file, the
1939         // builtin version may want to inject macros into the system header, so
1940         // force the system header to be treated as a textual header in this
1941         // case.
1942         Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader);
1943       }
1944 
1945       // Record this header.
1946       Module::Header H = { RelativePathName.str(), File };
1947       Map.addHeader(ActiveModule, H, Role);
1948     }
1949   } else if (LeadingToken != MMToken::ExcludeKeyword) {
1950     // Ignore excluded header files. They're optional anyway.
1951 
1952     // If we find a module that has a missing header, we mark this module as
1953     // unavailable and store the header directive for displaying diagnostics.
1954     Header.IsUmbrella = LeadingToken == MMToken::UmbrellaKeyword;
1955     ActiveModule->markUnavailable();
1956     ActiveModule->MissingHeaders.push_back(Header);
1957   }
1958 }
1959 
1960 static int compareModuleHeaders(const Module::Header *A,
1961                                 const Module::Header *B) {
1962   return A->NameAsWritten.compare(B->NameAsWritten);
1963 }
1964 
1965 /// \brief Parse an umbrella directory declaration.
1966 ///
1967 ///   umbrella-dir-declaration:
1968 ///     umbrella string-literal
1969 void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) {
1970   // Parse the directory name.
1971   if (!Tok.is(MMToken::StringLiteral)) {
1972     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1973       << "umbrella";
1974     HadError = true;
1975     return;
1976   }
1977 
1978   std::string DirName = Tok.getString();
1979   SourceLocation DirNameLoc = consumeToken();
1980 
1981   // Check whether we already have an umbrella.
1982   if (ActiveModule->Umbrella) {
1983     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash)
1984       << ActiveModule->getFullModuleName();
1985     HadError = true;
1986     return;
1987   }
1988 
1989   // Look for this file.
1990   const DirectoryEntry *Dir = nullptr;
1991   if (llvm::sys::path::is_absolute(DirName))
1992     Dir = SourceMgr.getFileManager().getDirectory(DirName);
1993   else {
1994     SmallString<128> PathName;
1995     PathName = Directory->getName();
1996     llvm::sys::path::append(PathName, DirName);
1997     Dir = SourceMgr.getFileManager().getDirectory(PathName);
1998   }
1999 
2000   if (!Dir) {
2001     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found)
2002       << DirName;
2003     HadError = true;
2004     return;
2005   }
2006 
2007   if (UsesRequiresExcludedHack.count(ActiveModule)) {
2008     // Mark this header 'textual' (see doc comment for
2009     // ModuleMapParser::UsesRequiresExcludedHack). Although iterating over the
2010     // directory is relatively expensive, in practice this only applies to the
2011     // uncommonly used Tcl module on Darwin platforms.
2012     std::error_code EC;
2013     SmallVector<Module::Header, 6> Headers;
2014     vfs::FileSystem &FS = *SourceMgr.getFileManager().getVirtualFileSystem();
2015     for (vfs::recursive_directory_iterator I(FS, Dir->getName(), EC), E;
2016          I != E && !EC; I.increment(EC)) {
2017       if (const FileEntry *FE =
2018               SourceMgr.getFileManager().getFile(I->getName())) {
2019 
2020         Module::Header Header = {I->getName(), FE};
2021         Headers.push_back(std::move(Header));
2022       }
2023     }
2024 
2025     // Sort header paths so that the pcm doesn't depend on iteration order.
2026     llvm::array_pod_sort(Headers.begin(), Headers.end(), compareModuleHeaders);
2027 
2028     for (auto &Header : Headers)
2029       Map.addHeader(ActiveModule, std::move(Header), ModuleMap::TextualHeader);
2030     return;
2031   }
2032 
2033   if (Module *OwningModule = Map.UmbrellaDirs[Dir]) {
2034     Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
2035       << OwningModule->getFullModuleName();
2036     HadError = true;
2037     return;
2038   }
2039 
2040   // Record this umbrella directory.
2041   Map.setUmbrellaDir(ActiveModule, Dir, DirName);
2042 }
2043 
2044 /// \brief Parse a module export declaration.
2045 ///
2046 ///   export-declaration:
2047 ///     'export' wildcard-module-id
2048 ///
2049 ///   wildcard-module-id:
2050 ///     identifier
2051 ///     '*'
2052 ///     identifier '.' wildcard-module-id
2053 void ModuleMapParser::parseExportDecl() {
2054   assert(Tok.is(MMToken::ExportKeyword));
2055   SourceLocation ExportLoc = consumeToken();
2056 
2057   // Parse the module-id with an optional wildcard at the end.
2058   ModuleId ParsedModuleId;
2059   bool Wildcard = false;
2060   do {
2061     // FIXME: Support string-literal module names here.
2062     if (Tok.is(MMToken::Identifier)) {
2063       ParsedModuleId.push_back(std::make_pair(Tok.getString(),
2064                                               Tok.getLocation()));
2065       consumeToken();
2066 
2067       if (Tok.is(MMToken::Period)) {
2068         consumeToken();
2069         continue;
2070       }
2071 
2072       break;
2073     }
2074 
2075     if(Tok.is(MMToken::Star)) {
2076       Wildcard = true;
2077       consumeToken();
2078       break;
2079     }
2080 
2081     Diags.Report(Tok.getLocation(), diag::err_mmap_module_id);
2082     HadError = true;
2083     return;
2084   } while (true);
2085 
2086   Module::UnresolvedExportDecl Unresolved = {
2087     ExportLoc, ParsedModuleId, Wildcard
2088   };
2089   ActiveModule->UnresolvedExports.push_back(Unresolved);
2090 }
2091 
2092 /// \brief Parse a module use declaration.
2093 ///
2094 ///   use-declaration:
2095 ///     'use' wildcard-module-id
2096 void ModuleMapParser::parseUseDecl() {
2097   assert(Tok.is(MMToken::UseKeyword));
2098   auto KWLoc = consumeToken();
2099   // Parse the module-id.
2100   ModuleId ParsedModuleId;
2101   parseModuleId(ParsedModuleId);
2102 
2103   if (ActiveModule->Parent)
2104     Diags.Report(KWLoc, diag::err_mmap_use_decl_submodule);
2105   else
2106     ActiveModule->UnresolvedDirectUses.push_back(ParsedModuleId);
2107 }
2108 
2109 /// \brief Parse a link declaration.
2110 ///
2111 ///   module-declaration:
2112 ///     'link' 'framework'[opt] string-literal
2113 void ModuleMapParser::parseLinkDecl() {
2114   assert(Tok.is(MMToken::LinkKeyword));
2115   SourceLocation LinkLoc = consumeToken();
2116 
2117   // Parse the optional 'framework' keyword.
2118   bool IsFramework = false;
2119   if (Tok.is(MMToken::FrameworkKeyword)) {
2120     consumeToken();
2121     IsFramework = true;
2122   }
2123 
2124   // Parse the library name
2125   if (!Tok.is(MMToken::StringLiteral)) {
2126     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_library_name)
2127       << IsFramework << SourceRange(LinkLoc);
2128     HadError = true;
2129     return;
2130   }
2131 
2132   std::string LibraryName = Tok.getString();
2133   consumeToken();
2134   ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName,
2135                                                             IsFramework));
2136 }
2137 
2138 /// \brief Parse a configuration macro declaration.
2139 ///
2140 ///   module-declaration:
2141 ///     'config_macros' attributes[opt] config-macro-list?
2142 ///
2143 ///   config-macro-list:
2144 ///     identifier (',' identifier)?
2145 void ModuleMapParser::parseConfigMacros() {
2146   assert(Tok.is(MMToken::ConfigMacros));
2147   SourceLocation ConfigMacrosLoc = consumeToken();
2148 
2149   // Only top-level modules can have configuration macros.
2150   if (ActiveModule->Parent) {
2151     Diags.Report(ConfigMacrosLoc, diag::err_mmap_config_macro_submodule);
2152   }
2153 
2154   // Parse the optional attributes.
2155   Attributes Attrs;
2156   if (parseOptionalAttributes(Attrs))
2157     return;
2158 
2159   if (Attrs.IsExhaustive && !ActiveModule->Parent) {
2160     ActiveModule->ConfigMacrosExhaustive = true;
2161   }
2162 
2163   // If we don't have an identifier, we're done.
2164   // FIXME: Support macros with the same name as a keyword here.
2165   if (!Tok.is(MMToken::Identifier))
2166     return;
2167 
2168   // Consume the first identifier.
2169   if (!ActiveModule->Parent) {
2170     ActiveModule->ConfigMacros.push_back(Tok.getString().str());
2171   }
2172   consumeToken();
2173 
2174   do {
2175     // If there's a comma, consume it.
2176     if (!Tok.is(MMToken::Comma))
2177       break;
2178     consumeToken();
2179 
2180     // We expect to see a macro name here.
2181     // FIXME: Support macros with the same name as a keyword here.
2182     if (!Tok.is(MMToken::Identifier)) {
2183       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_config_macro);
2184       break;
2185     }
2186 
2187     // Consume the macro name.
2188     if (!ActiveModule->Parent) {
2189       ActiveModule->ConfigMacros.push_back(Tok.getString().str());
2190     }
2191     consumeToken();
2192   } while (true);
2193 }
2194 
2195 /// \brief Format a module-id into a string.
2196 static std::string formatModuleId(const ModuleId &Id) {
2197   std::string result;
2198   {
2199     llvm::raw_string_ostream OS(result);
2200 
2201     for (unsigned I = 0, N = Id.size(); I != N; ++I) {
2202       if (I)
2203         OS << ".";
2204       OS << Id[I].first;
2205     }
2206   }
2207 
2208   return result;
2209 }
2210 
2211 /// \brief Parse a conflict declaration.
2212 ///
2213 ///   module-declaration:
2214 ///     'conflict' module-id ',' string-literal
2215 void ModuleMapParser::parseConflict() {
2216   assert(Tok.is(MMToken::Conflict));
2217   SourceLocation ConflictLoc = consumeToken();
2218   Module::UnresolvedConflict Conflict;
2219 
2220   // Parse the module-id.
2221   if (parseModuleId(Conflict.Id))
2222     return;
2223 
2224   // Parse the ','.
2225   if (!Tok.is(MMToken::Comma)) {
2226     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_comma)
2227       << SourceRange(ConflictLoc);
2228     return;
2229   }
2230   consumeToken();
2231 
2232   // Parse the message.
2233   if (!Tok.is(MMToken::StringLiteral)) {
2234     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_message)
2235       << formatModuleId(Conflict.Id);
2236     return;
2237   }
2238   Conflict.Message = Tok.getString().str();
2239   consumeToken();
2240 
2241   // Add this unresolved conflict.
2242   ActiveModule->UnresolvedConflicts.push_back(Conflict);
2243 }
2244 
2245 /// \brief Parse an inferred module declaration (wildcard modules).
2246 ///
2247 ///   module-declaration:
2248 ///     'explicit'[opt] 'framework'[opt] 'module' * attributes[opt]
2249 ///       { inferred-module-member* }
2250 ///
2251 ///   inferred-module-member:
2252 ///     'export' '*'
2253 ///     'exclude' identifier
2254 void ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) {
2255   assert(Tok.is(MMToken::Star));
2256   SourceLocation StarLoc = consumeToken();
2257   bool Failed = false;
2258 
2259   // Inferred modules must be submodules.
2260   if (!ActiveModule && !Framework) {
2261     Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule);
2262     Failed = true;
2263   }
2264 
2265   if (ActiveModule) {
2266     // Inferred modules must have umbrella directories.
2267     if (!Failed && ActiveModule->IsAvailable &&
2268         !ActiveModule->getUmbrellaDir()) {
2269       Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
2270       Failed = true;
2271     }
2272 
2273     // Check for redefinition of an inferred module.
2274     if (!Failed && ActiveModule->InferSubmodules) {
2275       Diags.Report(StarLoc, diag::err_mmap_inferred_redef);
2276       if (ActiveModule->InferredSubmoduleLoc.isValid())
2277         Diags.Report(ActiveModule->InferredSubmoduleLoc,
2278                      diag::note_mmap_prev_definition);
2279       Failed = true;
2280     }
2281 
2282     // Check for the 'framework' keyword, which is not permitted here.
2283     if (Framework) {
2284       Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule);
2285       Framework = false;
2286     }
2287   } else if (Explicit) {
2288     Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework);
2289     Explicit = false;
2290   }
2291 
2292   // If there were any problems with this inferred submodule, skip its body.
2293   if (Failed) {
2294     if (Tok.is(MMToken::LBrace)) {
2295       consumeToken();
2296       skipUntil(MMToken::RBrace);
2297       if (Tok.is(MMToken::RBrace))
2298         consumeToken();
2299     }
2300     HadError = true;
2301     return;
2302   }
2303 
2304   // Parse optional attributes.
2305   Attributes Attrs;
2306   if (parseOptionalAttributes(Attrs))
2307     return;
2308 
2309   if (ActiveModule) {
2310     // Note that we have an inferred submodule.
2311     ActiveModule->InferSubmodules = true;
2312     ActiveModule->InferredSubmoduleLoc = StarLoc;
2313     ActiveModule->InferExplicitSubmodules = Explicit;
2314   } else {
2315     // We'll be inferring framework modules for this directory.
2316     Map.InferredDirectories[Directory].InferModules = true;
2317     Map.InferredDirectories[Directory].Attrs = Attrs;
2318     Map.InferredDirectories[Directory].ModuleMapFile = ModuleMapFile;
2319     // FIXME: Handle the 'framework' keyword.
2320   }
2321 
2322   // Parse the opening brace.
2323   if (!Tok.is(MMToken::LBrace)) {
2324     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard);
2325     HadError = true;
2326     return;
2327   }
2328   SourceLocation LBraceLoc = consumeToken();
2329 
2330   // Parse the body of the inferred submodule.
2331   bool Done = false;
2332   do {
2333     switch (Tok.Kind) {
2334     case MMToken::EndOfFile:
2335     case MMToken::RBrace:
2336       Done = true;
2337       break;
2338 
2339     case MMToken::ExcludeKeyword: {
2340       if (ActiveModule) {
2341         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2342           << (ActiveModule != nullptr);
2343         consumeToken();
2344         break;
2345       }
2346 
2347       consumeToken();
2348       // FIXME: Support string-literal module names here.
2349       if (!Tok.is(MMToken::Identifier)) {
2350         Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name);
2351         break;
2352       }
2353 
2354       Map.InferredDirectories[Directory].ExcludedModules
2355         .push_back(Tok.getString());
2356       consumeToken();
2357       break;
2358     }
2359 
2360     case MMToken::ExportKeyword:
2361       if (!ActiveModule) {
2362         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2363           << (ActiveModule != nullptr);
2364         consumeToken();
2365         break;
2366       }
2367 
2368       consumeToken();
2369       if (Tok.is(MMToken::Star))
2370         ActiveModule->InferExportWildcard = true;
2371       else
2372         Diags.Report(Tok.getLocation(),
2373                      diag::err_mmap_expected_export_wildcard);
2374       consumeToken();
2375       break;
2376 
2377     case MMToken::ExplicitKeyword:
2378     case MMToken::ModuleKeyword:
2379     case MMToken::HeaderKeyword:
2380     case MMToken::PrivateKeyword:
2381     case MMToken::UmbrellaKeyword:
2382     default:
2383       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2384           << (ActiveModule != nullptr);
2385       consumeToken();
2386       break;
2387     }
2388   } while (!Done);
2389 
2390   if (Tok.is(MMToken::RBrace))
2391     consumeToken();
2392   else {
2393     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
2394     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
2395     HadError = true;
2396   }
2397 }
2398 
2399 /// \brief Parse optional attributes.
2400 ///
2401 ///   attributes:
2402 ///     attribute attributes
2403 ///     attribute
2404 ///
2405 ///   attribute:
2406 ///     [ identifier ]
2407 ///
2408 /// \param Attrs Will be filled in with the parsed attributes.
2409 ///
2410 /// \returns true if an error occurred, false otherwise.
2411 bool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) {
2412   bool HadError = false;
2413 
2414   while (Tok.is(MMToken::LSquare)) {
2415     // Consume the '['.
2416     SourceLocation LSquareLoc = consumeToken();
2417 
2418     // Check whether we have an attribute name here.
2419     if (!Tok.is(MMToken::Identifier)) {
2420       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute);
2421       skipUntil(MMToken::RSquare);
2422       if (Tok.is(MMToken::RSquare))
2423         consumeToken();
2424       HadError = true;
2425     }
2426 
2427     // Decode the attribute name.
2428     AttributeKind Attribute
2429       = llvm::StringSwitch<AttributeKind>(Tok.getString())
2430           .Case("exhaustive", AT_exhaustive)
2431           .Case("extern_c", AT_extern_c)
2432           .Case("no_undeclared_includes", AT_no_undeclared_includes)
2433           .Case("system", AT_system)
2434           .Default(AT_unknown);
2435     switch (Attribute) {
2436     case AT_unknown:
2437       Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute)
2438         << Tok.getString();
2439       break;
2440 
2441     case AT_system:
2442       Attrs.IsSystem = true;
2443       break;
2444 
2445     case AT_extern_c:
2446       Attrs.IsExternC = true;
2447       break;
2448 
2449     case AT_exhaustive:
2450       Attrs.IsExhaustive = true;
2451       break;
2452 
2453     case AT_no_undeclared_includes:
2454       Attrs.NoUndeclaredIncludes = true;
2455       break;
2456     }
2457     consumeToken();
2458 
2459     // Consume the ']'.
2460     if (!Tok.is(MMToken::RSquare)) {
2461       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare);
2462       Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match);
2463       skipUntil(MMToken::RSquare);
2464       HadError = true;
2465     }
2466 
2467     if (Tok.is(MMToken::RSquare))
2468       consumeToken();
2469   }
2470 
2471   return HadError;
2472 }
2473 
2474 /// \brief Parse a module map file.
2475 ///
2476 ///   module-map-file:
2477 ///     module-declaration*
2478 bool ModuleMapParser::parseModuleMapFile() {
2479   do {
2480     switch (Tok.Kind) {
2481     case MMToken::EndOfFile:
2482       return HadError;
2483 
2484     case MMToken::ExplicitKeyword:
2485     case MMToken::ExternKeyword:
2486     case MMToken::ModuleKeyword:
2487     case MMToken::FrameworkKeyword:
2488       parseModuleDecl();
2489       break;
2490 
2491     case MMToken::Comma:
2492     case MMToken::ConfigMacros:
2493     case MMToken::Conflict:
2494     case MMToken::Exclaim:
2495     case MMToken::ExcludeKeyword:
2496     case MMToken::ExportKeyword:
2497     case MMToken::HeaderKeyword:
2498     case MMToken::Identifier:
2499     case MMToken::LBrace:
2500     case MMToken::LinkKeyword:
2501     case MMToken::LSquare:
2502     case MMToken::Period:
2503     case MMToken::PrivateKeyword:
2504     case MMToken::RBrace:
2505     case MMToken::RSquare:
2506     case MMToken::RequiresKeyword:
2507     case MMToken::Star:
2508     case MMToken::StringLiteral:
2509     case MMToken::TextualKeyword:
2510     case MMToken::UmbrellaKeyword:
2511     case MMToken::UseKeyword:
2512       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
2513       HadError = true;
2514       consumeToken();
2515       break;
2516     }
2517   } while (true);
2518 }
2519 
2520 bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem,
2521                                    const DirectoryEntry *Dir,
2522                                    SourceLocation ExternModuleLoc) {
2523   llvm::DenseMap<const FileEntry *, bool>::iterator Known
2524     = ParsedModuleMap.find(File);
2525   if (Known != ParsedModuleMap.end())
2526     return Known->second;
2527 
2528   assert(Target && "Missing target information");
2529   auto FileCharacter = IsSystem ? SrcMgr::C_System : SrcMgr::C_User;
2530   FileID ID = SourceMgr.createFileID(File, ExternModuleLoc, FileCharacter);
2531   const llvm::MemoryBuffer *Buffer = SourceMgr.getBuffer(ID);
2532   if (!Buffer)
2533     return ParsedModuleMap[File] = true;
2534 
2535   // Parse this module map file.
2536   Lexer L(ID, SourceMgr.getBuffer(ID), SourceMgr, MMapLangOpts);
2537   SourceLocation Start = L.getSourceLocation();
2538   ModuleMapParser Parser(L, SourceMgr, Target, Diags, *this, File, Dir,
2539                          BuiltinIncludeDir, IsSystem);
2540   bool Result = Parser.parseModuleMapFile();
2541   ParsedModuleMap[File] = Result;
2542 
2543   // Notify callbacks that we parsed it.
2544   for (const auto &Cb : Callbacks)
2545     Cb->moduleMapFileRead(Start, *File, IsSystem);
2546   return Result;
2547 }
2548