xref: /llvm-project/clang/lib/Lex/ModuleMap.cpp (revision bf8da9d7062b143f63596743232df6d05e6e8e34)
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/Lex/Lexer.h"
16 #include "clang/Lex/LiteralSupport.h"
17 #include "clang/Lex/LexDiagnostic.h"
18 #include "clang/Basic/Diagnostic.h"
19 #include "clang/Basic/FileManager.h"
20 #include "clang/Basic/TargetInfo.h"
21 #include "clang/Basic/TargetOptions.h"
22 #include "llvm/Support/Allocator.h"
23 #include "llvm/Support/FileSystem.h"
24 #include "llvm/Support/Host.h"
25 #include "llvm/Support/PathV2.h"
26 #include "llvm/Support/raw_ostream.h"
27 #include "llvm/ADT/StringRef.h"
28 #include "llvm/ADT/StringSwitch.h"
29 using namespace clang;
30 
31 Module::ExportDecl
32 ModuleMap::resolveExport(Module *Mod,
33                          const Module::UnresolvedExportDecl &Unresolved,
34                          bool Complain) {
35   // We may have just a wildcard.
36   if (Unresolved.Id.empty()) {
37     assert(Unresolved.Wildcard && "Invalid unresolved export");
38     return Module::ExportDecl(0, true);
39   }
40 
41   // Find the starting module.
42   Module *Context = lookupModuleUnqualified(Unresolved.Id[0].first, Mod);
43   if (!Context) {
44     if (Complain)
45       Diags->Report(Unresolved.Id[0].second,
46                     diag::err_mmap_missing_module_unqualified)
47         << Unresolved.Id[0].first << Mod->getFullModuleName();
48 
49     return Module::ExportDecl();
50   }
51 
52   // Dig into the module path.
53   for (unsigned I = 1, N = Unresolved.Id.size(); I != N; ++I) {
54     Module *Sub = lookupModuleQualified(Unresolved.Id[I].first,
55                                         Context);
56     if (!Sub) {
57       if (Complain)
58         Diags->Report(Unresolved.Id[I].second,
59                       diag::err_mmap_missing_module_qualified)
60           << Unresolved.Id[I].first << Context->getFullModuleName()
61           << SourceRange(Unresolved.Id[0].second, Unresolved.Id[I-1].second);
62 
63       return Module::ExportDecl();
64     }
65 
66     Context = Sub;
67   }
68 
69   return Module::ExportDecl(Context, Unresolved.Wildcard);
70 }
71 
72 ModuleMap::ModuleMap(FileManager &FileMgr, const DiagnosticConsumer &DC,
73                      const LangOptions &LangOpts, const TargetInfo *Target)
74   : LangOpts(LangOpts), Target(Target), BuiltinIncludeDir(0)
75 {
76   llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs);
77   Diags = llvm::IntrusiveRefCntPtr<DiagnosticsEngine>(
78             new DiagnosticsEngine(DiagIDs));
79   Diags->setClient(DC.clone(*Diags), /*ShouldOwnClient=*/true);
80   SourceMgr = new SourceManager(*Diags, FileMgr);
81 }
82 
83 ModuleMap::~ModuleMap() {
84   for (llvm::StringMap<Module *>::iterator I = Modules.begin(),
85                                         IEnd = Modules.end();
86        I != IEnd; ++I) {
87     delete I->getValue();
88   }
89 
90   delete SourceMgr;
91 }
92 
93 void ModuleMap::setTarget(const TargetInfo &Target) {
94   assert((!this->Target || this->Target == &Target) &&
95          "Improper target override");
96   this->Target = &Target;
97 }
98 
99 Module *ModuleMap::findModuleForHeader(const FileEntry *File) {
100   llvm::DenseMap<const FileEntry *, Module *>::iterator Known
101     = Headers.find(File);
102   if (Known != Headers.end()) {
103     // If a header corresponds to an unavailable module, don't report
104     // that it maps to anything.
105     if (!Known->second->isAvailable())
106       return 0;
107 
108     return Known->second;
109   }
110 
111   const DirectoryEntry *Dir = File->getDir();
112   llvm::SmallVector<const DirectoryEntry *, 2> SkippedDirs;
113   StringRef DirName = Dir->getName();
114 
115   // Keep walking up the directory hierarchy, looking for a directory with
116   // an umbrella header.
117   do {
118     llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir
119       = UmbrellaDirs.find(Dir);
120     if (KnownDir != UmbrellaDirs.end()) {
121       Module *Result = KnownDir->second;
122 
123       // Search up the module stack until we find a module with an umbrella
124       // directory.
125       Module *UmbrellaModule = Result;
126       while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
127         UmbrellaModule = UmbrellaModule->Parent;
128 
129       if (UmbrellaModule->InferSubmodules) {
130         // Infer submodules for each of the directories we found between
131         // the directory of the umbrella header and the directory where
132         // the actual header is located.
133         bool Explicit = UmbrellaModule->InferExplicitSubmodules;
134 
135         for (unsigned I = SkippedDirs.size(); I != 0; --I) {
136           // Find or create the module that corresponds to this directory name.
137           StringRef Name = llvm::sys::path::stem(SkippedDirs[I-1]->getName());
138           Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
139                                       Explicit).first;
140 
141           // Associate the module and the directory.
142           UmbrellaDirs[SkippedDirs[I-1]] = Result;
143 
144           // If inferred submodules export everything they import, add a
145           // wildcard to the set of exports.
146           if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
147             Result->Exports.push_back(Module::ExportDecl(0, true));
148         }
149 
150         // Infer a submodule with the same name as this header file.
151         StringRef Name = llvm::sys::path::stem(File->getName());
152         Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
153                                     Explicit).first;
154 
155         // If inferred submodules export everything they import, add a
156         // wildcard to the set of exports.
157         if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
158           Result->Exports.push_back(Module::ExportDecl(0, true));
159       } else {
160         // Record each of the directories we stepped through as being part of
161         // the module we found, since the umbrella header covers them all.
162         for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I)
163           UmbrellaDirs[SkippedDirs[I]] = Result;
164       }
165 
166       Headers[File] = Result;
167 
168       // If a header corresponds to an unavailable module, don't report
169       // that it maps to anything.
170       if (!Result->isAvailable())
171         return 0;
172 
173       return Result;
174     }
175 
176     SkippedDirs.push_back(Dir);
177 
178     // Retrieve our parent path.
179     DirName = llvm::sys::path::parent_path(DirName);
180     if (DirName.empty())
181       break;
182 
183     // Resolve the parent path to a directory entry.
184     Dir = SourceMgr->getFileManager().getDirectory(DirName);
185   } while (Dir);
186 
187   return 0;
188 }
189 
190 bool ModuleMap::isHeaderInUnavailableModule(const FileEntry *Header) {
191   llvm::DenseMap<const FileEntry *, Module *>::iterator Known
192     = Headers.find(Header);
193   if (Known != Headers.end())
194     return !Known->second->isAvailable();
195 
196   const DirectoryEntry *Dir = Header->getDir();
197   llvm::SmallVector<const DirectoryEntry *, 2> SkippedDirs;
198   StringRef DirName = Dir->getName();
199 
200   // Keep walking up the directory hierarchy, looking for a directory with
201   // an umbrella header.
202   do {
203     llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir
204       = UmbrellaDirs.find(Dir);
205     if (KnownDir != UmbrellaDirs.end()) {
206       Module *Found = KnownDir->second;
207       if (!Found->isAvailable())
208         return true;
209 
210       // Search up the module stack until we find a module with an umbrella
211       // directory.
212       Module *UmbrellaModule = Found;
213       while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
214         UmbrellaModule = UmbrellaModule->Parent;
215 
216       if (UmbrellaModule->InferSubmodules) {
217         for (unsigned I = SkippedDirs.size(); I != 0; --I) {
218           // Find or create the module that corresponds to this directory name.
219           StringRef Name = llvm::sys::path::stem(SkippedDirs[I-1]->getName());
220           Found = lookupModuleQualified(Name, Found);
221           if (!Found)
222             return false;
223           if (!Found->isAvailable())
224             return true;
225         }
226 
227         // Infer a submodule with the same name as this header file.
228         StringRef Name = llvm::sys::path::stem(Header->getName());
229         Found = lookupModuleQualified(Name, Found);
230         if (!Found)
231           return false;
232       }
233 
234       return !Found->isAvailable();
235     }
236 
237     SkippedDirs.push_back(Dir);
238 
239     // Retrieve our parent path.
240     DirName = llvm::sys::path::parent_path(DirName);
241     if (DirName.empty())
242       break;
243 
244     // Resolve the parent path to a directory entry.
245     Dir = SourceMgr->getFileManager().getDirectory(DirName);
246   } while (Dir);
247 
248   return false;
249 }
250 
251 Module *ModuleMap::findModule(StringRef Name) {
252   llvm::StringMap<Module *>::iterator Known = Modules.find(Name);
253   if (Known != Modules.end())
254     return Known->getValue();
255 
256   return 0;
257 }
258 
259 Module *ModuleMap::lookupModuleUnqualified(StringRef Name, Module *Context) {
260   for(; Context; Context = Context->Parent) {
261     if (Module *Sub = lookupModuleQualified(Name, Context))
262       return Sub;
263   }
264 
265   return findModule(Name);
266 }
267 
268 Module *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) {
269   if (!Context)
270     return findModule(Name);
271 
272   return Context->findSubmodule(Name);
273 }
274 
275 std::pair<Module *, bool>
276 ModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework,
277                               bool IsExplicit) {
278   // Try to find an existing module with this name.
279   if (Module *Sub = lookupModuleQualified(Name, Parent))
280     return std::make_pair(Sub, false);
281 
282   // Create a new module with this name.
283   Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework,
284                               IsExplicit);
285   if (!Parent)
286     Modules[Name] = Result;
287   return std::make_pair(Result, true);
288 }
289 
290 Module *
291 ModuleMap::inferFrameworkModule(StringRef ModuleName,
292                                 const DirectoryEntry *FrameworkDir,
293                                 bool IsSystem,
294                                 Module *Parent) {
295   // Check whether we've already found this module.
296   if (Module *Mod = lookupModuleQualified(ModuleName, Parent))
297     return Mod;
298 
299   FileManager &FileMgr = SourceMgr->getFileManager();
300 
301   // Look for an umbrella header.
302   SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName());
303   llvm::sys::path::append(UmbrellaName, "Headers");
304   llvm::sys::path::append(UmbrellaName, ModuleName + ".h");
305   const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName);
306 
307   // FIXME: If there's no umbrella header, we could probably scan the
308   // framework to load *everything*. But, it's not clear that this is a good
309   // idea.
310   if (!UmbrellaHeader)
311     return 0;
312 
313   Module *Result = new Module(ModuleName, SourceLocation(), Parent,
314                               /*IsFramework=*/true, /*IsExplicit=*/false);
315   if (IsSystem)
316     Result->IsSystem = IsSystem;
317 
318   if (!Parent)
319     Modules[ModuleName] = Result;
320 
321   // umbrella header "umbrella-header-name"
322   Result->Umbrella = UmbrellaHeader;
323   Headers[UmbrellaHeader] = Result;
324   UmbrellaDirs[UmbrellaHeader->getDir()] = Result;
325 
326   // export *
327   Result->Exports.push_back(Module::ExportDecl(0, true));
328 
329   // module * { export * }
330   Result->InferSubmodules = true;
331   Result->InferExportWildcard = true;
332 
333   // Look for subframeworks.
334   llvm::error_code EC;
335   SmallString<128> SubframeworksDirName
336     = StringRef(FrameworkDir->getName());
337   llvm::sys::path::append(SubframeworksDirName, "Frameworks");
338   SmallString<128> SubframeworksDirNameNative;
339   llvm::sys::path::native(SubframeworksDirName.str(),
340                           SubframeworksDirNameNative);
341   for (llvm::sys::fs::directory_iterator
342          Dir(SubframeworksDirNameNative.str(), EC), DirEnd;
343        Dir != DirEnd && !EC; Dir.increment(EC)) {
344     if (!StringRef(Dir->path()).endswith(".framework"))
345       continue;
346 
347     if (const DirectoryEntry *SubframeworkDir
348           = FileMgr.getDirectory(Dir->path())) {
349       // FIXME: Do we want to warn about subframeworks without umbrella headers?
350       inferFrameworkModule(llvm::sys::path::stem(Dir->path()), SubframeworkDir,
351                            IsSystem, Result);
352     }
353   }
354 
355   return Result;
356 }
357 
358 void ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader){
359   Headers[UmbrellaHeader] = Mod;
360   Mod->Umbrella = UmbrellaHeader;
361   UmbrellaDirs[UmbrellaHeader->getDir()] = Mod;
362 }
363 
364 void ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir) {
365   Mod->Umbrella = UmbrellaDir;
366   UmbrellaDirs[UmbrellaDir] = Mod;
367 }
368 
369 void ModuleMap::addHeader(Module *Mod, const FileEntry *Header) {
370   Mod->Headers.push_back(Header);
371   Headers[Header] = Mod;
372 }
373 
374 const FileEntry *
375 ModuleMap::getContainingModuleMapFile(Module *Module) {
376   if (Module->DefinitionLoc.isInvalid() || !SourceMgr)
377     return 0;
378 
379   return SourceMgr->getFileEntryForID(
380            SourceMgr->getFileID(Module->DefinitionLoc));
381 }
382 
383 void ModuleMap::dump() {
384   llvm::errs() << "Modules:";
385   for (llvm::StringMap<Module *>::iterator M = Modules.begin(),
386                                         MEnd = Modules.end();
387        M != MEnd; ++M)
388     M->getValue()->print(llvm::errs(), 2);
389 
390   llvm::errs() << "Headers:";
391   for (llvm::DenseMap<const FileEntry *, Module *>::iterator
392             H = Headers.begin(),
393          HEnd = Headers.end();
394        H != HEnd; ++H) {
395     llvm::errs() << "  \"" << H->first->getName() << "\" -> "
396                  << H->second->getFullModuleName() << "\n";
397   }
398 }
399 
400 bool ModuleMap::resolveExports(Module *Mod, bool Complain) {
401   bool HadError = false;
402   for (unsigned I = 0, N = Mod->UnresolvedExports.size(); I != N; ++I) {
403     Module::ExportDecl Export = resolveExport(Mod, Mod->UnresolvedExports[I],
404                                               Complain);
405     if (Export.getPointer() || Export.getInt())
406       Mod->Exports.push_back(Export);
407     else
408       HadError = true;
409   }
410   Mod->UnresolvedExports.clear();
411   return HadError;
412 }
413 
414 Module *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) {
415   if (Loc.isInvalid())
416     return 0;
417 
418   // Use the expansion location to determine which module we're in.
419   FullSourceLoc ExpansionLoc = Loc.getExpansionLoc();
420   if (!ExpansionLoc.isFileID())
421     return 0;
422 
423 
424   const SourceManager &SrcMgr = Loc.getManager();
425   FileID ExpansionFileID = ExpansionLoc.getFileID();
426 
427   while (const FileEntry *ExpansionFile
428            = SrcMgr.getFileEntryForID(ExpansionFileID)) {
429     // Find the module that owns this header (if any).
430     if (Module *Mod = findModuleForHeader(ExpansionFile))
431       return Mod;
432 
433     // No module owns this header, so look up the inclusion chain to see if
434     // any included header has an associated module.
435     SourceLocation IncludeLoc = SrcMgr.getIncludeLoc(ExpansionFileID);
436     if (IncludeLoc.isInvalid())
437       return 0;
438 
439     ExpansionFileID = SrcMgr.getFileID(IncludeLoc);
440   }
441 
442   return 0;
443 }
444 
445 //----------------------------------------------------------------------------//
446 // Module map file parser
447 //----------------------------------------------------------------------------//
448 
449 namespace clang {
450   /// \brief A token in a module map file.
451   struct MMToken {
452     enum TokenKind {
453       Comma,
454       EndOfFile,
455       HeaderKeyword,
456       Identifier,
457       ExplicitKeyword,
458       ExportKeyword,
459       FrameworkKeyword,
460       ModuleKeyword,
461       Period,
462       UmbrellaKeyword,
463       RequiresKeyword,
464       Star,
465       StringLiteral,
466       LBrace,
467       RBrace,
468       LSquare,
469       RSquare
470     } Kind;
471 
472     unsigned Location;
473     unsigned StringLength;
474     const char *StringData;
475 
476     void clear() {
477       Kind = EndOfFile;
478       Location = 0;
479       StringLength = 0;
480       StringData = 0;
481     }
482 
483     bool is(TokenKind K) const { return Kind == K; }
484 
485     SourceLocation getLocation() const {
486       return SourceLocation::getFromRawEncoding(Location);
487     }
488 
489     StringRef getString() const {
490       return StringRef(StringData, StringLength);
491     }
492   };
493 
494   class ModuleMapParser {
495     Lexer &L;
496     SourceManager &SourceMgr;
497     DiagnosticsEngine &Diags;
498     ModuleMap &Map;
499 
500     /// \brief The directory that this module map resides in.
501     const DirectoryEntry *Directory;
502 
503     /// \brief The directory containing Clang-supplied headers.
504     const DirectoryEntry *BuiltinIncludeDir;
505 
506     /// \brief Whether an error occurred.
507     bool HadError;
508 
509     /// \brief Default target information, used only for string literal
510     /// parsing.
511     TargetInfo *Target;
512 
513     /// \brief Stores string data for the various string literals referenced
514     /// during parsing.
515     llvm::BumpPtrAllocator StringData;
516 
517     /// \brief The current token.
518     MMToken Tok;
519 
520     /// \brief The active module.
521     Module *ActiveModule;
522 
523     /// \brief Consume the current token and return its location.
524     SourceLocation consumeToken();
525 
526     /// \brief Skip tokens until we reach the a token with the given kind
527     /// (or the end of the file).
528     void skipUntil(MMToken::TokenKind K);
529 
530     typedef llvm::SmallVector<std::pair<std::string, SourceLocation>, 2>
531       ModuleId;
532     bool parseModuleId(ModuleId &Id);
533     void parseModuleDecl();
534     void parseRequiresDecl();
535     void parseHeaderDecl(SourceLocation UmbrellaLoc);
536     void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc);
537     void parseExportDecl();
538     void parseInferredSubmoduleDecl(bool Explicit);
539 
540     const DirectoryEntry *getOverriddenHeaderSearchDir();
541 
542   public:
543     explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr,
544                              DiagnosticsEngine &Diags,
545                              ModuleMap &Map,
546                              const DirectoryEntry *Directory,
547                              const DirectoryEntry *BuiltinIncludeDir)
548       : L(L), SourceMgr(SourceMgr), Diags(Diags), Map(Map),
549         Directory(Directory), BuiltinIncludeDir(BuiltinIncludeDir),
550         HadError(false), ActiveModule(0)
551     {
552       TargetOptions TargetOpts;
553       TargetOpts.Triple = llvm::sys::getDefaultTargetTriple();
554       Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts);
555 
556       Tok.clear();
557       consumeToken();
558     }
559 
560     bool parseModuleMapFile();
561   };
562 }
563 
564 SourceLocation ModuleMapParser::consumeToken() {
565 retry:
566   SourceLocation Result = Tok.getLocation();
567   Tok.clear();
568 
569   Token LToken;
570   L.LexFromRawLexer(LToken);
571   Tok.Location = LToken.getLocation().getRawEncoding();
572   switch (LToken.getKind()) {
573   case tok::raw_identifier:
574     Tok.StringData = LToken.getRawIdentifierData();
575     Tok.StringLength = LToken.getLength();
576     Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(Tok.getString())
577                  .Case("header", MMToken::HeaderKeyword)
578                  .Case("explicit", MMToken::ExplicitKeyword)
579                  .Case("export", MMToken::ExportKeyword)
580                  .Case("framework", MMToken::FrameworkKeyword)
581                  .Case("module", MMToken::ModuleKeyword)
582                  .Case("requires", MMToken::RequiresKeyword)
583                  .Case("umbrella", MMToken::UmbrellaKeyword)
584                  .Default(MMToken::Identifier);
585     break;
586 
587   case tok::comma:
588     Tok.Kind = MMToken::Comma;
589     break;
590 
591   case tok::eof:
592     Tok.Kind = MMToken::EndOfFile;
593     break;
594 
595   case tok::l_brace:
596     Tok.Kind = MMToken::LBrace;
597     break;
598 
599   case tok::l_square:
600     Tok.Kind = MMToken::LSquare;
601     break;
602 
603   case tok::period:
604     Tok.Kind = MMToken::Period;
605     break;
606 
607   case tok::r_brace:
608     Tok.Kind = MMToken::RBrace;
609     break;
610 
611   case tok::r_square:
612     Tok.Kind = MMToken::RSquare;
613     break;
614 
615   case tok::star:
616     Tok.Kind = MMToken::Star;
617     break;
618 
619   case tok::string_literal: {
620     // Parse the string literal.
621     LangOptions LangOpts;
622     StringLiteralParser StringLiteral(&LToken, 1, SourceMgr, LangOpts, *Target);
623     if (StringLiteral.hadError)
624       goto retry;
625 
626     // Copy the string literal into our string data allocator.
627     unsigned Length = StringLiteral.GetStringLength();
628     char *Saved = StringData.Allocate<char>(Length + 1);
629     memcpy(Saved, StringLiteral.GetString().data(), Length);
630     Saved[Length] = 0;
631 
632     // Form the token.
633     Tok.Kind = MMToken::StringLiteral;
634     Tok.StringData = Saved;
635     Tok.StringLength = Length;
636     break;
637   }
638 
639   case tok::comment:
640     goto retry;
641 
642   default:
643     Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token);
644     HadError = true;
645     goto retry;
646   }
647 
648   return Result;
649 }
650 
651 void ModuleMapParser::skipUntil(MMToken::TokenKind K) {
652   unsigned braceDepth = 0;
653   unsigned squareDepth = 0;
654   do {
655     switch (Tok.Kind) {
656     case MMToken::EndOfFile:
657       return;
658 
659     case MMToken::LBrace:
660       if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
661         return;
662 
663       ++braceDepth;
664       break;
665 
666     case MMToken::LSquare:
667       if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
668         return;
669 
670       ++squareDepth;
671       break;
672 
673     case MMToken::RBrace:
674       if (braceDepth > 0)
675         --braceDepth;
676       else if (Tok.is(K))
677         return;
678       break;
679 
680     case MMToken::RSquare:
681       if (squareDepth > 0)
682         --squareDepth;
683       else if (Tok.is(K))
684         return;
685       break;
686 
687     default:
688       if (braceDepth == 0 && squareDepth == 0 && Tok.is(K))
689         return;
690       break;
691     }
692 
693    consumeToken();
694   } while (true);
695 }
696 
697 /// \brief Parse a module-id.
698 ///
699 ///   module-id:
700 ///     identifier
701 ///     identifier '.' module-id
702 ///
703 /// \returns true if an error occurred, false otherwise.
704 bool ModuleMapParser::parseModuleId(ModuleId &Id) {
705   Id.clear();
706   do {
707     if (Tok.is(MMToken::Identifier)) {
708       Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation()));
709       consumeToken();
710     } else {
711       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name);
712       return true;
713     }
714 
715     if (!Tok.is(MMToken::Period))
716       break;
717 
718     consumeToken();
719   } while (true);
720 
721   return false;
722 }
723 
724 namespace {
725   /// \brief Enumerates the known attributes.
726   enum AttributeKind {
727     /// \brief An unknown attribute.
728     AT_unknown,
729     /// \brief The 'system' attribute.
730     AT_system
731   };
732 }
733 
734 /// \brief Parse a module declaration.
735 ///
736 ///   module-declaration:
737 ///     'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt]
738 ///       { module-member* }
739 ///
740 ///   attributes:
741 ///     attribute attributes
742 ///     attribute
743 ///
744 ///   attribute:
745 ///     [ identifier ]
746 ///
747 ///   module-member:
748 ///     requires-declaration
749 ///     header-declaration
750 ///     submodule-declaration
751 ///     export-declaration
752 ///
753 ///   submodule-declaration:
754 ///     module-declaration
755 ///     inferred-submodule-declaration
756 void ModuleMapParser::parseModuleDecl() {
757   assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) ||
758          Tok.is(MMToken::FrameworkKeyword));
759   // Parse 'explicit' or 'framework' keyword, if present.
760   SourceLocation ExplicitLoc;
761   bool Explicit = false;
762   bool Framework = false;
763 
764   // Parse 'explicit' keyword, if present.
765   if (Tok.is(MMToken::ExplicitKeyword)) {
766     ExplicitLoc = consumeToken();
767     Explicit = true;
768   }
769 
770   // Parse 'framework' keyword, if present.
771   if (Tok.is(MMToken::FrameworkKeyword)) {
772     consumeToken();
773     Framework = true;
774   }
775 
776   // Parse 'module' keyword.
777   if (!Tok.is(MMToken::ModuleKeyword)) {
778     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
779     consumeToken();
780     HadError = true;
781     return;
782   }
783   consumeToken(); // 'module' keyword
784 
785   // If we have a wildcard for the module name, this is an inferred submodule.
786   // Parse it.
787   if (Tok.is(MMToken::Star))
788     return parseInferredSubmoduleDecl(Explicit);
789 
790   // Parse the module name.
791   ModuleId Id;
792   if (parseModuleId(Id)) {
793     HadError = true;
794     return;
795   }
796 
797   if (ActiveModule) {
798     if (Id.size() > 1) {
799       Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id)
800         << SourceRange(Id.front().second, Id.back().second);
801 
802       HadError = true;
803       return;
804     }
805   } else if (Id.size() == 1 && Explicit) {
806     // Top-level modules can't be explicit.
807     Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level);
808     Explicit = false;
809     ExplicitLoc = SourceLocation();
810     HadError = true;
811   }
812 
813   Module *PreviousActiveModule = ActiveModule;
814   if (Id.size() > 1) {
815     // This module map defines a submodule. Go find the module of which it
816     // is a submodule.
817     ActiveModule = 0;
818     for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) {
819       if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) {
820         ActiveModule = Next;
821         continue;
822       }
823 
824       if (ActiveModule) {
825         Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified)
826           << Id[I].first << ActiveModule->getTopLevelModule();
827       } else {
828         Diags.Report(Id[I].second, diag::err_mmap_expected_module_name);
829       }
830       HadError = true;
831       return;
832     }
833   }
834 
835   StringRef ModuleName = Id.back().first;
836   SourceLocation ModuleNameLoc = Id.back().second;
837 
838   // Parse the optional attribute list.
839   bool IsSystem = false;
840   while (Tok.is(MMToken::LSquare)) {
841     // Consume the '['.
842     SourceLocation LSquareLoc = consumeToken();
843 
844     // Check whether we have an attribute name here.
845     if (!Tok.is(MMToken::Identifier)) {
846       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute);
847       skipUntil(MMToken::RSquare);
848       if (Tok.is(MMToken::RSquare))
849         consumeToken();
850       continue;
851     }
852 
853     // Decode the attribute name.
854     AttributeKind Attribute
855       = llvm::StringSwitch<AttributeKind>(Tok.getString())
856         .Case("system", AT_system)
857         .Default(AT_unknown);
858     switch (Attribute) {
859     case AT_unknown:
860       Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute)
861         << Tok.getString();
862       break;
863 
864     case AT_system:
865       IsSystem = true;
866       break;
867     }
868     consumeToken();
869 
870     // Consume the ']'.
871     if (!Tok.is(MMToken::RSquare)) {
872       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare);
873       Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match);
874       skipUntil(MMToken::RSquare);
875     }
876 
877     if (Tok.is(MMToken::RSquare))
878       consumeToken();
879   }
880 
881   // Parse the opening brace.
882   if (!Tok.is(MMToken::LBrace)) {
883     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace)
884       << ModuleName;
885     HadError = true;
886     return;
887   }
888   SourceLocation LBraceLoc = consumeToken();
889 
890   // Determine whether this (sub)module has already been defined.
891   if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) {
892     if (Existing->DefinitionLoc.isInvalid() && !ActiveModule) {
893       // Skip the module definition.
894       skipUntil(MMToken::RBrace);
895       if (Tok.is(MMToken::RBrace))
896         consumeToken();
897       else {
898         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
899         Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
900         HadError = true;
901       }
902       return;
903     }
904 
905     Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition)
906       << ModuleName;
907     Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition);
908 
909     // Skip the module definition.
910     skipUntil(MMToken::RBrace);
911     if (Tok.is(MMToken::RBrace))
912       consumeToken();
913 
914     HadError = true;
915     return;
916   }
917 
918   // Start defining this module.
919   ActiveModule = Map.findOrCreateModule(ModuleName, ActiveModule, Framework,
920                                         Explicit).first;
921   ActiveModule->DefinitionLoc = ModuleNameLoc;
922   if (IsSystem)
923     ActiveModule->IsSystem = true;
924 
925   bool Done = false;
926   do {
927     switch (Tok.Kind) {
928     case MMToken::EndOfFile:
929     case MMToken::RBrace:
930       Done = true;
931       break;
932 
933     case MMToken::ExplicitKeyword:
934     case MMToken::FrameworkKeyword:
935     case MMToken::ModuleKeyword:
936       parseModuleDecl();
937       break;
938 
939     case MMToken::ExportKeyword:
940       parseExportDecl();
941       break;
942 
943     case MMToken::RequiresKeyword:
944       parseRequiresDecl();
945       break;
946 
947     case MMToken::UmbrellaKeyword: {
948       SourceLocation UmbrellaLoc = consumeToken();
949       if (Tok.is(MMToken::HeaderKeyword))
950         parseHeaderDecl(UmbrellaLoc);
951       else
952         parseUmbrellaDirDecl(UmbrellaLoc);
953       break;
954     }
955 
956     case MMToken::HeaderKeyword:
957       parseHeaderDecl(SourceLocation());
958       break;
959 
960     default:
961       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member);
962       consumeToken();
963       break;
964     }
965   } while (!Done);
966 
967   if (Tok.is(MMToken::RBrace))
968     consumeToken();
969   else {
970     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
971     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
972     HadError = true;
973   }
974 
975   // We're done parsing this module. Pop back to the previous module.
976   ActiveModule = PreviousActiveModule;
977 }
978 
979 /// \brief Parse a requires declaration.
980 ///
981 ///   requires-declaration:
982 ///     'requires' feature-list
983 ///
984 ///   feature-list:
985 ///     identifier ',' feature-list
986 ///     identifier
987 void ModuleMapParser::parseRequiresDecl() {
988   assert(Tok.is(MMToken::RequiresKeyword));
989 
990   // Parse 'requires' keyword.
991   consumeToken();
992 
993   // Parse the feature-list.
994   do {
995     if (!Tok.is(MMToken::Identifier)) {
996       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature);
997       HadError = true;
998       return;
999     }
1000 
1001     // Consume the feature name.
1002     std::string Feature = Tok.getString();
1003     consumeToken();
1004 
1005     // Add this feature.
1006     ActiveModule->addRequirement(Feature, Map.LangOpts, *Map.Target);
1007 
1008     if (!Tok.is(MMToken::Comma))
1009       break;
1010 
1011     // Consume the comma.
1012     consumeToken();
1013   } while (true);
1014 }
1015 
1016 /// \brief Append to \p Paths the set of paths needed to get to the
1017 /// subframework in which the given module lives.
1018 static void appendSubframeworkPaths(Module *Mod,
1019                                     llvm::SmallVectorImpl<char> &Path) {
1020   // Collect the framework names from the given module to the top-level module.
1021   llvm::SmallVector<StringRef, 2> Paths;
1022   for (; Mod; Mod = Mod->Parent) {
1023     if (Mod->IsFramework)
1024       Paths.push_back(Mod->Name);
1025   }
1026 
1027   if (Paths.empty())
1028     return;
1029 
1030   // Add Frameworks/Name.framework for each subframework.
1031   for (unsigned I = Paths.size() - 1; I != 0; --I) {
1032     llvm::sys::path::append(Path, "Frameworks");
1033     llvm::sys::path::append(Path, Paths[I-1] + ".framework");
1034   }
1035 }
1036 
1037 /// \brief Determine whether the given file name is the name of a builtin
1038 /// header, supplied by Clang to replace, override, or augment existing system
1039 /// headers.
1040 static bool isBuiltinHeader(StringRef FileName) {
1041   return llvm::StringSwitch<bool>(FileName)
1042       .Case("float.h", true)
1043       .Case("iso646.h", true)
1044       .Case("limits.h", true)
1045       .Case("stdalign.h", true)
1046       .Case("stdarg.h", true)
1047       .Case("stdbool.h", true)
1048       .Case("stddef.h", true)
1049       .Case("stdint.h", true)
1050       .Case("tgmath.h", true)
1051       .Case("unwind.h", true)
1052       .Default(false);
1053 }
1054 
1055 /// \brief Parse a header declaration.
1056 ///
1057 ///   header-declaration:
1058 ///     'umbrella'[opt] 'header' string-literal
1059 void ModuleMapParser::parseHeaderDecl(SourceLocation UmbrellaLoc) {
1060   assert(Tok.is(MMToken::HeaderKeyword));
1061   consumeToken();
1062 
1063   bool Umbrella = UmbrellaLoc.isValid();
1064 
1065   // Parse the header name.
1066   if (!Tok.is(MMToken::StringLiteral)) {
1067     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1068       << "header";
1069     HadError = true;
1070     return;
1071   }
1072   std::string FileName = Tok.getString();
1073   SourceLocation FileNameLoc = consumeToken();
1074 
1075   // Check whether we already have an umbrella.
1076   if (Umbrella && ActiveModule->Umbrella) {
1077     Diags.Report(FileNameLoc, diag::err_mmap_umbrella_clash)
1078       << ActiveModule->getFullModuleName();
1079     HadError = true;
1080     return;
1081   }
1082 
1083   // Look for this file.
1084   const FileEntry *File = 0;
1085   const FileEntry *BuiltinFile = 0;
1086   SmallString<128> PathName;
1087   if (llvm::sys::path::is_absolute(FileName)) {
1088     PathName = FileName;
1089     File = SourceMgr.getFileManager().getFile(PathName);
1090   } else if (const DirectoryEntry *Dir = getOverriddenHeaderSearchDir()) {
1091     PathName = Dir->getName();
1092     llvm::sys::path::append(PathName, FileName);
1093     File = SourceMgr.getFileManager().getFile(PathName);
1094   } else {
1095     // Search for the header file within the search directory.
1096     PathName = Directory->getName();
1097     unsigned PathLength = PathName.size();
1098 
1099     if (ActiveModule->isPartOfFramework()) {
1100       appendSubframeworkPaths(ActiveModule, PathName);
1101 
1102       // Check whether this file is in the public headers.
1103       llvm::sys::path::append(PathName, "Headers");
1104       llvm::sys::path::append(PathName, FileName);
1105       File = SourceMgr.getFileManager().getFile(PathName);
1106 
1107       if (!File) {
1108         // Check whether this file is in the private headers.
1109         PathName.resize(PathLength);
1110         llvm::sys::path::append(PathName, "PrivateHeaders");
1111         llvm::sys::path::append(PathName, FileName);
1112         File = SourceMgr.getFileManager().getFile(PathName);
1113       }
1114     } else {
1115       // Lookup for normal headers.
1116       llvm::sys::path::append(PathName, FileName);
1117       File = SourceMgr.getFileManager().getFile(PathName);
1118 
1119       // If this is a system module with a top-level header, this header
1120       // may have a counterpart (or replacement) in the set of headers
1121       // supplied by Clang. Find that builtin header.
1122       if (ActiveModule->IsSystem && !Umbrella && BuiltinIncludeDir &&
1123           BuiltinIncludeDir != Directory && isBuiltinHeader(FileName)) {
1124         SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName());
1125         llvm::sys::path::append(BuiltinPathName, FileName);
1126         BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName);
1127 
1128         // If Clang supplies this header but the underlying system does not,
1129         // just silently swap in our builtin version. Otherwise, we'll end
1130         // up adding both (later).
1131         if (!File && BuiltinFile) {
1132           File = BuiltinFile;
1133           BuiltinFile = 0;
1134         }
1135       }
1136     }
1137   }
1138 
1139   // FIXME: We shouldn't be eagerly stat'ing every file named in a module map.
1140   // Come up with a lazy way to do this.
1141   if (File) {
1142     if (const Module *OwningModule = Map.Headers[File]) {
1143       Diags.Report(FileNameLoc, diag::err_mmap_header_conflict)
1144         << FileName << OwningModule->getFullModuleName();
1145       HadError = true;
1146     } else if (Umbrella) {
1147       const DirectoryEntry *UmbrellaDir = File->getDir();
1148       if ((OwningModule = Map.UmbrellaDirs[UmbrellaDir])) {
1149         Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
1150           << OwningModule->getFullModuleName();
1151         HadError = true;
1152       } else {
1153         // Record this umbrella header.
1154         Map.setUmbrellaHeader(ActiveModule, File);
1155       }
1156     } else {
1157       // Record this header.
1158       Map.addHeader(ActiveModule, File);
1159 
1160       // If there is a builtin counterpart to this file, add it now.
1161       if (BuiltinFile)
1162         Map.addHeader(ActiveModule, BuiltinFile);
1163     }
1164   } else {
1165     Diags.Report(FileNameLoc, diag::err_mmap_header_not_found)
1166       << Umbrella << FileName;
1167     HadError = true;
1168   }
1169 }
1170 
1171 /// \brief Parse an umbrella directory declaration.
1172 ///
1173 ///   umbrella-dir-declaration:
1174 ///     umbrella string-literal
1175 void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) {
1176   // Parse the directory name.
1177   if (!Tok.is(MMToken::StringLiteral)) {
1178     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1179       << "umbrella";
1180     HadError = true;
1181     return;
1182   }
1183 
1184   std::string DirName = Tok.getString();
1185   SourceLocation DirNameLoc = consumeToken();
1186 
1187   // Check whether we already have an umbrella.
1188   if (ActiveModule->Umbrella) {
1189     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash)
1190       << ActiveModule->getFullModuleName();
1191     HadError = true;
1192     return;
1193   }
1194 
1195   // Look for this file.
1196   const DirectoryEntry *Dir = 0;
1197   if (llvm::sys::path::is_absolute(DirName))
1198     Dir = SourceMgr.getFileManager().getDirectory(DirName);
1199   else {
1200     SmallString<128> PathName;
1201     PathName = Directory->getName();
1202     llvm::sys::path::append(PathName, DirName);
1203     Dir = SourceMgr.getFileManager().getDirectory(PathName);
1204   }
1205 
1206   if (!Dir) {
1207     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found)
1208       << DirName;
1209     HadError = true;
1210     return;
1211   }
1212 
1213   if (Module *OwningModule = Map.UmbrellaDirs[Dir]) {
1214     Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
1215       << OwningModule->getFullModuleName();
1216     HadError = true;
1217     return;
1218   }
1219 
1220   // Record this umbrella directory.
1221   Map.setUmbrellaDir(ActiveModule, Dir);
1222 }
1223 
1224 /// \brief Parse a module export declaration.
1225 ///
1226 ///   export-declaration:
1227 ///     'export' wildcard-module-id
1228 ///
1229 ///   wildcard-module-id:
1230 ///     identifier
1231 ///     '*'
1232 ///     identifier '.' wildcard-module-id
1233 void ModuleMapParser::parseExportDecl() {
1234   assert(Tok.is(MMToken::ExportKeyword));
1235   SourceLocation ExportLoc = consumeToken();
1236 
1237   // Parse the module-id with an optional wildcard at the end.
1238   ModuleId ParsedModuleId;
1239   bool Wildcard = false;
1240   do {
1241     if (Tok.is(MMToken::Identifier)) {
1242       ParsedModuleId.push_back(std::make_pair(Tok.getString(),
1243                                               Tok.getLocation()));
1244       consumeToken();
1245 
1246       if (Tok.is(MMToken::Period)) {
1247         consumeToken();
1248         continue;
1249       }
1250 
1251       break;
1252     }
1253 
1254     if(Tok.is(MMToken::Star)) {
1255       Wildcard = true;
1256       consumeToken();
1257       break;
1258     }
1259 
1260     Diags.Report(Tok.getLocation(), diag::err_mmap_export_module_id);
1261     HadError = true;
1262     return;
1263   } while (true);
1264 
1265   Module::UnresolvedExportDecl Unresolved = {
1266     ExportLoc, ParsedModuleId, Wildcard
1267   };
1268   ActiveModule->UnresolvedExports.push_back(Unresolved);
1269 }
1270 
1271 void ModuleMapParser::parseInferredSubmoduleDecl(bool Explicit) {
1272   assert(Tok.is(MMToken::Star));
1273   SourceLocation StarLoc = consumeToken();
1274   bool Failed = false;
1275 
1276   // Inferred modules must be submodules.
1277   if (!ActiveModule) {
1278     Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule);
1279     Failed = true;
1280   }
1281 
1282   // Inferred modules must have umbrella directories.
1283   if (!Failed && !ActiveModule->getUmbrellaDir()) {
1284     Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
1285     Failed = true;
1286   }
1287 
1288   // Check for redefinition of an inferred module.
1289   if (!Failed && ActiveModule->InferSubmodules) {
1290     Diags.Report(StarLoc, diag::err_mmap_inferred_redef);
1291     if (ActiveModule->InferredSubmoduleLoc.isValid())
1292       Diags.Report(ActiveModule->InferredSubmoduleLoc,
1293                    diag::note_mmap_prev_definition);
1294     Failed = true;
1295   }
1296 
1297   // If there were any problems with this inferred submodule, skip its body.
1298   if (Failed) {
1299     if (Tok.is(MMToken::LBrace)) {
1300       consumeToken();
1301       skipUntil(MMToken::RBrace);
1302       if (Tok.is(MMToken::RBrace))
1303         consumeToken();
1304     }
1305     HadError = true;
1306     return;
1307   }
1308 
1309   // Note that we have an inferred submodule.
1310   ActiveModule->InferSubmodules = true;
1311   ActiveModule->InferredSubmoduleLoc = StarLoc;
1312   ActiveModule->InferExplicitSubmodules = Explicit;
1313 
1314   // Parse the opening brace.
1315   if (!Tok.is(MMToken::LBrace)) {
1316     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard);
1317     HadError = true;
1318     return;
1319   }
1320   SourceLocation LBraceLoc = consumeToken();
1321 
1322   // Parse the body of the inferred submodule.
1323   bool Done = false;
1324   do {
1325     switch (Tok.Kind) {
1326     case MMToken::EndOfFile:
1327     case MMToken::RBrace:
1328       Done = true;
1329       break;
1330 
1331     case MMToken::ExportKeyword: {
1332       consumeToken();
1333       if (Tok.is(MMToken::Star))
1334         ActiveModule->InferExportWildcard = true;
1335       else
1336         Diags.Report(Tok.getLocation(),
1337                      diag::err_mmap_expected_export_wildcard);
1338       consumeToken();
1339       break;
1340     }
1341 
1342     case MMToken::ExplicitKeyword:
1343     case MMToken::ModuleKeyword:
1344     case MMToken::HeaderKeyword:
1345     case MMToken::UmbrellaKeyword:
1346     default:
1347       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_wildcard_member);
1348       consumeToken();
1349       break;
1350     }
1351   } while (!Done);
1352 
1353   if (Tok.is(MMToken::RBrace))
1354     consumeToken();
1355   else {
1356     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1357     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1358     HadError = true;
1359   }
1360 }
1361 
1362 /// \brief If there is a specific header search directory due the presence
1363 /// of an umbrella directory, retrieve that directory. Otherwise, returns null.
1364 const DirectoryEntry *ModuleMapParser::getOverriddenHeaderSearchDir() {
1365   for (Module *Mod = ActiveModule; Mod; Mod = Mod->Parent) {
1366     // If we have an umbrella directory, use that.
1367     if (Mod->hasUmbrellaDir())
1368       return Mod->getUmbrellaDir();
1369 
1370     // If we have a framework directory, stop looking.
1371     if (Mod->IsFramework)
1372       return 0;
1373   }
1374 
1375   return 0;
1376 }
1377 
1378 /// \brief Parse a module map file.
1379 ///
1380 ///   module-map-file:
1381 ///     module-declaration*
1382 bool ModuleMapParser::parseModuleMapFile() {
1383   do {
1384     switch (Tok.Kind) {
1385     case MMToken::EndOfFile:
1386       return HadError;
1387 
1388     case MMToken::ExplicitKeyword:
1389     case MMToken::ModuleKeyword:
1390     case MMToken::FrameworkKeyword:
1391       parseModuleDecl();
1392       break;
1393 
1394     case MMToken::Comma:
1395     case MMToken::ExportKeyword:
1396     case MMToken::HeaderKeyword:
1397     case MMToken::Identifier:
1398     case MMToken::LBrace:
1399     case MMToken::LSquare:
1400     case MMToken::Period:
1401     case MMToken::RBrace:
1402     case MMToken::RSquare:
1403     case MMToken::RequiresKeyword:
1404     case MMToken::Star:
1405     case MMToken::StringLiteral:
1406     case MMToken::UmbrellaKeyword:
1407       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1408       HadError = true;
1409       consumeToken();
1410       break;
1411     }
1412   } while (true);
1413 }
1414 
1415 bool ModuleMap::parseModuleMapFile(const FileEntry *File) {
1416   assert(Target != 0 && "Missing target information");
1417   FileID ID = SourceMgr->createFileID(File, SourceLocation(), SrcMgr::C_User);
1418   const llvm::MemoryBuffer *Buffer = SourceMgr->getBuffer(ID);
1419   if (!Buffer)
1420     return true;
1421 
1422   // Parse this module map file.
1423   Lexer L(ID, SourceMgr->getBuffer(ID), *SourceMgr, MMapLangOpts);
1424   Diags->getClient()->BeginSourceFile(MMapLangOpts);
1425   ModuleMapParser Parser(L, *SourceMgr, *Diags, *this, File->getDir(),
1426                          BuiltinIncludeDir);
1427   bool Result = Parser.parseModuleMapFile();
1428   Diags->getClient()->EndSourceFile();
1429 
1430   return Result;
1431 }
1432