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