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