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