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 static bool 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       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       if (I->isAvailable() && (!RequestingModule ||
450                                I->getModule()->isSubModuleOf(RequestingModule)))
451         return false;
452     }
453     return true;
454   }
455 
456   const DirectoryEntry *Dir = Header->getDir();
457   SmallVector<const DirectoryEntry *, 2> SkippedDirs;
458   StringRef DirName = Dir->getName();
459 
460   auto IsUnavailable = [&](const Module *M) {
461     return !M->isAvailable() && (!RequestingModule ||
462                                  M->isSubModuleOf(RequestingModule));
463   };
464 
465   // Keep walking up the directory hierarchy, looking for a directory with
466   // an umbrella header.
467   do {
468     llvm::DenseMap<const DirectoryEntry *, Module *>::const_iterator KnownDir
469       = UmbrellaDirs.find(Dir);
470     if (KnownDir != UmbrellaDirs.end()) {
471       Module *Found = KnownDir->second;
472       if (IsUnavailable(Found))
473         return true;
474 
475       // Search up the module stack until we find a module with an umbrella
476       // directory.
477       Module *UmbrellaModule = Found;
478       while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
479         UmbrellaModule = UmbrellaModule->Parent;
480 
481       if (UmbrellaModule->InferSubmodules) {
482         for (unsigned I = SkippedDirs.size(); I != 0; --I) {
483           // Find or create the module that corresponds to this directory name.
484           SmallString<32> NameBuf;
485           StringRef Name = sanitizeFilenameAsIdentifier(
486                              llvm::sys::path::stem(SkippedDirs[I-1]->getName()),
487                              NameBuf);
488           Found = lookupModuleQualified(Name, Found);
489           if (!Found)
490             return false;
491           if (IsUnavailable(Found))
492             return true;
493         }
494 
495         // Infer a submodule with the same name as this header file.
496         SmallString<32> NameBuf;
497         StringRef Name = sanitizeFilenameAsIdentifier(
498                            llvm::sys::path::stem(Header->getName()),
499                            NameBuf);
500         Found = lookupModuleQualified(Name, Found);
501         if (!Found)
502           return false;
503       }
504 
505       return IsUnavailable(Found);
506     }
507 
508     SkippedDirs.push_back(Dir);
509 
510     // Retrieve our parent path.
511     DirName = llvm::sys::path::parent_path(DirName);
512     if (DirName.empty())
513       break;
514 
515     // Resolve the parent path to a directory entry.
516     Dir = SourceMgr.getFileManager().getDirectory(DirName);
517   } while (Dir);
518 
519   return false;
520 }
521 
522 Module *ModuleMap::findModule(StringRef Name) const {
523   llvm::StringMap<Module *>::const_iterator Known = Modules.find(Name);
524   if (Known != Modules.end())
525     return Known->getValue();
526 
527   return nullptr;
528 }
529 
530 Module *ModuleMap::lookupModuleUnqualified(StringRef Name,
531                                            Module *Context) const {
532   for(; Context; Context = Context->Parent) {
533     if (Module *Sub = lookupModuleQualified(Name, Context))
534       return Sub;
535   }
536 
537   return findModule(Name);
538 }
539 
540 Module *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) const{
541   if (!Context)
542     return findModule(Name);
543 
544   return Context->findSubmodule(Name);
545 }
546 
547 std::pair<Module *, bool>
548 ModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework,
549                               bool IsExplicit) {
550   // Try to find an existing module with this name.
551   if (Module *Sub = lookupModuleQualified(Name, Parent))
552     return std::make_pair(Sub, false);
553 
554   // Create a new module with this name.
555   Module *Result = new Module(Name, SourceLocation(), Parent,
556                               IsFramework, IsExplicit, NumCreatedModules++);
557   if (!Parent) {
558     if (LangOpts.CurrentModule == Name)
559       SourceModule = Result;
560     Modules[Name] = Result;
561   }
562   return std::make_pair(Result, true);
563 }
564 
565 Module *ModuleMap::createModuleForInterfaceUnit(SourceLocation Loc,
566                                                 StringRef Name) {
567   assert(LangOpts.CurrentModule == Name && "module name mismatch");
568   assert(!Modules[Name] && "redefining existing module");
569 
570   auto *Result =
571       new Module(Name, Loc, nullptr, /*IsFramework*/ false,
572                  /*IsExplicit*/ false, NumCreatedModules++);
573   Modules[Name] = SourceModule = Result;
574 
575   // Mark the main source file as being within the newly-created module so that
576   // declarations and macros are properly visibility-restricted to it.
577   auto *MainFile = SourceMgr.getFileEntryForID(SourceMgr.getMainFileID());
578   assert(MainFile && "no input file for module interface");
579   Headers[MainFile].push_back(KnownHeader(Result, PrivateHeader));
580 
581   return Result;
582 }
583 
584 /// \brief For a framework module, infer the framework against which we
585 /// should link.
586 static void inferFrameworkLink(Module *Mod, const DirectoryEntry *FrameworkDir,
587                                FileManager &FileMgr) {
588   assert(Mod->IsFramework && "Can only infer linking for framework modules");
589   assert(!Mod->isSubFramework() &&
590          "Can only infer linking for top-level frameworks");
591 
592   SmallString<128> LibName;
593   LibName += FrameworkDir->getName();
594   llvm::sys::path::append(LibName, Mod->Name);
595 
596   // The library name of a framework has more than one possible extension since
597   // the introduction of the text-based dynamic library format. We need to check
598   // for both before we give up.
599   static const char *frameworkExtensions[] = {"", ".tbd"};
600   for (const auto *extension : frameworkExtensions) {
601     llvm::sys::path::replace_extension(LibName, extension);
602     if (FileMgr.getFile(LibName)) {
603       Mod->LinkLibraries.push_back(Module::LinkLibrary(Mod->Name,
604                                                        /*IsFramework=*/true));
605       return;
606     }
607   }
608 }
609 
610 Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir,
611                                         bool IsSystem, Module *Parent) {
612   Attributes Attrs;
613   Attrs.IsSystem = IsSystem;
614   return inferFrameworkModule(FrameworkDir, Attrs, Parent);
615 }
616 
617 Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir,
618                                         Attributes Attrs, Module *Parent) {
619   // Note: as an egregious but useful hack we use the real path here, because
620   // we might be looking at an embedded framework that symlinks out to a
621   // top-level framework, and we need to infer as if we were naming the
622   // top-level framework.
623   StringRef FrameworkDirName =
624       SourceMgr.getFileManager().getCanonicalName(FrameworkDir);
625 
626   // In case this is a case-insensitive filesystem, use the canonical
627   // directory name as the ModuleName, since modules are case-sensitive.
628   // FIXME: we should be able to give a fix-it hint for the correct spelling.
629   SmallString<32> ModuleNameStorage;
630   StringRef ModuleName = sanitizeFilenameAsIdentifier(
631       llvm::sys::path::stem(FrameworkDirName), ModuleNameStorage);
632 
633   // Check whether we've already found this module.
634   if (Module *Mod = lookupModuleQualified(ModuleName, Parent))
635     return Mod;
636 
637   FileManager &FileMgr = SourceMgr.getFileManager();
638 
639   // If the framework has a parent path from which we're allowed to infer
640   // a framework module, do so.
641   const FileEntry *ModuleMapFile = nullptr;
642   if (!Parent) {
643     // Determine whether we're allowed to infer a module map.
644     bool canInfer = false;
645     if (llvm::sys::path::has_parent_path(FrameworkDirName)) {
646       // Figure out the parent path.
647       StringRef Parent = llvm::sys::path::parent_path(FrameworkDirName);
648       if (const DirectoryEntry *ParentDir = FileMgr.getDirectory(Parent)) {
649         // Check whether we have already looked into the parent directory
650         // for a module map.
651         llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator
652           inferred = InferredDirectories.find(ParentDir);
653         if (inferred == InferredDirectories.end()) {
654           // We haven't looked here before. Load a module map, if there is
655           // one.
656           bool IsFrameworkDir = Parent.endswith(".framework");
657           if (const FileEntry *ModMapFile =
658                 HeaderInfo.lookupModuleMapFile(ParentDir, IsFrameworkDir)) {
659             parseModuleMapFile(ModMapFile, Attrs.IsSystem, ParentDir);
660             inferred = InferredDirectories.find(ParentDir);
661           }
662 
663           if (inferred == InferredDirectories.end())
664             inferred = InferredDirectories.insert(
665                          std::make_pair(ParentDir, InferredDirectory())).first;
666         }
667 
668         if (inferred->second.InferModules) {
669           // We're allowed to infer for this directory, but make sure it's okay
670           // to infer this particular module.
671           StringRef Name = llvm::sys::path::stem(FrameworkDirName);
672           canInfer = std::find(inferred->second.ExcludedModules.begin(),
673                                inferred->second.ExcludedModules.end(),
674                                Name) == inferred->second.ExcludedModules.end();
675 
676           Attrs.IsSystem |= inferred->second.Attrs.IsSystem;
677           Attrs.IsExternC |= inferred->second.Attrs.IsExternC;
678           Attrs.IsExhaustive |= inferred->second.Attrs.IsExhaustive;
679           Attrs.NoUndeclaredIncludes |=
680               inferred->second.Attrs.NoUndeclaredIncludes;
681           ModuleMapFile = inferred->second.ModuleMapFile;
682         }
683       }
684     }
685 
686     // If we're not allowed to infer a framework module, don't.
687     if (!canInfer)
688       return nullptr;
689   } else
690     ModuleMapFile = getModuleMapFileForUniquing(Parent);
691 
692 
693   // Look for an umbrella header.
694   SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName());
695   llvm::sys::path::append(UmbrellaName, "Headers", ModuleName + ".h");
696   const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName);
697 
698   // FIXME: If there's no umbrella header, we could probably scan the
699   // framework to load *everything*. But, it's not clear that this is a good
700   // idea.
701   if (!UmbrellaHeader)
702     return nullptr;
703 
704   Module *Result = new Module(ModuleName, SourceLocation(), Parent,
705                               /*IsFramework=*/true, /*IsExplicit=*/false,
706                               NumCreatedModules++);
707   InferredModuleAllowedBy[Result] = ModuleMapFile;
708   Result->IsInferred = true;
709   if (!Parent) {
710     if (LangOpts.CurrentModule == ModuleName)
711       SourceModule = Result;
712     Modules[ModuleName] = Result;
713   }
714 
715   Result->IsSystem |= Attrs.IsSystem;
716   Result->IsExternC |= Attrs.IsExternC;
717   Result->ConfigMacrosExhaustive |= Attrs.IsExhaustive;
718   Result->NoUndeclaredIncludes |= Attrs.NoUndeclaredIncludes;
719   Result->Directory = FrameworkDir;
720 
721   // umbrella header "umbrella-header-name"
722   //
723   // The "Headers/" component of the name is implied because this is
724   // a framework module.
725   setUmbrellaHeader(Result, UmbrellaHeader, ModuleName + ".h");
726 
727   // export *
728   Result->Exports.push_back(Module::ExportDecl(nullptr, true));
729 
730   // module * { export * }
731   Result->InferSubmodules = true;
732   Result->InferExportWildcard = true;
733 
734   // Look for subframeworks.
735   std::error_code EC;
736   SmallString<128> SubframeworksDirName
737     = StringRef(FrameworkDir->getName());
738   llvm::sys::path::append(SubframeworksDirName, "Frameworks");
739   llvm::sys::path::native(SubframeworksDirName);
740   vfs::FileSystem &FS = *FileMgr.getVirtualFileSystem();
741   for (vfs::directory_iterator Dir = FS.dir_begin(SubframeworksDirName, EC),
742                                DirEnd;
743        Dir != DirEnd && !EC; Dir.increment(EC)) {
744     if (!StringRef(Dir->getName()).endswith(".framework"))
745       continue;
746 
747     if (const DirectoryEntry *SubframeworkDir =
748             FileMgr.getDirectory(Dir->getName())) {
749       // Note: as an egregious but useful hack, we use the real path here and
750       // check whether it is actually a subdirectory of the parent directory.
751       // This will not be the case if the 'subframework' is actually a symlink
752       // out to a top-level framework.
753       StringRef SubframeworkDirName = FileMgr.getCanonicalName(SubframeworkDir);
754       bool FoundParent = false;
755       do {
756         // Get the parent directory name.
757         SubframeworkDirName
758           = llvm::sys::path::parent_path(SubframeworkDirName);
759         if (SubframeworkDirName.empty())
760           break;
761 
762         if (FileMgr.getDirectory(SubframeworkDirName) == FrameworkDir) {
763           FoundParent = true;
764           break;
765         }
766       } while (true);
767 
768       if (!FoundParent)
769         continue;
770 
771       // FIXME: Do we want to warn about subframeworks without umbrella headers?
772       inferFrameworkModule(SubframeworkDir, Attrs, Result);
773     }
774   }
775 
776   // If the module is a top-level framework, automatically link against the
777   // framework.
778   if (!Result->isSubFramework()) {
779     inferFrameworkLink(Result, FrameworkDir, FileMgr);
780   }
781 
782   return Result;
783 }
784 
785 void ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader,
786                                   Twine NameAsWritten) {
787   Headers[UmbrellaHeader].push_back(KnownHeader(Mod, NormalHeader));
788   Mod->Umbrella = UmbrellaHeader;
789   Mod->UmbrellaAsWritten = NameAsWritten.str();
790   UmbrellaDirs[UmbrellaHeader->getDir()] = Mod;
791 
792   // Notify callbacks that we just added a new header.
793   for (const auto &Cb : Callbacks)
794     Cb->moduleMapAddUmbrellaHeader(&SourceMgr.getFileManager(), UmbrellaHeader);
795 }
796 
797 void ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir,
798                                Twine NameAsWritten) {
799   Mod->Umbrella = UmbrellaDir;
800   Mod->UmbrellaAsWritten = NameAsWritten.str();
801   UmbrellaDirs[UmbrellaDir] = Mod;
802 }
803 
804 static Module::HeaderKind headerRoleToKind(ModuleMap::ModuleHeaderRole Role) {
805   switch ((int)Role) {
806   default: llvm_unreachable("unknown header role");
807   case ModuleMap::NormalHeader:
808     return Module::HK_Normal;
809   case ModuleMap::PrivateHeader:
810     return Module::HK_Private;
811   case ModuleMap::TextualHeader:
812     return Module::HK_Textual;
813   case ModuleMap::PrivateHeader | ModuleMap::TextualHeader:
814     return Module::HK_PrivateTextual;
815   }
816 }
817 
818 void ModuleMap::addHeader(Module *Mod, Module::Header Header,
819                           ModuleHeaderRole Role, bool Imported) {
820   KnownHeader KH(Mod, Role);
821 
822   // Only add each header to the headers list once.
823   // FIXME: Should we diagnose if a header is listed twice in the
824   // same module definition?
825   auto &HeaderList = Headers[Header.Entry];
826   for (auto H : HeaderList)
827     if (H == KH)
828       return;
829 
830   HeaderList.push_back(KH);
831   Mod->Headers[headerRoleToKind(Role)].push_back(std::move(Header));
832 
833   bool isCompilingModuleHeader =
834       LangOpts.isCompilingModule() && Mod->getTopLevelModule() == SourceModule;
835   if (!Imported || isCompilingModuleHeader) {
836     // When we import HeaderFileInfo, the external source is expected to
837     // set the isModuleHeader flag itself.
838     HeaderInfo.MarkFileModuleHeader(Header.Entry, Role,
839                                     isCompilingModuleHeader);
840   }
841 
842   // Notify callbacks that we just added a new header.
843   for (const auto &Cb : Callbacks)
844     Cb->moduleMapAddHeader(Header.Entry->getName());
845 }
846 
847 void ModuleMap::excludeHeader(Module *Mod, Module::Header Header) {
848   // Add this as a known header so we won't implicitly add it to any
849   // umbrella directory module.
850   // FIXME: Should we only exclude it from umbrella modules within the
851   // specified module?
852   (void) Headers[Header.Entry];
853 
854   Mod->Headers[Module::HK_Excluded].push_back(std::move(Header));
855 }
856 
857 const FileEntry *
858 ModuleMap::getContainingModuleMapFile(const Module *Module) const {
859   if (Module->DefinitionLoc.isInvalid())
860     return nullptr;
861 
862   return SourceMgr.getFileEntryForID(
863            SourceMgr.getFileID(Module->DefinitionLoc));
864 }
865 
866 const FileEntry *ModuleMap::getModuleMapFileForUniquing(const Module *M) const {
867   if (M->IsInferred) {
868     assert(InferredModuleAllowedBy.count(M) && "missing inferred module map");
869     return InferredModuleAllowedBy.find(M)->second;
870   }
871   return getContainingModuleMapFile(M);
872 }
873 
874 void ModuleMap::setInferredModuleAllowedBy(Module *M, const FileEntry *ModMap) {
875   assert(M->IsInferred && "module not inferred");
876   InferredModuleAllowedBy[M] = ModMap;
877 }
878 
879 LLVM_DUMP_METHOD void ModuleMap::dump() {
880   llvm::errs() << "Modules:";
881   for (llvm::StringMap<Module *>::iterator M = Modules.begin(),
882                                         MEnd = Modules.end();
883        M != MEnd; ++M)
884     M->getValue()->print(llvm::errs(), 2);
885 
886   llvm::errs() << "Headers:";
887   for (HeadersMap::iterator H = Headers.begin(), HEnd = Headers.end();
888        H != HEnd; ++H) {
889     llvm::errs() << "  \"" << H->first->getName() << "\" -> ";
890     for (SmallVectorImpl<KnownHeader>::const_iterator I = H->second.begin(),
891                                                       E = H->second.end();
892          I != E; ++I) {
893       if (I != H->second.begin())
894         llvm::errs() << ",";
895       llvm::errs() << I->getModule()->getFullModuleName();
896     }
897     llvm::errs() << "\n";
898   }
899 }
900 
901 bool ModuleMap::resolveExports(Module *Mod, bool Complain) {
902   auto Unresolved = std::move(Mod->UnresolvedExports);
903   Mod->UnresolvedExports.clear();
904   for (auto &UE : Unresolved) {
905     Module::ExportDecl Export = resolveExport(Mod, UE, Complain);
906     if (Export.getPointer() || Export.getInt())
907       Mod->Exports.push_back(Export);
908     else
909       Mod->UnresolvedExports.push_back(UE);
910   }
911   return !Mod->UnresolvedExports.empty();
912 }
913 
914 bool ModuleMap::resolveUses(Module *Mod, bool Complain) {
915   auto Unresolved = std::move(Mod->UnresolvedDirectUses);
916   Mod->UnresolvedDirectUses.clear();
917   for (auto &UDU : Unresolved) {
918     Module *DirectUse = resolveModuleId(UDU, Mod, Complain);
919     if (DirectUse)
920       Mod->DirectUses.push_back(DirectUse);
921     else
922       Mod->UnresolvedDirectUses.push_back(UDU);
923   }
924   return !Mod->UnresolvedDirectUses.empty();
925 }
926 
927 bool ModuleMap::resolveConflicts(Module *Mod, bool Complain) {
928   auto Unresolved = std::move(Mod->UnresolvedConflicts);
929   Mod->UnresolvedConflicts.clear();
930   for (auto &UC : Unresolved) {
931     if (Module *OtherMod = resolveModuleId(UC.Id, Mod, Complain)) {
932       Module::Conflict Conflict;
933       Conflict.Other = OtherMod;
934       Conflict.Message = UC.Message;
935       Mod->Conflicts.push_back(Conflict);
936     } else
937       Mod->UnresolvedConflicts.push_back(UC);
938   }
939   return !Mod->UnresolvedConflicts.empty();
940 }
941 
942 Module *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) {
943   if (Loc.isInvalid())
944     return nullptr;
945 
946   if (UmbrellaDirs.empty() && Headers.empty())
947     return nullptr;
948 
949   // Use the expansion location to determine which module we're in.
950   FullSourceLoc ExpansionLoc = Loc.getExpansionLoc();
951   if (!ExpansionLoc.isFileID())
952     return nullptr;
953 
954   const SourceManager &SrcMgr = Loc.getManager();
955   FileID ExpansionFileID = ExpansionLoc.getFileID();
956 
957   while (const FileEntry *ExpansionFile
958            = SrcMgr.getFileEntryForID(ExpansionFileID)) {
959     // Find the module that owns this header (if any).
960     if (Module *Mod = findModuleForHeader(ExpansionFile).getModule())
961       return Mod;
962 
963     // No module owns this header, so look up the inclusion chain to see if
964     // any included header has an associated module.
965     SourceLocation IncludeLoc = SrcMgr.getIncludeLoc(ExpansionFileID);
966     if (IncludeLoc.isInvalid())
967       return nullptr;
968 
969     ExpansionFileID = SrcMgr.getFileID(IncludeLoc);
970   }
971 
972   return nullptr;
973 }
974 
975 //----------------------------------------------------------------------------//
976 // Module map file parser
977 //----------------------------------------------------------------------------//
978 
979 namespace clang {
980   /// \brief A token in a module map file.
981   struct MMToken {
982     enum TokenKind {
983       Comma,
984       ConfigMacros,
985       Conflict,
986       EndOfFile,
987       HeaderKeyword,
988       Identifier,
989       Exclaim,
990       ExcludeKeyword,
991       ExplicitKeyword,
992       ExportKeyword,
993       ExternKeyword,
994       FrameworkKeyword,
995       LinkKeyword,
996       ModuleKeyword,
997       Period,
998       PrivateKeyword,
999       UmbrellaKeyword,
1000       UseKeyword,
1001       RequiresKeyword,
1002       Star,
1003       StringLiteral,
1004       TextualKeyword,
1005       LBrace,
1006       RBrace,
1007       LSquare,
1008       RSquare
1009     } Kind;
1010 
1011     unsigned Location;
1012     unsigned StringLength;
1013     const char *StringData;
1014 
1015     void clear() {
1016       Kind = EndOfFile;
1017       Location = 0;
1018       StringLength = 0;
1019       StringData = nullptr;
1020     }
1021 
1022     bool is(TokenKind K) const { return Kind == K; }
1023 
1024     SourceLocation getLocation() const {
1025       return SourceLocation::getFromRawEncoding(Location);
1026     }
1027 
1028     StringRef getString() const {
1029       return StringRef(StringData, StringLength);
1030     }
1031   };
1032 
1033   class ModuleMapParser {
1034     Lexer &L;
1035     SourceManager &SourceMgr;
1036 
1037     /// \brief Default target information, used only for string literal
1038     /// parsing.
1039     const TargetInfo *Target;
1040 
1041     DiagnosticsEngine &Diags;
1042     ModuleMap &Map;
1043 
1044     /// \brief The current module map file.
1045     const FileEntry *ModuleMapFile;
1046 
1047     /// \brief The directory that file names in this module map file should
1048     /// be resolved relative to.
1049     const DirectoryEntry *Directory;
1050 
1051     /// \brief The directory containing Clang-supplied headers.
1052     const DirectoryEntry *BuiltinIncludeDir;
1053 
1054     /// \brief Whether this module map is in a system header directory.
1055     bool IsSystem;
1056 
1057     /// \brief Whether an error occurred.
1058     bool HadError;
1059 
1060     /// \brief Stores string data for the various string literals referenced
1061     /// during parsing.
1062     llvm::BumpPtrAllocator StringData;
1063 
1064     /// \brief The current token.
1065     MMToken Tok;
1066 
1067     /// \brief The active module.
1068     Module *ActiveModule;
1069 
1070     /// \brief Whether a module uses the 'requires excluded' hack to mark its
1071     /// contents as 'textual'.
1072     ///
1073     /// On older Darwin SDK versions, 'requires excluded' is used to mark the
1074     /// contents of the Darwin.C.excluded (assert.h) and Tcl.Private modules as
1075     /// non-modular headers.  For backwards compatibility, we continue to
1076     /// support this idiom for just these modules, and map the headers to
1077     /// 'textual' to match the original intent.
1078     llvm::SmallPtrSet<Module *, 2> UsesRequiresExcludedHack;
1079 
1080     /// \brief Consume the current token and return its location.
1081     SourceLocation consumeToken();
1082 
1083     /// \brief Skip tokens until we reach the a token with the given kind
1084     /// (or the end of the file).
1085     void skipUntil(MMToken::TokenKind K);
1086 
1087     typedef SmallVector<std::pair<std::string, SourceLocation>, 2> ModuleId;
1088     bool parseModuleId(ModuleId &Id);
1089     void parseModuleDecl();
1090     void parseExternModuleDecl();
1091     void parseRequiresDecl();
1092     void parseHeaderDecl(clang::MMToken::TokenKind,
1093                          SourceLocation LeadingLoc);
1094     void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc);
1095     void parseExportDecl();
1096     void parseUseDecl();
1097     void parseLinkDecl();
1098     void parseConfigMacros();
1099     void parseConflict();
1100     void parseInferredModuleDecl(bool Framework, bool Explicit);
1101 
1102     typedef ModuleMap::Attributes Attributes;
1103     bool parseOptionalAttributes(Attributes &Attrs);
1104 
1105   public:
1106     explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr,
1107                              const TargetInfo *Target,
1108                              DiagnosticsEngine &Diags,
1109                              ModuleMap &Map,
1110                              const FileEntry *ModuleMapFile,
1111                              const DirectoryEntry *Directory,
1112                              const DirectoryEntry *BuiltinIncludeDir,
1113                              bool IsSystem)
1114       : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map),
1115         ModuleMapFile(ModuleMapFile), Directory(Directory),
1116         BuiltinIncludeDir(BuiltinIncludeDir), IsSystem(IsSystem),
1117         HadError(false), ActiveModule(nullptr)
1118     {
1119       Tok.clear();
1120       consumeToken();
1121     }
1122 
1123     bool parseModuleMapFile();
1124   };
1125 }
1126 
1127 SourceLocation ModuleMapParser::consumeToken() {
1128 retry:
1129   SourceLocation Result = Tok.getLocation();
1130   Tok.clear();
1131 
1132   Token LToken;
1133   L.LexFromRawLexer(LToken);
1134   Tok.Location = LToken.getLocation().getRawEncoding();
1135   switch (LToken.getKind()) {
1136   case tok::raw_identifier: {
1137     StringRef RI = LToken.getRawIdentifier();
1138     Tok.StringData = RI.data();
1139     Tok.StringLength = RI.size();
1140     Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(RI)
1141                  .Case("config_macros", MMToken::ConfigMacros)
1142                  .Case("conflict", MMToken::Conflict)
1143                  .Case("exclude", MMToken::ExcludeKeyword)
1144                  .Case("explicit", MMToken::ExplicitKeyword)
1145                  .Case("export", MMToken::ExportKeyword)
1146                  .Case("extern", MMToken::ExternKeyword)
1147                  .Case("framework", MMToken::FrameworkKeyword)
1148                  .Case("header", MMToken::HeaderKeyword)
1149                  .Case("link", MMToken::LinkKeyword)
1150                  .Case("module", MMToken::ModuleKeyword)
1151                  .Case("private", MMToken::PrivateKeyword)
1152                  .Case("requires", MMToken::RequiresKeyword)
1153                  .Case("textual", MMToken::TextualKeyword)
1154                  .Case("umbrella", MMToken::UmbrellaKeyword)
1155                  .Case("use", MMToken::UseKeyword)
1156                  .Default(MMToken::Identifier);
1157     break;
1158   }
1159 
1160   case tok::comma:
1161     Tok.Kind = MMToken::Comma;
1162     break;
1163 
1164   case tok::eof:
1165     Tok.Kind = MMToken::EndOfFile;
1166     break;
1167 
1168   case tok::l_brace:
1169     Tok.Kind = MMToken::LBrace;
1170     break;
1171 
1172   case tok::l_square:
1173     Tok.Kind = MMToken::LSquare;
1174     break;
1175 
1176   case tok::period:
1177     Tok.Kind = MMToken::Period;
1178     break;
1179 
1180   case tok::r_brace:
1181     Tok.Kind = MMToken::RBrace;
1182     break;
1183 
1184   case tok::r_square:
1185     Tok.Kind = MMToken::RSquare;
1186     break;
1187 
1188   case tok::star:
1189     Tok.Kind = MMToken::Star;
1190     break;
1191 
1192   case tok::exclaim:
1193     Tok.Kind = MMToken::Exclaim;
1194     break;
1195 
1196   case tok::string_literal: {
1197     if (LToken.hasUDSuffix()) {
1198       Diags.Report(LToken.getLocation(), diag::err_invalid_string_udl);
1199       HadError = true;
1200       goto retry;
1201     }
1202 
1203     // Parse the string literal.
1204     LangOptions LangOpts;
1205     StringLiteralParser StringLiteral(LToken, SourceMgr, LangOpts, *Target);
1206     if (StringLiteral.hadError)
1207       goto retry;
1208 
1209     // Copy the string literal into our string data allocator.
1210     unsigned Length = StringLiteral.GetStringLength();
1211     char *Saved = StringData.Allocate<char>(Length + 1);
1212     memcpy(Saved, StringLiteral.GetString().data(), Length);
1213     Saved[Length] = 0;
1214 
1215     // Form the token.
1216     Tok.Kind = MMToken::StringLiteral;
1217     Tok.StringData = Saved;
1218     Tok.StringLength = Length;
1219     break;
1220   }
1221 
1222   case tok::comment:
1223     goto retry;
1224 
1225   default:
1226     Diags.Report(LToken.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     if (Existing->DefinitionLoc.isInvalid() && !ActiveModule) {
1456       // Skip the module definition.
1457       skipUntil(MMToken::RBrace);
1458       if (Tok.is(MMToken::RBrace))
1459         consumeToken();
1460       else {
1461         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1462         Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1463         HadError = true;
1464       }
1465       return;
1466     }
1467 
1468     Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition)
1469       << ModuleName;
1470     Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition);
1471 
1472     // Skip the module definition.
1473     skipUntil(MMToken::RBrace);
1474     if (Tok.is(MMToken::RBrace))
1475       consumeToken();
1476 
1477     HadError = true;
1478     return;
1479   }
1480 
1481   // Start defining this module.
1482   ActiveModule = Map.findOrCreateModule(ModuleName, ActiveModule, Framework,
1483                                         Explicit).first;
1484   ActiveModule->DefinitionLoc = ModuleNameLoc;
1485   if (Attrs.IsSystem || IsSystem)
1486     ActiveModule->IsSystem = true;
1487   if (Attrs.IsExternC)
1488     ActiveModule->IsExternC = true;
1489   if (Attrs.NoUndeclaredIncludes ||
1490       (!ActiveModule->Parent && ModuleName == "Darwin"))
1491     ActiveModule->NoUndeclaredIncludes = true;
1492   ActiveModule->Directory = Directory;
1493 
1494   bool Done = false;
1495   do {
1496     switch (Tok.Kind) {
1497     case MMToken::EndOfFile:
1498     case MMToken::RBrace:
1499       Done = true;
1500       break;
1501 
1502     case MMToken::ConfigMacros:
1503       parseConfigMacros();
1504       break;
1505 
1506     case MMToken::Conflict:
1507       parseConflict();
1508       break;
1509 
1510     case MMToken::ExplicitKeyword:
1511     case MMToken::ExternKeyword:
1512     case MMToken::FrameworkKeyword:
1513     case MMToken::ModuleKeyword:
1514       parseModuleDecl();
1515       break;
1516 
1517     case MMToken::ExportKeyword:
1518       parseExportDecl();
1519       break;
1520 
1521     case MMToken::UseKeyword:
1522       parseUseDecl();
1523       break;
1524 
1525     case MMToken::RequiresKeyword:
1526       parseRequiresDecl();
1527       break;
1528 
1529     case MMToken::TextualKeyword:
1530       parseHeaderDecl(MMToken::TextualKeyword, consumeToken());
1531       break;
1532 
1533     case MMToken::UmbrellaKeyword: {
1534       SourceLocation UmbrellaLoc = consumeToken();
1535       if (Tok.is(MMToken::HeaderKeyword))
1536         parseHeaderDecl(MMToken::UmbrellaKeyword, UmbrellaLoc);
1537       else
1538         parseUmbrellaDirDecl(UmbrellaLoc);
1539       break;
1540     }
1541 
1542     case MMToken::ExcludeKeyword:
1543       parseHeaderDecl(MMToken::ExcludeKeyword, consumeToken());
1544       break;
1545 
1546     case MMToken::PrivateKeyword:
1547       parseHeaderDecl(MMToken::PrivateKeyword, consumeToken());
1548       break;
1549 
1550     case MMToken::HeaderKeyword:
1551       parseHeaderDecl(MMToken::HeaderKeyword, consumeToken());
1552       break;
1553 
1554     case MMToken::LinkKeyword:
1555       parseLinkDecl();
1556       break;
1557 
1558     default:
1559       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member);
1560       consumeToken();
1561       break;
1562     }
1563   } while (!Done);
1564 
1565   if (Tok.is(MMToken::RBrace))
1566     consumeToken();
1567   else {
1568     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1569     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1570     HadError = true;
1571   }
1572 
1573   // If the active module is a top-level framework, and there are no link
1574   // libraries, automatically link against the framework.
1575   if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() &&
1576       ActiveModule->LinkLibraries.empty()) {
1577     inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager());
1578   }
1579 
1580   // If the module meets all requirements but is still unavailable, mark the
1581   // whole tree as unavailable to prevent it from building.
1582   if (!ActiveModule->IsAvailable && !ActiveModule->IsMissingRequirement &&
1583       ActiveModule->Parent) {
1584     ActiveModule->getTopLevelModule()->markUnavailable();
1585     ActiveModule->getTopLevelModule()->MissingHeaders.append(
1586       ActiveModule->MissingHeaders.begin(), ActiveModule->MissingHeaders.end());
1587   }
1588 
1589   // We're done parsing this module. Pop back to the previous module.
1590   ActiveModule = PreviousActiveModule;
1591 }
1592 
1593 /// \brief Parse an extern module declaration.
1594 ///
1595 ///   extern module-declaration:
1596 ///     'extern' 'module' module-id string-literal
1597 void ModuleMapParser::parseExternModuleDecl() {
1598   assert(Tok.is(MMToken::ExternKeyword));
1599   SourceLocation ExternLoc = consumeToken(); // 'extern' keyword
1600 
1601   // Parse 'module' keyword.
1602   if (!Tok.is(MMToken::ModuleKeyword)) {
1603     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1604     consumeToken();
1605     HadError = true;
1606     return;
1607   }
1608   consumeToken(); // 'module' keyword
1609 
1610   // Parse the module name.
1611   ModuleId Id;
1612   if (parseModuleId(Id)) {
1613     HadError = true;
1614     return;
1615   }
1616 
1617   // Parse the referenced module map file name.
1618   if (!Tok.is(MMToken::StringLiteral)) {
1619     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_mmap_file);
1620     HadError = true;
1621     return;
1622   }
1623   std::string FileName = Tok.getString();
1624   consumeToken(); // filename
1625 
1626   StringRef FileNameRef = FileName;
1627   SmallString<128> ModuleMapFileName;
1628   if (llvm::sys::path::is_relative(FileNameRef)) {
1629     ModuleMapFileName += Directory->getName();
1630     llvm::sys::path::append(ModuleMapFileName, FileName);
1631     FileNameRef = ModuleMapFileName;
1632   }
1633   if (const FileEntry *File = SourceMgr.getFileManager().getFile(FileNameRef))
1634     Map.parseModuleMapFile(
1635         File, /*IsSystem=*/false,
1636         Map.HeaderInfo.getHeaderSearchOpts().ModuleMapFileHomeIsCwd
1637             ? Directory
1638             : File->getDir(), ExternLoc);
1639 }
1640 
1641 /// Whether to add the requirement \p Feature to the module \p M.
1642 ///
1643 /// This preserves backwards compatibility for two hacks in the Darwin system
1644 /// module map files:
1645 ///
1646 /// 1. The use of 'requires excluded' to make headers non-modular, which
1647 ///    should really be mapped to 'textual' now that we have this feature.  We
1648 ///    drop the 'excluded' requirement, and set \p IsRequiresExcludedHack to
1649 ///    true.  Later, this bit will be used to map all the headers inside this
1650 ///    module to 'textual'.
1651 ///
1652 ///    This affects Darwin.C.excluded (for assert.h) and Tcl.Private.
1653 ///
1654 /// 2. Removes a bogus cplusplus requirement from IOKit.avc.  This requirement
1655 ///    was never correct and causes issues now that we check it, so drop it.
1656 static bool shouldAddRequirement(Module *M, StringRef Feature,
1657                                  bool &IsRequiresExcludedHack) {
1658   static const StringRef DarwinCExcluded[] = {"Darwin", "C", "excluded"};
1659   static const StringRef TclPrivate[] = {"Tcl", "Private"};
1660   static const StringRef IOKitAVC[] = {"IOKit", "avc"};
1661 
1662   if (Feature == "excluded" && (M->fullModuleNameIs(DarwinCExcluded) ||
1663                                 M->fullModuleNameIs(TclPrivate))) {
1664     IsRequiresExcludedHack = true;
1665     return false;
1666   } else if (Feature == "cplusplus" && M->fullModuleNameIs(IOKitAVC)) {
1667     return false;
1668   }
1669 
1670   return true;
1671 }
1672 
1673 /// \brief Parse a requires declaration.
1674 ///
1675 ///   requires-declaration:
1676 ///     'requires' feature-list
1677 ///
1678 ///   feature-list:
1679 ///     feature ',' feature-list
1680 ///     feature
1681 ///
1682 ///   feature:
1683 ///     '!'[opt] identifier
1684 void ModuleMapParser::parseRequiresDecl() {
1685   assert(Tok.is(MMToken::RequiresKeyword));
1686 
1687   // Parse 'requires' keyword.
1688   consumeToken();
1689 
1690   // Parse the feature-list.
1691   do {
1692     bool RequiredState = true;
1693     if (Tok.is(MMToken::Exclaim)) {
1694       RequiredState = false;
1695       consumeToken();
1696     }
1697 
1698     if (!Tok.is(MMToken::Identifier)) {
1699       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature);
1700       HadError = true;
1701       return;
1702     }
1703 
1704     // Consume the feature name.
1705     std::string Feature = Tok.getString();
1706     consumeToken();
1707 
1708     bool IsRequiresExcludedHack = false;
1709     bool ShouldAddRequirement =
1710         shouldAddRequirement(ActiveModule, Feature, IsRequiresExcludedHack);
1711 
1712     if (IsRequiresExcludedHack)
1713       UsesRequiresExcludedHack.insert(ActiveModule);
1714 
1715     if (ShouldAddRequirement) {
1716       // Add this feature.
1717       ActiveModule->addRequirement(Feature, RequiredState, Map.LangOpts,
1718                                    *Map.Target);
1719     }
1720 
1721     if (!Tok.is(MMToken::Comma))
1722       break;
1723 
1724     // Consume the comma.
1725     consumeToken();
1726   } while (true);
1727 }
1728 
1729 /// \brief Append to \p Paths the set of paths needed to get to the
1730 /// subframework in which the given module lives.
1731 static void appendSubframeworkPaths(Module *Mod,
1732                                     SmallVectorImpl<char> &Path) {
1733   // Collect the framework names from the given module to the top-level module.
1734   SmallVector<StringRef, 2> Paths;
1735   for (; Mod; Mod = Mod->Parent) {
1736     if (Mod->IsFramework)
1737       Paths.push_back(Mod->Name);
1738   }
1739 
1740   if (Paths.empty())
1741     return;
1742 
1743   // Add Frameworks/Name.framework for each subframework.
1744   for (unsigned I = Paths.size() - 1; I != 0; --I)
1745     llvm::sys::path::append(Path, "Frameworks", Paths[I-1] + ".framework");
1746 }
1747 
1748 /// \brief Parse a header declaration.
1749 ///
1750 ///   header-declaration:
1751 ///     'textual'[opt] 'header' string-literal
1752 ///     'private' 'textual'[opt] 'header' string-literal
1753 ///     'exclude' 'header' string-literal
1754 ///     'umbrella' 'header' string-literal
1755 ///
1756 /// FIXME: Support 'private textual header'.
1757 void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken,
1758                                       SourceLocation LeadingLoc) {
1759   // We've already consumed the first token.
1760   ModuleMap::ModuleHeaderRole Role = ModuleMap::NormalHeader;
1761   if (LeadingToken == MMToken::PrivateKeyword) {
1762     Role = ModuleMap::PrivateHeader;
1763     // 'private' may optionally be followed by 'textual'.
1764     if (Tok.is(MMToken::TextualKeyword)) {
1765       LeadingToken = Tok.Kind;
1766       consumeToken();
1767     }
1768   }
1769 
1770   if (LeadingToken == MMToken::TextualKeyword)
1771     Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader);
1772 
1773   if (UsesRequiresExcludedHack.count(ActiveModule)) {
1774     // Mark this header 'textual' (see doc comment for
1775     // Module::UsesRequiresExcludedHack).
1776     Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader);
1777   }
1778 
1779   if (LeadingToken != MMToken::HeaderKeyword) {
1780     if (!Tok.is(MMToken::HeaderKeyword)) {
1781       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1782           << (LeadingToken == MMToken::PrivateKeyword ? "private" :
1783               LeadingToken == MMToken::ExcludeKeyword ? "exclude" :
1784               LeadingToken == MMToken::TextualKeyword ? "textual" : "umbrella");
1785       return;
1786     }
1787     consumeToken();
1788   }
1789 
1790   // Parse the header name.
1791   if (!Tok.is(MMToken::StringLiteral)) {
1792     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1793       << "header";
1794     HadError = true;
1795     return;
1796   }
1797   Module::UnresolvedHeaderDirective Header;
1798   Header.FileName = Tok.getString();
1799   Header.FileNameLoc = consumeToken();
1800 
1801   // Check whether we already have an umbrella.
1802   if (LeadingToken == MMToken::UmbrellaKeyword && ActiveModule->Umbrella) {
1803     Diags.Report(Header.FileNameLoc, diag::err_mmap_umbrella_clash)
1804       << ActiveModule->getFullModuleName();
1805     HadError = true;
1806     return;
1807   }
1808 
1809   // Look for this file.
1810   const FileEntry *File = nullptr;
1811   const FileEntry *BuiltinFile = nullptr;
1812   SmallString<128> RelativePathName;
1813   if (llvm::sys::path::is_absolute(Header.FileName)) {
1814     RelativePathName = Header.FileName;
1815     File = SourceMgr.getFileManager().getFile(RelativePathName);
1816   } else {
1817     // Search for the header file within the search directory.
1818     SmallString<128> FullPathName(Directory->getName());
1819     unsigned FullPathLength = FullPathName.size();
1820 
1821     if (ActiveModule->isPartOfFramework()) {
1822       appendSubframeworkPaths(ActiveModule, RelativePathName);
1823 
1824       // Check whether this file is in the public headers.
1825       llvm::sys::path::append(RelativePathName, "Headers", Header.FileName);
1826       llvm::sys::path::append(FullPathName, RelativePathName);
1827       File = SourceMgr.getFileManager().getFile(FullPathName);
1828 
1829       if (!File) {
1830         // Check whether this file is in the private headers.
1831         // FIXME: Should we retain the subframework paths here?
1832         RelativePathName.clear();
1833         FullPathName.resize(FullPathLength);
1834         llvm::sys::path::append(RelativePathName, "PrivateHeaders",
1835                                 Header.FileName);
1836         llvm::sys::path::append(FullPathName, RelativePathName);
1837         File = SourceMgr.getFileManager().getFile(FullPathName);
1838       }
1839     } else {
1840       // Lookup for normal headers.
1841       llvm::sys::path::append(RelativePathName, Header.FileName);
1842       llvm::sys::path::append(FullPathName, RelativePathName);
1843       File = SourceMgr.getFileManager().getFile(FullPathName);
1844 
1845       // If this is a system module with a top-level header, this header
1846       // may have a counterpart (or replacement) in the set of headers
1847       // supplied by Clang. Find that builtin header.
1848       if (ActiveModule->IsSystem && LeadingToken != MMToken::UmbrellaKeyword &&
1849           BuiltinIncludeDir && BuiltinIncludeDir != Directory &&
1850           isBuiltinHeader(Header.FileName)) {
1851         SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName());
1852         llvm::sys::path::append(BuiltinPathName, Header.FileName);
1853         BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName);
1854 
1855         // If Clang supplies this header but the underlying system does not,
1856         // just silently swap in our builtin version. Otherwise, we'll end
1857         // up adding both (later).
1858         if (BuiltinFile && !File) {
1859           File = BuiltinFile;
1860           RelativePathName = BuiltinPathName;
1861           BuiltinFile = nullptr;
1862         }
1863       }
1864     }
1865   }
1866 
1867   // FIXME: We shouldn't be eagerly stat'ing every file named in a module map.
1868   // Come up with a lazy way to do this.
1869   if (File) {
1870     if (LeadingToken == MMToken::UmbrellaKeyword) {
1871       const DirectoryEntry *UmbrellaDir = File->getDir();
1872       if (Module *UmbrellaModule = Map.UmbrellaDirs[UmbrellaDir]) {
1873         Diags.Report(LeadingLoc, diag::err_mmap_umbrella_clash)
1874           << UmbrellaModule->getFullModuleName();
1875         HadError = true;
1876       } else {
1877         // Record this umbrella header.
1878         Map.setUmbrellaHeader(ActiveModule, File, RelativePathName.str());
1879       }
1880     } else if (LeadingToken == MMToken::ExcludeKeyword) {
1881       Module::Header H = {RelativePathName.str(), File};
1882       Map.excludeHeader(ActiveModule, H);
1883     } else {
1884       // If there is a builtin counterpart to this file, add it now so it can
1885       // wrap the system header.
1886       if (BuiltinFile) {
1887         // FIXME: Taking the name from the FileEntry is unstable and can give
1888         // different results depending on how we've previously named that file
1889         // in this build.
1890         Module::Header H = { BuiltinFile->getName(), BuiltinFile };
1891         Map.addHeader(ActiveModule, H, Role);
1892 
1893         // If we have both a builtin and system version of the file, the
1894         // builtin version may want to inject macros into the system header, so
1895         // force the system header to be treated as a textual header in this
1896         // case.
1897         Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader);
1898       }
1899 
1900       // Record this header.
1901       Module::Header H = { RelativePathName.str(), File };
1902       Map.addHeader(ActiveModule, H, Role);
1903     }
1904   } else if (LeadingToken != MMToken::ExcludeKeyword) {
1905     // Ignore excluded header files. They're optional anyway.
1906 
1907     // If we find a module that has a missing header, we mark this module as
1908     // unavailable and store the header directive for displaying diagnostics.
1909     Header.IsUmbrella = LeadingToken == MMToken::UmbrellaKeyword;
1910     ActiveModule->markUnavailable();
1911     ActiveModule->MissingHeaders.push_back(Header);
1912   }
1913 }
1914 
1915 static int compareModuleHeaders(const Module::Header *A,
1916                                 const Module::Header *B) {
1917   return A->NameAsWritten.compare(B->NameAsWritten);
1918 }
1919 
1920 /// \brief Parse an umbrella directory declaration.
1921 ///
1922 ///   umbrella-dir-declaration:
1923 ///     umbrella string-literal
1924 void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) {
1925   // Parse the directory name.
1926   if (!Tok.is(MMToken::StringLiteral)) {
1927     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1928       << "umbrella";
1929     HadError = true;
1930     return;
1931   }
1932 
1933   std::string DirName = Tok.getString();
1934   SourceLocation DirNameLoc = consumeToken();
1935 
1936   // Check whether we already have an umbrella.
1937   if (ActiveModule->Umbrella) {
1938     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash)
1939       << ActiveModule->getFullModuleName();
1940     HadError = true;
1941     return;
1942   }
1943 
1944   // Look for this file.
1945   const DirectoryEntry *Dir = nullptr;
1946   if (llvm::sys::path::is_absolute(DirName))
1947     Dir = SourceMgr.getFileManager().getDirectory(DirName);
1948   else {
1949     SmallString<128> PathName;
1950     PathName = Directory->getName();
1951     llvm::sys::path::append(PathName, DirName);
1952     Dir = SourceMgr.getFileManager().getDirectory(PathName);
1953   }
1954 
1955   if (!Dir) {
1956     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found)
1957       << DirName;
1958     HadError = true;
1959     return;
1960   }
1961 
1962   if (UsesRequiresExcludedHack.count(ActiveModule)) {
1963     // Mark this header 'textual' (see doc comment for
1964     // ModuleMapParser::UsesRequiresExcludedHack). Although iterating over the
1965     // directory is relatively expensive, in practice this only applies to the
1966     // uncommonly used Tcl module on Darwin platforms.
1967     std::error_code EC;
1968     SmallVector<Module::Header, 6> Headers;
1969     vfs::FileSystem &FS = *SourceMgr.getFileManager().getVirtualFileSystem();
1970     for (vfs::recursive_directory_iterator I(FS, Dir->getName(), EC), E;
1971          I != E && !EC; I.increment(EC)) {
1972       if (const FileEntry *FE =
1973               SourceMgr.getFileManager().getFile(I->getName())) {
1974 
1975         Module::Header Header = {I->getName(), FE};
1976         Headers.push_back(std::move(Header));
1977       }
1978     }
1979 
1980     // Sort header paths so that the pcm doesn't depend on iteration order.
1981     llvm::array_pod_sort(Headers.begin(), Headers.end(), compareModuleHeaders);
1982 
1983     for (auto &Header : Headers)
1984       Map.addHeader(ActiveModule, std::move(Header), ModuleMap::TextualHeader);
1985     return;
1986   }
1987 
1988   if (Module *OwningModule = Map.UmbrellaDirs[Dir]) {
1989     Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
1990       << OwningModule->getFullModuleName();
1991     HadError = true;
1992     return;
1993   }
1994 
1995   // Record this umbrella directory.
1996   Map.setUmbrellaDir(ActiveModule, Dir, DirName);
1997 }
1998 
1999 /// \brief Parse a module export declaration.
2000 ///
2001 ///   export-declaration:
2002 ///     'export' wildcard-module-id
2003 ///
2004 ///   wildcard-module-id:
2005 ///     identifier
2006 ///     '*'
2007 ///     identifier '.' wildcard-module-id
2008 void ModuleMapParser::parseExportDecl() {
2009   assert(Tok.is(MMToken::ExportKeyword));
2010   SourceLocation ExportLoc = consumeToken();
2011 
2012   // Parse the module-id with an optional wildcard at the end.
2013   ModuleId ParsedModuleId;
2014   bool Wildcard = false;
2015   do {
2016     // FIXME: Support string-literal module names here.
2017     if (Tok.is(MMToken::Identifier)) {
2018       ParsedModuleId.push_back(std::make_pair(Tok.getString(),
2019                                               Tok.getLocation()));
2020       consumeToken();
2021 
2022       if (Tok.is(MMToken::Period)) {
2023         consumeToken();
2024         continue;
2025       }
2026 
2027       break;
2028     }
2029 
2030     if(Tok.is(MMToken::Star)) {
2031       Wildcard = true;
2032       consumeToken();
2033       break;
2034     }
2035 
2036     Diags.Report(Tok.getLocation(), diag::err_mmap_module_id);
2037     HadError = true;
2038     return;
2039   } while (true);
2040 
2041   Module::UnresolvedExportDecl Unresolved = {
2042     ExportLoc, ParsedModuleId, Wildcard
2043   };
2044   ActiveModule->UnresolvedExports.push_back(Unresolved);
2045 }
2046 
2047 /// \brief Parse a module use declaration.
2048 ///
2049 ///   use-declaration:
2050 ///     'use' wildcard-module-id
2051 void ModuleMapParser::parseUseDecl() {
2052   assert(Tok.is(MMToken::UseKeyword));
2053   auto KWLoc = consumeToken();
2054   // Parse the module-id.
2055   ModuleId ParsedModuleId;
2056   parseModuleId(ParsedModuleId);
2057 
2058   if (ActiveModule->Parent)
2059     Diags.Report(KWLoc, diag::err_mmap_use_decl_submodule);
2060   else
2061     ActiveModule->UnresolvedDirectUses.push_back(ParsedModuleId);
2062 }
2063 
2064 /// \brief Parse a link declaration.
2065 ///
2066 ///   module-declaration:
2067 ///     'link' 'framework'[opt] string-literal
2068 void ModuleMapParser::parseLinkDecl() {
2069   assert(Tok.is(MMToken::LinkKeyword));
2070   SourceLocation LinkLoc = consumeToken();
2071 
2072   // Parse the optional 'framework' keyword.
2073   bool IsFramework = false;
2074   if (Tok.is(MMToken::FrameworkKeyword)) {
2075     consumeToken();
2076     IsFramework = true;
2077   }
2078 
2079   // Parse the library name
2080   if (!Tok.is(MMToken::StringLiteral)) {
2081     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_library_name)
2082       << IsFramework << SourceRange(LinkLoc);
2083     HadError = true;
2084     return;
2085   }
2086 
2087   std::string LibraryName = Tok.getString();
2088   consumeToken();
2089   ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName,
2090                                                             IsFramework));
2091 }
2092 
2093 /// \brief Parse a configuration macro declaration.
2094 ///
2095 ///   module-declaration:
2096 ///     'config_macros' attributes[opt] config-macro-list?
2097 ///
2098 ///   config-macro-list:
2099 ///     identifier (',' identifier)?
2100 void ModuleMapParser::parseConfigMacros() {
2101   assert(Tok.is(MMToken::ConfigMacros));
2102   SourceLocation ConfigMacrosLoc = consumeToken();
2103 
2104   // Only top-level modules can have configuration macros.
2105   if (ActiveModule->Parent) {
2106     Diags.Report(ConfigMacrosLoc, diag::err_mmap_config_macro_submodule);
2107   }
2108 
2109   // Parse the optional attributes.
2110   Attributes Attrs;
2111   if (parseOptionalAttributes(Attrs))
2112     return;
2113 
2114   if (Attrs.IsExhaustive && !ActiveModule->Parent) {
2115     ActiveModule->ConfigMacrosExhaustive = true;
2116   }
2117 
2118   // If we don't have an identifier, we're done.
2119   // FIXME: Support macros with the same name as a keyword here.
2120   if (!Tok.is(MMToken::Identifier))
2121     return;
2122 
2123   // Consume the first identifier.
2124   if (!ActiveModule->Parent) {
2125     ActiveModule->ConfigMacros.push_back(Tok.getString().str());
2126   }
2127   consumeToken();
2128 
2129   do {
2130     // If there's a comma, consume it.
2131     if (!Tok.is(MMToken::Comma))
2132       break;
2133     consumeToken();
2134 
2135     // We expect to see a macro name here.
2136     // FIXME: Support macros with the same name as a keyword here.
2137     if (!Tok.is(MMToken::Identifier)) {
2138       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_config_macro);
2139       break;
2140     }
2141 
2142     // Consume the macro name.
2143     if (!ActiveModule->Parent) {
2144       ActiveModule->ConfigMacros.push_back(Tok.getString().str());
2145     }
2146     consumeToken();
2147   } while (true);
2148 }
2149 
2150 /// \brief Format a module-id into a string.
2151 static std::string formatModuleId(const ModuleId &Id) {
2152   std::string result;
2153   {
2154     llvm::raw_string_ostream OS(result);
2155 
2156     for (unsigned I = 0, N = Id.size(); I != N; ++I) {
2157       if (I)
2158         OS << ".";
2159       OS << Id[I].first;
2160     }
2161   }
2162 
2163   return result;
2164 }
2165 
2166 /// \brief Parse a conflict declaration.
2167 ///
2168 ///   module-declaration:
2169 ///     'conflict' module-id ',' string-literal
2170 void ModuleMapParser::parseConflict() {
2171   assert(Tok.is(MMToken::Conflict));
2172   SourceLocation ConflictLoc = consumeToken();
2173   Module::UnresolvedConflict Conflict;
2174 
2175   // Parse the module-id.
2176   if (parseModuleId(Conflict.Id))
2177     return;
2178 
2179   // Parse the ','.
2180   if (!Tok.is(MMToken::Comma)) {
2181     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_comma)
2182       << SourceRange(ConflictLoc);
2183     return;
2184   }
2185   consumeToken();
2186 
2187   // Parse the message.
2188   if (!Tok.is(MMToken::StringLiteral)) {
2189     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_message)
2190       << formatModuleId(Conflict.Id);
2191     return;
2192   }
2193   Conflict.Message = Tok.getString().str();
2194   consumeToken();
2195 
2196   // Add this unresolved conflict.
2197   ActiveModule->UnresolvedConflicts.push_back(Conflict);
2198 }
2199 
2200 /// \brief Parse an inferred module declaration (wildcard modules).
2201 ///
2202 ///   module-declaration:
2203 ///     'explicit'[opt] 'framework'[opt] 'module' * attributes[opt]
2204 ///       { inferred-module-member* }
2205 ///
2206 ///   inferred-module-member:
2207 ///     'export' '*'
2208 ///     'exclude' identifier
2209 void ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) {
2210   assert(Tok.is(MMToken::Star));
2211   SourceLocation StarLoc = consumeToken();
2212   bool Failed = false;
2213 
2214   // Inferred modules must be submodules.
2215   if (!ActiveModule && !Framework) {
2216     Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule);
2217     Failed = true;
2218   }
2219 
2220   if (ActiveModule) {
2221     // Inferred modules must have umbrella directories.
2222     if (!Failed && ActiveModule->IsAvailable &&
2223         !ActiveModule->getUmbrellaDir()) {
2224       Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
2225       Failed = true;
2226     }
2227 
2228     // Check for redefinition of an inferred module.
2229     if (!Failed && ActiveModule->InferSubmodules) {
2230       Diags.Report(StarLoc, diag::err_mmap_inferred_redef);
2231       if (ActiveModule->InferredSubmoduleLoc.isValid())
2232         Diags.Report(ActiveModule->InferredSubmoduleLoc,
2233                      diag::note_mmap_prev_definition);
2234       Failed = true;
2235     }
2236 
2237     // Check for the 'framework' keyword, which is not permitted here.
2238     if (Framework) {
2239       Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule);
2240       Framework = false;
2241     }
2242   } else if (Explicit) {
2243     Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework);
2244     Explicit = false;
2245   }
2246 
2247   // If there were any problems with this inferred submodule, skip its body.
2248   if (Failed) {
2249     if (Tok.is(MMToken::LBrace)) {
2250       consumeToken();
2251       skipUntil(MMToken::RBrace);
2252       if (Tok.is(MMToken::RBrace))
2253         consumeToken();
2254     }
2255     HadError = true;
2256     return;
2257   }
2258 
2259   // Parse optional attributes.
2260   Attributes Attrs;
2261   if (parseOptionalAttributes(Attrs))
2262     return;
2263 
2264   if (ActiveModule) {
2265     // Note that we have an inferred submodule.
2266     ActiveModule->InferSubmodules = true;
2267     ActiveModule->InferredSubmoduleLoc = StarLoc;
2268     ActiveModule->InferExplicitSubmodules = Explicit;
2269   } else {
2270     // We'll be inferring framework modules for this directory.
2271     Map.InferredDirectories[Directory].InferModules = true;
2272     Map.InferredDirectories[Directory].Attrs = Attrs;
2273     Map.InferredDirectories[Directory].ModuleMapFile = ModuleMapFile;
2274     // FIXME: Handle the 'framework' keyword.
2275   }
2276 
2277   // Parse the opening brace.
2278   if (!Tok.is(MMToken::LBrace)) {
2279     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard);
2280     HadError = true;
2281     return;
2282   }
2283   SourceLocation LBraceLoc = consumeToken();
2284 
2285   // Parse the body of the inferred submodule.
2286   bool Done = false;
2287   do {
2288     switch (Tok.Kind) {
2289     case MMToken::EndOfFile:
2290     case MMToken::RBrace:
2291       Done = true;
2292       break;
2293 
2294     case MMToken::ExcludeKeyword: {
2295       if (ActiveModule) {
2296         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2297           << (ActiveModule != nullptr);
2298         consumeToken();
2299         break;
2300       }
2301 
2302       consumeToken();
2303       // FIXME: Support string-literal module names here.
2304       if (!Tok.is(MMToken::Identifier)) {
2305         Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name);
2306         break;
2307       }
2308 
2309       Map.InferredDirectories[Directory].ExcludedModules
2310         .push_back(Tok.getString());
2311       consumeToken();
2312       break;
2313     }
2314 
2315     case MMToken::ExportKeyword:
2316       if (!ActiveModule) {
2317         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2318           << (ActiveModule != nullptr);
2319         consumeToken();
2320         break;
2321       }
2322 
2323       consumeToken();
2324       if (Tok.is(MMToken::Star))
2325         ActiveModule->InferExportWildcard = true;
2326       else
2327         Diags.Report(Tok.getLocation(),
2328                      diag::err_mmap_expected_export_wildcard);
2329       consumeToken();
2330       break;
2331 
2332     case MMToken::ExplicitKeyword:
2333     case MMToken::ModuleKeyword:
2334     case MMToken::HeaderKeyword:
2335     case MMToken::PrivateKeyword:
2336     case MMToken::UmbrellaKeyword:
2337     default:
2338       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
2339           << (ActiveModule != nullptr);
2340       consumeToken();
2341       break;
2342     }
2343   } while (!Done);
2344 
2345   if (Tok.is(MMToken::RBrace))
2346     consumeToken();
2347   else {
2348     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
2349     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
2350     HadError = true;
2351   }
2352 }
2353 
2354 /// \brief Parse optional attributes.
2355 ///
2356 ///   attributes:
2357 ///     attribute attributes
2358 ///     attribute
2359 ///
2360 ///   attribute:
2361 ///     [ identifier ]
2362 ///
2363 /// \param Attrs Will be filled in with the parsed attributes.
2364 ///
2365 /// \returns true if an error occurred, false otherwise.
2366 bool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) {
2367   bool HadError = false;
2368 
2369   while (Tok.is(MMToken::LSquare)) {
2370     // Consume the '['.
2371     SourceLocation LSquareLoc = consumeToken();
2372 
2373     // Check whether we have an attribute name here.
2374     if (!Tok.is(MMToken::Identifier)) {
2375       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute);
2376       skipUntil(MMToken::RSquare);
2377       if (Tok.is(MMToken::RSquare))
2378         consumeToken();
2379       HadError = true;
2380     }
2381 
2382     // Decode the attribute name.
2383     AttributeKind Attribute
2384       = llvm::StringSwitch<AttributeKind>(Tok.getString())
2385           .Case("exhaustive", AT_exhaustive)
2386           .Case("extern_c", AT_extern_c)
2387           .Case("no_undeclared_includes", AT_no_undeclared_includes)
2388           .Case("system", AT_system)
2389           .Default(AT_unknown);
2390     switch (Attribute) {
2391     case AT_unknown:
2392       Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute)
2393         << Tok.getString();
2394       break;
2395 
2396     case AT_system:
2397       Attrs.IsSystem = true;
2398       break;
2399 
2400     case AT_extern_c:
2401       Attrs.IsExternC = true;
2402       break;
2403 
2404     case AT_exhaustive:
2405       Attrs.IsExhaustive = true;
2406       break;
2407 
2408     case AT_no_undeclared_includes:
2409       Attrs.NoUndeclaredIncludes = true;
2410       break;
2411     }
2412     consumeToken();
2413 
2414     // Consume the ']'.
2415     if (!Tok.is(MMToken::RSquare)) {
2416       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare);
2417       Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match);
2418       skipUntil(MMToken::RSquare);
2419       HadError = true;
2420     }
2421 
2422     if (Tok.is(MMToken::RSquare))
2423       consumeToken();
2424   }
2425 
2426   return HadError;
2427 }
2428 
2429 /// \brief Parse a module map file.
2430 ///
2431 ///   module-map-file:
2432 ///     module-declaration*
2433 bool ModuleMapParser::parseModuleMapFile() {
2434   do {
2435     switch (Tok.Kind) {
2436     case MMToken::EndOfFile:
2437       return HadError;
2438 
2439     case MMToken::ExplicitKeyword:
2440     case MMToken::ExternKeyword:
2441     case MMToken::ModuleKeyword:
2442     case MMToken::FrameworkKeyword:
2443       parseModuleDecl();
2444       break;
2445 
2446     case MMToken::Comma:
2447     case MMToken::ConfigMacros:
2448     case MMToken::Conflict:
2449     case MMToken::Exclaim:
2450     case MMToken::ExcludeKeyword:
2451     case MMToken::ExportKeyword:
2452     case MMToken::HeaderKeyword:
2453     case MMToken::Identifier:
2454     case MMToken::LBrace:
2455     case MMToken::LinkKeyword:
2456     case MMToken::LSquare:
2457     case MMToken::Period:
2458     case MMToken::PrivateKeyword:
2459     case MMToken::RBrace:
2460     case MMToken::RSquare:
2461     case MMToken::RequiresKeyword:
2462     case MMToken::Star:
2463     case MMToken::StringLiteral:
2464     case MMToken::TextualKeyword:
2465     case MMToken::UmbrellaKeyword:
2466     case MMToken::UseKeyword:
2467       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
2468       HadError = true;
2469       consumeToken();
2470       break;
2471     }
2472   } while (true);
2473 }
2474 
2475 bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem,
2476                                    const DirectoryEntry *Dir,
2477                                    SourceLocation ExternModuleLoc) {
2478   llvm::DenseMap<const FileEntry *, bool>::iterator Known
2479     = ParsedModuleMap.find(File);
2480   if (Known != ParsedModuleMap.end())
2481     return Known->second;
2482 
2483   assert(Target && "Missing target information");
2484   auto FileCharacter = IsSystem ? SrcMgr::C_System : SrcMgr::C_User;
2485   FileID ID = SourceMgr.createFileID(File, ExternModuleLoc, FileCharacter);
2486   const llvm::MemoryBuffer *Buffer = SourceMgr.getBuffer(ID);
2487   if (!Buffer)
2488     return ParsedModuleMap[File] = true;
2489 
2490   // Parse this module map file.
2491   Lexer L(ID, SourceMgr.getBuffer(ID), SourceMgr, MMapLangOpts);
2492   SourceLocation Start = L.getSourceLocation();
2493   ModuleMapParser Parser(L, SourceMgr, Target, Diags, *this, File, Dir,
2494                          BuiltinIncludeDir, IsSystem);
2495   bool Result = Parser.parseModuleMapFile();
2496   ParsedModuleMap[File] = Result;
2497 
2498   // Notify callbacks that we parsed it.
2499   for (const auto &Cb : Callbacks)
2500     Cb->moduleMapFileRead(Start, *File, IsSystem);
2501   return Result;
2502 }
2503