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