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   llvm::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   llvm::SmallString<128> SubframeworksDirName
336     = StringRef(FrameworkDir->getName());
337   llvm::sys::path::append(SubframeworksDirName, "Frameworks");
338   llvm::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 void appendSubframeworkPaths(Module *Mod, llvm::SmallVectorImpl<char> &Path) {
1019   // Collect the framework names from the given module to the top-level module.
1020   llvm::SmallVector<StringRef, 2> Paths;
1021   for (; Mod; Mod = Mod->Parent) {
1022     if (Mod->IsFramework)
1023       Paths.push_back(Mod->Name);
1024   }
1025 
1026   if (Paths.empty())
1027     return;
1028 
1029   // Add Frameworks/Name.framework for each subframework.
1030   for (unsigned I = Paths.size() - 1; I != 0; --I) {
1031     llvm::sys::path::append(Path, "Frameworks");
1032     llvm::sys::path::append(Path, Paths[I-1] + ".framework");
1033   }
1034 }
1035 
1036 /// \brief Determine whether the given file name is the name of a builtin
1037 /// header, supplied by Clang to replace, override, or augment existing system
1038 /// headers.
1039 static bool isBuiltinHeader(StringRef FileName) {
1040   return llvm::StringSwitch<bool>(FileName)
1041       .Case("float.h", true)
1042       .Case("iso646.h", true)
1043       .Case("limits.h", true)
1044       .Case("stdalign.h", true)
1045       .Case("stdarg.h", true)
1046       .Case("stdbool.h", true)
1047       .Case("stddef.h", true)
1048       .Case("stdint.h", true)
1049       .Case("tgmath.h", true)
1050       .Case("unwind.h", true)
1051       .Default(false);
1052 }
1053 
1054 /// \brief Parse a header declaration.
1055 ///
1056 ///   header-declaration:
1057 ///     'umbrella'[opt] 'header' string-literal
1058 void ModuleMapParser::parseHeaderDecl(SourceLocation UmbrellaLoc) {
1059   assert(Tok.is(MMToken::HeaderKeyword));
1060   consumeToken();
1061 
1062   bool Umbrella = UmbrellaLoc.isValid();
1063 
1064   // Parse the header name.
1065   if (!Tok.is(MMToken::StringLiteral)) {
1066     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1067       << "header";
1068     HadError = true;
1069     return;
1070   }
1071   std::string FileName = Tok.getString();
1072   SourceLocation FileNameLoc = consumeToken();
1073 
1074   // Check whether we already have an umbrella.
1075   if (Umbrella && ActiveModule->Umbrella) {
1076     Diags.Report(FileNameLoc, diag::err_mmap_umbrella_clash)
1077       << ActiveModule->getFullModuleName();
1078     HadError = true;
1079     return;
1080   }
1081 
1082   // Look for this file.
1083   const FileEntry *File = 0;
1084   const FileEntry *BuiltinFile = 0;
1085   llvm::SmallString<128> PathName;
1086   if (llvm::sys::path::is_absolute(FileName)) {
1087     PathName = FileName;
1088     File = SourceMgr.getFileManager().getFile(PathName);
1089   } else if (const DirectoryEntry *Dir = getOverriddenHeaderSearchDir()) {
1090     PathName = Dir->getName();
1091     llvm::sys::path::append(PathName, FileName);
1092     File = SourceMgr.getFileManager().getFile(PathName);
1093   } else {
1094     // Search for the header file within the search directory.
1095     PathName = Directory->getName();
1096     unsigned PathLength = PathName.size();
1097 
1098     if (ActiveModule->isPartOfFramework()) {
1099       appendSubframeworkPaths(ActiveModule, PathName);
1100 
1101       // Check whether this file is in the public headers.
1102       llvm::sys::path::append(PathName, "Headers");
1103       llvm::sys::path::append(PathName, FileName);
1104       File = SourceMgr.getFileManager().getFile(PathName);
1105 
1106       if (!File) {
1107         // Check whether this file is in the private headers.
1108         PathName.resize(PathLength);
1109         llvm::sys::path::append(PathName, "PrivateHeaders");
1110         llvm::sys::path::append(PathName, FileName);
1111         File = SourceMgr.getFileManager().getFile(PathName);
1112       }
1113     } else {
1114       // Lookup for normal headers.
1115       llvm::sys::path::append(PathName, FileName);
1116       File = SourceMgr.getFileManager().getFile(PathName);
1117 
1118       // If this is a system module with a top-level header, this header
1119       // may have a counterpart (or replacement) in the set of headers
1120       // supplied by Clang. Find that builtin header.
1121       if (ActiveModule->IsSystem && !Umbrella && BuiltinIncludeDir &&
1122           BuiltinIncludeDir != Directory && isBuiltinHeader(FileName)) {
1123         llvm::SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName());
1124         llvm::sys::path::append(BuiltinPathName, FileName);
1125         BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName);
1126 
1127         // If Clang supplies this header but the underlying system does not,
1128         // just silently swap in our builtin version. Otherwise, we'll end
1129         // up adding both (later).
1130         if (!File && BuiltinFile) {
1131           File = BuiltinFile;
1132           BuiltinFile = 0;
1133         }
1134       }
1135     }
1136   }
1137 
1138   // FIXME: We shouldn't be eagerly stat'ing every file named in a module map.
1139   // Come up with a lazy way to do this.
1140   if (File) {
1141     if (const Module *OwningModule = Map.Headers[File]) {
1142       Diags.Report(FileNameLoc, diag::err_mmap_header_conflict)
1143         << FileName << OwningModule->getFullModuleName();
1144       HadError = true;
1145     } else if (Umbrella) {
1146       const DirectoryEntry *UmbrellaDir = File->getDir();
1147       if ((OwningModule = Map.UmbrellaDirs[UmbrellaDir])) {
1148         Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
1149           << OwningModule->getFullModuleName();
1150         HadError = true;
1151       } else {
1152         // Record this umbrella header.
1153         Map.setUmbrellaHeader(ActiveModule, File);
1154       }
1155     } else {
1156       // Record this header.
1157       Map.addHeader(ActiveModule, File);
1158 
1159       // If there is a builtin counterpart to this file, add it now.
1160       if (BuiltinFile)
1161         Map.addHeader(ActiveModule, BuiltinFile);
1162     }
1163   } else {
1164     Diags.Report(FileNameLoc, diag::err_mmap_header_not_found)
1165       << Umbrella << FileName;
1166     HadError = true;
1167   }
1168 }
1169 
1170 /// \brief Parse an umbrella directory declaration.
1171 ///
1172 ///   umbrella-dir-declaration:
1173 ///     umbrella string-literal
1174 void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) {
1175   // Parse the directory name.
1176   if (!Tok.is(MMToken::StringLiteral)) {
1177     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1178       << "umbrella";
1179     HadError = true;
1180     return;
1181   }
1182 
1183   std::string DirName = Tok.getString();
1184   SourceLocation DirNameLoc = consumeToken();
1185 
1186   // Check whether we already have an umbrella.
1187   if (ActiveModule->Umbrella) {
1188     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash)
1189       << ActiveModule->getFullModuleName();
1190     HadError = true;
1191     return;
1192   }
1193 
1194   // Look for this file.
1195   const DirectoryEntry *Dir = 0;
1196   if (llvm::sys::path::is_absolute(DirName))
1197     Dir = SourceMgr.getFileManager().getDirectory(DirName);
1198   else {
1199     llvm::SmallString<128> PathName;
1200     PathName = Directory->getName();
1201     llvm::sys::path::append(PathName, DirName);
1202     Dir = SourceMgr.getFileManager().getDirectory(PathName);
1203   }
1204 
1205   if (!Dir) {
1206     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found)
1207       << DirName;
1208     HadError = true;
1209     return;
1210   }
1211 
1212   if (Module *OwningModule = Map.UmbrellaDirs[Dir]) {
1213     Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
1214       << OwningModule->getFullModuleName();
1215     HadError = true;
1216     return;
1217   }
1218 
1219   // Record this umbrella directory.
1220   Map.setUmbrellaDir(ActiveModule, Dir);
1221 }
1222 
1223 /// \brief Parse a module export declaration.
1224 ///
1225 ///   export-declaration:
1226 ///     'export' wildcard-module-id
1227 ///
1228 ///   wildcard-module-id:
1229 ///     identifier
1230 ///     '*'
1231 ///     identifier '.' wildcard-module-id
1232 void ModuleMapParser::parseExportDecl() {
1233   assert(Tok.is(MMToken::ExportKeyword));
1234   SourceLocation ExportLoc = consumeToken();
1235 
1236   // Parse the module-id with an optional wildcard at the end.
1237   ModuleId ParsedModuleId;
1238   bool Wildcard = false;
1239   do {
1240     if (Tok.is(MMToken::Identifier)) {
1241       ParsedModuleId.push_back(std::make_pair(Tok.getString(),
1242                                               Tok.getLocation()));
1243       consumeToken();
1244 
1245       if (Tok.is(MMToken::Period)) {
1246         consumeToken();
1247         continue;
1248       }
1249 
1250       break;
1251     }
1252 
1253     if(Tok.is(MMToken::Star)) {
1254       Wildcard = true;
1255       consumeToken();
1256       break;
1257     }
1258 
1259     Diags.Report(Tok.getLocation(), diag::err_mmap_export_module_id);
1260     HadError = true;
1261     return;
1262   } while (true);
1263 
1264   Module::UnresolvedExportDecl Unresolved = {
1265     ExportLoc, ParsedModuleId, Wildcard
1266   };
1267   ActiveModule->UnresolvedExports.push_back(Unresolved);
1268 }
1269 
1270 void ModuleMapParser::parseInferredSubmoduleDecl(bool Explicit) {
1271   assert(Tok.is(MMToken::Star));
1272   SourceLocation StarLoc = consumeToken();
1273   bool Failed = false;
1274 
1275   // Inferred modules must be submodules.
1276   if (!ActiveModule) {
1277     Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule);
1278     Failed = true;
1279   }
1280 
1281   // Inferred modules must have umbrella directories.
1282   if (!Failed && !ActiveModule->getUmbrellaDir()) {
1283     Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
1284     Failed = true;
1285   }
1286 
1287   // Check for redefinition of an inferred module.
1288   if (!Failed && ActiveModule->InferSubmodules) {
1289     Diags.Report(StarLoc, diag::err_mmap_inferred_redef);
1290     if (ActiveModule->InferredSubmoduleLoc.isValid())
1291       Diags.Report(ActiveModule->InferredSubmoduleLoc,
1292                    diag::note_mmap_prev_definition);
1293     Failed = true;
1294   }
1295 
1296   // If there were any problems with this inferred submodule, skip its body.
1297   if (Failed) {
1298     if (Tok.is(MMToken::LBrace)) {
1299       consumeToken();
1300       skipUntil(MMToken::RBrace);
1301       if (Tok.is(MMToken::RBrace))
1302         consumeToken();
1303     }
1304     HadError = true;
1305     return;
1306   }
1307 
1308   // Note that we have an inferred submodule.
1309   ActiveModule->InferSubmodules = true;
1310   ActiveModule->InferredSubmoduleLoc = StarLoc;
1311   ActiveModule->InferExplicitSubmodules = Explicit;
1312 
1313   // Parse the opening brace.
1314   if (!Tok.is(MMToken::LBrace)) {
1315     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard);
1316     HadError = true;
1317     return;
1318   }
1319   SourceLocation LBraceLoc = consumeToken();
1320 
1321   // Parse the body of the inferred submodule.
1322   bool Done = false;
1323   do {
1324     switch (Tok.Kind) {
1325     case MMToken::EndOfFile:
1326     case MMToken::RBrace:
1327       Done = true;
1328       break;
1329 
1330     case MMToken::ExportKeyword: {
1331       consumeToken();
1332       if (Tok.is(MMToken::Star))
1333         ActiveModule->InferExportWildcard = true;
1334       else
1335         Diags.Report(Tok.getLocation(),
1336                      diag::err_mmap_expected_export_wildcard);
1337       consumeToken();
1338       break;
1339     }
1340 
1341     case MMToken::ExplicitKeyword:
1342     case MMToken::ModuleKeyword:
1343     case MMToken::HeaderKeyword:
1344     case MMToken::UmbrellaKeyword:
1345     default:
1346       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_wildcard_member);
1347       consumeToken();
1348       break;
1349     }
1350   } while (!Done);
1351 
1352   if (Tok.is(MMToken::RBrace))
1353     consumeToken();
1354   else {
1355     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1356     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1357     HadError = true;
1358   }
1359 }
1360 
1361 /// \brief If there is a specific header search directory due the presence
1362 /// of an umbrella directory, retrieve that directory. Otherwise, returns null.
1363 const DirectoryEntry *ModuleMapParser::getOverriddenHeaderSearchDir() {
1364   for (Module *Mod = ActiveModule; Mod; Mod = Mod->Parent) {
1365     // If we have an umbrella directory, use that.
1366     if (Mod->hasUmbrellaDir())
1367       return Mod->getUmbrellaDir();
1368 
1369     // If we have a framework directory, stop looking.
1370     if (Mod->IsFramework)
1371       return 0;
1372   }
1373 
1374   return 0;
1375 }
1376 
1377 /// \brief Parse a module map file.
1378 ///
1379 ///   module-map-file:
1380 ///     module-declaration*
1381 bool ModuleMapParser::parseModuleMapFile() {
1382   do {
1383     switch (Tok.Kind) {
1384     case MMToken::EndOfFile:
1385       return HadError;
1386 
1387     case MMToken::ExplicitKeyword:
1388     case MMToken::ModuleKeyword:
1389     case MMToken::FrameworkKeyword:
1390       parseModuleDecl();
1391       break;
1392 
1393     case MMToken::Comma:
1394     case MMToken::ExportKeyword:
1395     case MMToken::HeaderKeyword:
1396     case MMToken::Identifier:
1397     case MMToken::LBrace:
1398     case MMToken::LSquare:
1399     case MMToken::Period:
1400     case MMToken::RBrace:
1401     case MMToken::RSquare:
1402     case MMToken::RequiresKeyword:
1403     case MMToken::Star:
1404     case MMToken::StringLiteral:
1405     case MMToken::UmbrellaKeyword:
1406       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1407       HadError = true;
1408       consumeToken();
1409       break;
1410     }
1411   } while (true);
1412 }
1413 
1414 bool ModuleMap::parseModuleMapFile(const FileEntry *File) {
1415   assert(Target != 0 && "Missing target information");
1416   FileID ID = SourceMgr->createFileID(File, SourceLocation(), SrcMgr::C_User);
1417   const llvm::MemoryBuffer *Buffer = SourceMgr->getBuffer(ID);
1418   if (!Buffer)
1419     return true;
1420 
1421   // Parse this module map file.
1422   Lexer L(ID, SourceMgr->getBuffer(ID), *SourceMgr, MMapLangOpts);
1423   Diags->getClient()->BeginSourceFile(MMapLangOpts);
1424   ModuleMapParser Parser(L, *SourceMgr, *Diags, *this, File->getDir(),
1425                          BuiltinIncludeDir);
1426   bool Result = Parser.parseModuleMapFile();
1427   Diags->getClient()->EndSourceFile();
1428 
1429   return Result;
1430 }
1431