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