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