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