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