Home | History | Annotate | Download | only in Lex
      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   IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs);
     77   Diags = 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     OwningPtr<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.reset(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     if (LToken.hasUDSuffix()) {
    621       Diags.Report(LToken.getLocation(), diag::err_invalid_string_udl);
    622       HadError = true;
    623       goto retry;
    624     }
    625 
    626     // Parse the string literal.
    627     LangOptions LangOpts;
    628     StringLiteralParser StringLiteral(&LToken, 1, SourceMgr, LangOpts, *Target);
    629     if (StringLiteral.hadError)
    630       goto retry;
    631 
    632     // Copy the string literal into our string data allocator.
    633     unsigned Length = StringLiteral.GetStringLength();
    634     char *Saved = StringData.Allocate<char>(Length + 1);
    635     memcpy(Saved, StringLiteral.GetString().data(), Length);
    636     Saved[Length] = 0;
    637 
    638     // Form the token.
    639     Tok.Kind = MMToken::StringLiteral;
    640     Tok.StringData = Saved;
    641     Tok.StringLength = Length;
    642     break;
    643   }
    644 
    645   case tok::comment:
    646     goto retry;
    647 
    648   default:
    649     Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token);
    650     HadError = true;
    651     goto retry;
    652   }
    653 
    654   return Result;
    655 }
    656 
    657 void ModuleMapParser::skipUntil(MMToken::TokenKind K) {
    658   unsigned braceDepth = 0;
    659   unsigned squareDepth = 0;
    660   do {
    661     switch (Tok.Kind) {
    662     case MMToken::EndOfFile:
    663       return;
    664 
    665     case MMToken::LBrace:
    666       if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
    667         return;
    668 
    669       ++braceDepth;
    670       break;
    671 
    672     case MMToken::LSquare:
    673       if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
    674         return;
    675 
    676       ++squareDepth;
    677       break;
    678 
    679     case MMToken::RBrace:
    680       if (braceDepth > 0)
    681         --braceDepth;
    682       else if (Tok.is(K))
    683         return;
    684       break;
    685 
    686     case MMToken::RSquare:
    687       if (squareDepth > 0)
    688         --squareDepth;
    689       else if (Tok.is(K))
    690         return;
    691       break;
    692 
    693     default:
    694       if (braceDepth == 0 && squareDepth == 0 && Tok.is(K))
    695         return;
    696       break;
    697     }
    698 
    699    consumeToken();
    700   } while (true);
    701 }
    702 
    703 /// \brief Parse a module-id.
    704 ///
    705 ///   module-id:
    706 ///     identifier
    707 ///     identifier '.' module-id
    708 ///
    709 /// \returns true if an error occurred, false otherwise.
    710 bool ModuleMapParser::parseModuleId(ModuleId &Id) {
    711   Id.clear();
    712   do {
    713     if (Tok.is(MMToken::Identifier)) {
    714       Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation()));
    715       consumeToken();
    716     } else {
    717       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name);
    718       return true;
    719     }
    720 
    721     if (!Tok.is(MMToken::Period))
    722       break;
    723 
    724     consumeToken();
    725   } while (true);
    726 
    727   return false;
    728 }
    729 
    730 namespace {
    731   /// \brief Enumerates the known attributes.
    732   enum AttributeKind {
    733     /// \brief An unknown attribute.
    734     AT_unknown,
    735     /// \brief The 'system' attribute.
    736     AT_system
    737   };
    738 }
    739 
    740 /// \brief Parse a module declaration.
    741 ///
    742 ///   module-declaration:
    743 ///     'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt]
    744 ///       { module-member* }
    745 ///
    746 ///   attributes:
    747 ///     attribute attributes
    748 ///     attribute
    749 ///
    750 ///   attribute:
    751 ///     [ identifier ]
    752 ///
    753 ///   module-member:
    754 ///     requires-declaration
    755 ///     header-declaration
    756 ///     submodule-declaration
    757 ///     export-declaration
    758 ///
    759 ///   submodule-declaration:
    760 ///     module-declaration
    761 ///     inferred-submodule-declaration
    762 void ModuleMapParser::parseModuleDecl() {
    763   assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) ||
    764          Tok.is(MMToken::FrameworkKeyword));
    765   // Parse 'explicit' or 'framework' keyword, if present.
    766   SourceLocation ExplicitLoc;
    767   bool Explicit = false;
    768   bool Framework = false;
    769 
    770   // Parse 'explicit' keyword, if present.
    771   if (Tok.is(MMToken::ExplicitKeyword)) {
    772     ExplicitLoc = consumeToken();
    773     Explicit = true;
    774   }
    775 
    776   // Parse 'framework' keyword, if present.
    777   if (Tok.is(MMToken::FrameworkKeyword)) {
    778     consumeToken();
    779     Framework = true;
    780   }
    781 
    782   // Parse 'module' keyword.
    783   if (!Tok.is(MMToken::ModuleKeyword)) {
    784     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
    785     consumeToken();
    786     HadError = true;
    787     return;
    788   }
    789   consumeToken(); // 'module' keyword
    790 
    791   // If we have a wildcard for the module name, this is an inferred submodule.
    792   // Parse it.
    793   if (Tok.is(MMToken::Star))
    794     return parseInferredSubmoduleDecl(Explicit);
    795 
    796   // Parse the module name.
    797   ModuleId Id;
    798   if (parseModuleId(Id)) {
    799     HadError = true;
    800     return;
    801   }
    802 
    803   if (ActiveModule) {
    804     if (Id.size() > 1) {
    805       Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id)
    806         << SourceRange(Id.front().second, Id.back().second);
    807 
    808       HadError = true;
    809       return;
    810     }
    811   } else if (Id.size() == 1 && Explicit) {
    812     // Top-level modules can't be explicit.
    813     Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level);
    814     Explicit = false;
    815     ExplicitLoc = SourceLocation();
    816     HadError = true;
    817   }
    818 
    819   Module *PreviousActiveModule = ActiveModule;
    820   if (Id.size() > 1) {
    821     // This module map defines a submodule. Go find the module of which it
    822     // is a submodule.
    823     ActiveModule = 0;
    824     for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) {
    825       if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) {
    826         ActiveModule = Next;
    827         continue;
    828       }
    829 
    830       if (ActiveModule) {
    831         Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified)
    832           << Id[I].first << ActiveModule->getTopLevelModule();
    833       } else {
    834         Diags.Report(Id[I].second, diag::err_mmap_expected_module_name);
    835       }
    836       HadError = true;
    837       return;
    838     }
    839   }
    840 
    841   StringRef ModuleName = Id.back().first;
    842   SourceLocation ModuleNameLoc = Id.back().second;
    843 
    844   // Parse the optional attribute list.
    845   bool IsSystem = false;
    846   while (Tok.is(MMToken::LSquare)) {
    847     // Consume the '['.
    848     SourceLocation LSquareLoc = consumeToken();
    849 
    850     // Check whether we have an attribute name here.
    851     if (!Tok.is(MMToken::Identifier)) {
    852       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute);
    853       skipUntil(MMToken::RSquare);
    854       if (Tok.is(MMToken::RSquare))
    855         consumeToken();
    856       continue;
    857     }
    858 
    859     // Decode the attribute name.
    860     AttributeKind Attribute
    861       = llvm::StringSwitch<AttributeKind>(Tok.getString())
    862         .Case("system", AT_system)
    863         .Default(AT_unknown);
    864     switch (Attribute) {
    865     case AT_unknown:
    866       Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute)
    867         << Tok.getString();
    868       break;
    869 
    870     case AT_system:
    871       IsSystem = true;
    872       break;
    873     }
    874     consumeToken();
    875 
    876     // Consume the ']'.
    877     if (!Tok.is(MMToken::RSquare)) {
    878       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare);
    879       Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match);
    880       skipUntil(MMToken::RSquare);
    881     }
    882 
    883     if (Tok.is(MMToken::RSquare))
    884       consumeToken();
    885   }
    886 
    887   // Parse the opening brace.
    888   if (!Tok.is(MMToken::LBrace)) {
    889     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace)
    890       << ModuleName;
    891     HadError = true;
    892     return;
    893   }
    894   SourceLocation LBraceLoc = consumeToken();
    895 
    896   // Determine whether this (sub)module has already been defined.
    897   if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) {
    898     if (Existing->DefinitionLoc.isInvalid() && !ActiveModule) {
    899       // Skip the module definition.
    900       skipUntil(MMToken::RBrace);
    901       if (Tok.is(MMToken::RBrace))
    902         consumeToken();
    903       else {
    904         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
    905         Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
    906         HadError = true;
    907       }
    908       return;
    909     }
    910 
    911     Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition)
    912       << ModuleName;
    913     Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition);
    914 
    915     // Skip the module definition.
    916     skipUntil(MMToken::RBrace);
    917     if (Tok.is(MMToken::RBrace))
    918       consumeToken();
    919 
    920     HadError = true;
    921     return;
    922   }
    923 
    924   // Start defining this module.
    925   ActiveModule = Map.findOrCreateModule(ModuleName, ActiveModule, Framework,
    926                                         Explicit).first;
    927   ActiveModule->DefinitionLoc = ModuleNameLoc;
    928   if (IsSystem)
    929     ActiveModule->IsSystem = true;
    930 
    931   bool Done = false;
    932   do {
    933     switch (Tok.Kind) {
    934     case MMToken::EndOfFile:
    935     case MMToken::RBrace:
    936       Done = true;
    937       break;
    938 
    939     case MMToken::ExplicitKeyword:
    940     case MMToken::FrameworkKeyword:
    941     case MMToken::ModuleKeyword:
    942       parseModuleDecl();
    943       break;
    944 
    945     case MMToken::ExportKeyword:
    946       parseExportDecl();
    947       break;
    948 
    949     case MMToken::RequiresKeyword:
    950       parseRequiresDecl();
    951       break;
    952 
    953     case MMToken::UmbrellaKeyword: {
    954       SourceLocation UmbrellaLoc = consumeToken();
    955       if (Tok.is(MMToken::HeaderKeyword))
    956         parseHeaderDecl(UmbrellaLoc);
    957       else
    958         parseUmbrellaDirDecl(UmbrellaLoc);
    959       break;
    960     }
    961 
    962     case MMToken::HeaderKeyword:
    963       parseHeaderDecl(SourceLocation());
    964       break;
    965 
    966     default:
    967       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member);
    968       consumeToken();
    969       break;
    970     }
    971   } while (!Done);
    972 
    973   if (Tok.is(MMToken::RBrace))
    974     consumeToken();
    975   else {
    976     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
    977     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
    978     HadError = true;
    979   }
    980 
    981   // We're done parsing this module. Pop back to the previous module.
    982   ActiveModule = PreviousActiveModule;
    983 }
    984 
    985 /// \brief Parse a requires declaration.
    986 ///
    987 ///   requires-declaration:
    988 ///     'requires' feature-list
    989 ///
    990 ///   feature-list:
    991 ///     identifier ',' feature-list
    992 ///     identifier
    993 void ModuleMapParser::parseRequiresDecl() {
    994   assert(Tok.is(MMToken::RequiresKeyword));
    995 
    996   // Parse 'requires' keyword.
    997   consumeToken();
    998 
    999   // Parse the feature-list.
   1000   do {
   1001     if (!Tok.is(MMToken::Identifier)) {
   1002       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature);
   1003       HadError = true;
   1004       return;
   1005     }
   1006 
   1007     // Consume the feature name.
   1008     std::string Feature = Tok.getString();
   1009     consumeToken();
   1010 
   1011     // Add this feature.
   1012     ActiveModule->addRequirement(Feature, Map.LangOpts, *Map.Target);
   1013 
   1014     if (!Tok.is(MMToken::Comma))
   1015       break;
   1016 
   1017     // Consume the comma.
   1018     consumeToken();
   1019   } while (true);
   1020 }
   1021 
   1022 /// \brief Append to \p Paths the set of paths needed to get to the
   1023 /// subframework in which the given module lives.
   1024 static void appendSubframeworkPaths(Module *Mod,
   1025                                     llvm::SmallVectorImpl<char> &Path) {
   1026   // Collect the framework names from the given module to the top-level module.
   1027   llvm::SmallVector<StringRef, 2> Paths;
   1028   for (; Mod; Mod = Mod->Parent) {
   1029     if (Mod->IsFramework)
   1030       Paths.push_back(Mod->Name);
   1031   }
   1032 
   1033   if (Paths.empty())
   1034     return;
   1035 
   1036   // Add Frameworks/Name.framework for each subframework.
   1037   for (unsigned I = Paths.size() - 1; I != 0; --I) {
   1038     llvm::sys::path::append(Path, "Frameworks");
   1039     llvm::sys::path::append(Path, Paths[I-1] + ".framework");
   1040   }
   1041 }
   1042 
   1043 /// \brief Determine whether the given file name is the name of a builtin
   1044 /// header, supplied by Clang to replace, override, or augment existing system
   1045 /// headers.
   1046 static bool isBuiltinHeader(StringRef FileName) {
   1047   return llvm::StringSwitch<bool>(FileName)
   1048       .Case("float.h", true)
   1049       .Case("iso646.h", true)
   1050       .Case("limits.h", true)
   1051       .Case("stdalign.h", true)
   1052       .Case("stdarg.h", true)
   1053       .Case("stdbool.h", true)
   1054       .Case("stddef.h", true)
   1055       .Case("stdint.h", true)
   1056       .Case("tgmath.h", true)
   1057       .Case("unwind.h", true)
   1058       .Default(false);
   1059 }
   1060 
   1061 /// \brief Parse a header declaration.
   1062 ///
   1063 ///   header-declaration:
   1064 ///     'umbrella'[opt] 'header' string-literal
   1065 void ModuleMapParser::parseHeaderDecl(SourceLocation UmbrellaLoc) {
   1066   assert(Tok.is(MMToken::HeaderKeyword));
   1067   consumeToken();
   1068 
   1069   bool Umbrella = UmbrellaLoc.isValid();
   1070 
   1071   // Parse the header name.
   1072   if (!Tok.is(MMToken::StringLiteral)) {
   1073     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
   1074       << "header";
   1075     HadError = true;
   1076     return;
   1077   }
   1078   std::string FileName = Tok.getString();
   1079   SourceLocation FileNameLoc = consumeToken();
   1080 
   1081   // Check whether we already have an umbrella.
   1082   if (Umbrella && ActiveModule->Umbrella) {
   1083     Diags.Report(FileNameLoc, diag::err_mmap_umbrella_clash)
   1084       << ActiveModule->getFullModuleName();
   1085     HadError = true;
   1086     return;
   1087   }
   1088 
   1089   // Look for this file.
   1090   const FileEntry *File = 0;
   1091   const FileEntry *BuiltinFile = 0;
   1092   SmallString<128> PathName;
   1093   if (llvm::sys::path::is_absolute(FileName)) {
   1094     PathName = FileName;
   1095     File = SourceMgr.getFileManager().getFile(PathName);
   1096   } else if (const DirectoryEntry *Dir = getOverriddenHeaderSearchDir()) {
   1097     PathName = Dir->getName();
   1098     llvm::sys::path::append(PathName, FileName);
   1099     File = SourceMgr.getFileManager().getFile(PathName);
   1100   } else {
   1101     // Search for the header file within the search directory.
   1102     PathName = Directory->getName();
   1103     unsigned PathLength = PathName.size();
   1104 
   1105     if (ActiveModule->isPartOfFramework()) {
   1106       appendSubframeworkPaths(ActiveModule, PathName);
   1107 
   1108       // Check whether this file is in the public headers.
   1109       llvm::sys::path::append(PathName, "Headers");
   1110       llvm::sys::path::append(PathName, FileName);
   1111       File = SourceMgr.getFileManager().getFile(PathName);
   1112 
   1113       if (!File) {
   1114         // Check whether this file is in the private headers.
   1115         PathName.resize(PathLength);
   1116         llvm::sys::path::append(PathName, "PrivateHeaders");
   1117         llvm::sys::path::append(PathName, FileName);
   1118         File = SourceMgr.getFileManager().getFile(PathName);
   1119       }
   1120     } else {
   1121       // Lookup for normal headers.
   1122       llvm::sys::path::append(PathName, FileName);
   1123       File = SourceMgr.getFileManager().getFile(PathName);
   1124 
   1125       // If this is a system module with a top-level header, this header
   1126       // may have a counterpart (or replacement) in the set of headers
   1127       // supplied by Clang. Find that builtin header.
   1128       if (ActiveModule->IsSystem && !Umbrella && BuiltinIncludeDir &&
   1129           BuiltinIncludeDir != Directory && isBuiltinHeader(FileName)) {
   1130         SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName());
   1131         llvm::sys::path::append(BuiltinPathName, FileName);
   1132         BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName);
   1133 
   1134         // If Clang supplies this header but the underlying system does not,
   1135         // just silently swap in our builtin version. Otherwise, we'll end
   1136         // up adding both (later).
   1137         if (!File && BuiltinFile) {
   1138           File = BuiltinFile;
   1139           BuiltinFile = 0;
   1140         }
   1141       }
   1142     }
   1143   }
   1144 
   1145   // FIXME: We shouldn't be eagerly stat'ing every file named in a module map.
   1146   // Come up with a lazy way to do this.
   1147   if (File) {
   1148     if (const Module *OwningModule = Map.Headers[File]) {
   1149       Diags.Report(FileNameLoc, diag::err_mmap_header_conflict)
   1150         << FileName << OwningModule->getFullModuleName();
   1151       HadError = true;
   1152     } else if (Umbrella) {
   1153       const DirectoryEntry *UmbrellaDir = File->getDir();
   1154       if ((OwningModule = Map.UmbrellaDirs[UmbrellaDir])) {
   1155         Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
   1156           << OwningModule->getFullModuleName();
   1157         HadError = true;
   1158       } else {
   1159         // Record this umbrella header.
   1160         Map.setUmbrellaHeader(ActiveModule, File);
   1161       }
   1162     } else {
   1163       // Record this header.
   1164       Map.addHeader(ActiveModule, File);
   1165 
   1166       // If there is a builtin counterpart to this file, add it now.
   1167       if (BuiltinFile)
   1168         Map.addHeader(ActiveModule, BuiltinFile);
   1169     }
   1170   } else {
   1171     Diags.Report(FileNameLoc, diag::err_mmap_header_not_found)
   1172       << Umbrella << FileName;
   1173     HadError = true;
   1174   }
   1175 }
   1176 
   1177 /// \brief Parse an umbrella directory declaration.
   1178 ///
   1179 ///   umbrella-dir-declaration:
   1180 ///     umbrella string-literal
   1181 void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) {
   1182   // Parse the directory name.
   1183   if (!Tok.is(MMToken::StringLiteral)) {
   1184     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
   1185       << "umbrella";
   1186     HadError = true;
   1187     return;
   1188   }
   1189 
   1190   std::string DirName = Tok.getString();
   1191   SourceLocation DirNameLoc = consumeToken();
   1192 
   1193   // Check whether we already have an umbrella.
   1194   if (ActiveModule->Umbrella) {
   1195     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash)
   1196       << ActiveModule->getFullModuleName();
   1197     HadError = true;
   1198     return;
   1199   }
   1200 
   1201   // Look for this file.
   1202   const DirectoryEntry *Dir = 0;
   1203   if (llvm::sys::path::is_absolute(DirName))
   1204     Dir = SourceMgr.getFileManager().getDirectory(DirName);
   1205   else {
   1206     SmallString<128> PathName;
   1207     PathName = Directory->getName();
   1208     llvm::sys::path::append(PathName, DirName);
   1209     Dir = SourceMgr.getFileManager().getDirectory(PathName);
   1210   }
   1211 
   1212   if (!Dir) {
   1213     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found)
   1214       << DirName;
   1215     HadError = true;
   1216     return;
   1217   }
   1218 
   1219   if (Module *OwningModule = Map.UmbrellaDirs[Dir]) {
   1220     Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
   1221       << OwningModule->getFullModuleName();
   1222     HadError = true;
   1223     return;
   1224   }
   1225 
   1226   // Record this umbrella directory.
   1227   Map.setUmbrellaDir(ActiveModule, Dir);
   1228 }
   1229 
   1230 /// \brief Parse a module export declaration.
   1231 ///
   1232 ///   export-declaration:
   1233 ///     'export' wildcard-module-id
   1234 ///
   1235 ///   wildcard-module-id:
   1236 ///     identifier
   1237 ///     '*'
   1238 ///     identifier '.' wildcard-module-id
   1239 void ModuleMapParser::parseExportDecl() {
   1240   assert(Tok.is(MMToken::ExportKeyword));
   1241   SourceLocation ExportLoc = consumeToken();
   1242 
   1243   // Parse the module-id with an optional wildcard at the end.
   1244   ModuleId ParsedModuleId;
   1245   bool Wildcard = false;
   1246   do {
   1247     if (Tok.is(MMToken::Identifier)) {
   1248       ParsedModuleId.push_back(std::make_pair(Tok.getString(),
   1249                                               Tok.getLocation()));
   1250       consumeToken();
   1251 
   1252       if (Tok.is(MMToken::Period)) {
   1253         consumeToken();
   1254         continue;
   1255       }
   1256 
   1257       break;
   1258     }
   1259 
   1260     if(Tok.is(MMToken::Star)) {
   1261       Wildcard = true;
   1262       consumeToken();
   1263       break;
   1264     }
   1265 
   1266     Diags.Report(Tok.getLocation(), diag::err_mmap_export_module_id);
   1267     HadError = true;
   1268     return;
   1269   } while (true);
   1270 
   1271   Module::UnresolvedExportDecl Unresolved = {
   1272     ExportLoc, ParsedModuleId, Wildcard
   1273   };
   1274   ActiveModule->UnresolvedExports.push_back(Unresolved);
   1275 }
   1276 
   1277 void ModuleMapParser::parseInferredSubmoduleDecl(bool Explicit) {
   1278   assert(Tok.is(MMToken::Star));
   1279   SourceLocation StarLoc = consumeToken();
   1280   bool Failed = false;
   1281 
   1282   // Inferred modules must be submodules.
   1283   if (!ActiveModule) {
   1284     Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule);
   1285     Failed = true;
   1286   }
   1287 
   1288   // Inferred modules must have umbrella directories.
   1289   if (!Failed && !ActiveModule->getUmbrellaDir()) {
   1290     Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
   1291     Failed = true;
   1292   }
   1293 
   1294   // Check for redefinition of an inferred module.
   1295   if (!Failed && ActiveModule->InferSubmodules) {
   1296     Diags.Report(StarLoc, diag::err_mmap_inferred_redef);
   1297     if (ActiveModule->InferredSubmoduleLoc.isValid())
   1298       Diags.Report(ActiveModule->InferredSubmoduleLoc,
   1299                    diag::note_mmap_prev_definition);
   1300     Failed = true;
   1301   }
   1302 
   1303   // If there were any problems with this inferred submodule, skip its body.
   1304   if (Failed) {
   1305     if (Tok.is(MMToken::LBrace)) {
   1306       consumeToken();
   1307       skipUntil(MMToken::RBrace);
   1308       if (Tok.is(MMToken::RBrace))
   1309         consumeToken();
   1310     }
   1311     HadError = true;
   1312     return;
   1313   }
   1314 
   1315   // Note that we have an inferred submodule.
   1316   ActiveModule->InferSubmodules = true;
   1317   ActiveModule->InferredSubmoduleLoc = StarLoc;
   1318   ActiveModule->InferExplicitSubmodules = Explicit;
   1319 
   1320   // Parse the opening brace.
   1321   if (!Tok.is(MMToken::LBrace)) {
   1322     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard);
   1323     HadError = true;
   1324     return;
   1325   }
   1326   SourceLocation LBraceLoc = consumeToken();
   1327 
   1328   // Parse the body of the inferred submodule.
   1329   bool Done = false;
   1330   do {
   1331     switch (Tok.Kind) {
   1332     case MMToken::EndOfFile:
   1333     case MMToken::RBrace:
   1334       Done = true;
   1335       break;
   1336 
   1337     case MMToken::ExportKeyword: {
   1338       consumeToken();
   1339       if (Tok.is(MMToken::Star))
   1340         ActiveModule->InferExportWildcard = true;
   1341       else
   1342         Diags.Report(Tok.getLocation(),
   1343                      diag::err_mmap_expected_export_wildcard);
   1344       consumeToken();
   1345       break;
   1346     }
   1347 
   1348     case MMToken::ExplicitKeyword:
   1349     case MMToken::ModuleKeyword:
   1350     case MMToken::HeaderKeyword:
   1351     case MMToken::UmbrellaKeyword:
   1352     default:
   1353       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_wildcard_member);
   1354       consumeToken();
   1355       break;
   1356     }
   1357   } while (!Done);
   1358 
   1359   if (Tok.is(MMToken::RBrace))
   1360     consumeToken();
   1361   else {
   1362     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
   1363     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
   1364     HadError = true;
   1365   }
   1366 }
   1367 
   1368 /// \brief If there is a specific header search directory due the presence
   1369 /// of an umbrella directory, retrieve that directory. Otherwise, returns null.
   1370 const DirectoryEntry *ModuleMapParser::getOverriddenHeaderSearchDir() {
   1371   for (Module *Mod = ActiveModule; Mod; Mod = Mod->Parent) {
   1372     // If we have an umbrella directory, use that.
   1373     if (Mod->hasUmbrellaDir())
   1374       return Mod->getUmbrellaDir();
   1375 
   1376     // If we have a framework directory, stop looking.
   1377     if (Mod->IsFramework)
   1378       return 0;
   1379   }
   1380 
   1381   return 0;
   1382 }
   1383 
   1384 /// \brief Parse a module map file.
   1385 ///
   1386 ///   module-map-file:
   1387 ///     module-declaration*
   1388 bool ModuleMapParser::parseModuleMapFile() {
   1389   do {
   1390     switch (Tok.Kind) {
   1391     case MMToken::EndOfFile:
   1392       return HadError;
   1393 
   1394     case MMToken::ExplicitKeyword:
   1395     case MMToken::ModuleKeyword:
   1396     case MMToken::FrameworkKeyword:
   1397       parseModuleDecl();
   1398       break;
   1399 
   1400     case MMToken::Comma:
   1401     case MMToken::ExportKeyword:
   1402     case MMToken::HeaderKeyword:
   1403     case MMToken::Identifier:
   1404     case MMToken::LBrace:
   1405     case MMToken::LSquare:
   1406     case MMToken::Period:
   1407     case MMToken::RBrace:
   1408     case MMToken::RSquare:
   1409     case MMToken::RequiresKeyword:
   1410     case MMToken::Star:
   1411     case MMToken::StringLiteral:
   1412     case MMToken::UmbrellaKeyword:
   1413       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
   1414       HadError = true;
   1415       consumeToken();
   1416       break;
   1417     }
   1418   } while (true);
   1419 }
   1420 
   1421 bool ModuleMap::parseModuleMapFile(const FileEntry *File) {
   1422   assert(Target != 0 && "Missing target information");
   1423   FileID ID = SourceMgr->createFileID(File, SourceLocation(), SrcMgr::C_User);
   1424   const llvm::MemoryBuffer *Buffer = SourceMgr->getBuffer(ID);
   1425   if (!Buffer)
   1426     return true;
   1427 
   1428   // Parse this module map file.
   1429   Lexer L(ID, SourceMgr->getBuffer(ID), *SourceMgr, MMapLangOpts);
   1430   Diags->getClient()->BeginSourceFile(MMapLangOpts);
   1431   ModuleMapParser Parser(L, *SourceMgr, *Diags, *this, File->getDir(),
   1432                          BuiltinIncludeDir);
   1433   bool Result = Parser.parseModuleMapFile();
   1434   Diags->getClient()->EndSourceFile();
   1435 
   1436   return Result;
   1437 }
   1438