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 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(nullptr, 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(nullptr, 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, nullptr); 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 nullptr; 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 nullptr; 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 nullptr; 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(nullptr, true)); 703 704 // module * { export * } 705 Result->InferSubmodules = true; 706 Result->InferExportWildcard = true; 707 708 // Look for subframeworks. 709 std::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 nullptr; 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 nullptr; 868 869 // Use the expansion location to determine which module we're in. 870 FullSourceLoc ExpansionLoc = Loc.getExpansionLoc(); 871 if (!ExpansionLoc.isFileID()) 872 return nullptr; 873 874 const SourceManager &SrcMgr = Loc.getManager(); 875 FileID ExpansionFileID = ExpansionLoc.getFileID(); 876 877 while (const FileEntry *ExpansionFile 878 = SrcMgr.getFileEntryForID(ExpansionFileID)) { 879 // Find the module that owns this header (if any). 880 if (Module *Mod = findModuleForHeader(ExpansionFile).getModule()) 881 return Mod; 882 883 // No module owns this header, so look up the inclusion chain to see if 884 // any included header has an associated module. 885 SourceLocation IncludeLoc = SrcMgr.getIncludeLoc(ExpansionFileID); 886 if (IncludeLoc.isInvalid()) 887 return nullptr; 888 889 ExpansionFileID = SrcMgr.getFileID(IncludeLoc); 890 } 891 892 return nullptr; 893 } 894 895 //----------------------------------------------------------------------------// 896 // Module map file parser 897 //----------------------------------------------------------------------------// 898 899 namespace clang { 900 /// \brief A token in a module map file. 901 struct MMToken { 902 enum TokenKind { 903 Comma, 904 ConfigMacros, 905 Conflict, 906 EndOfFile, 907 HeaderKeyword, 908 Identifier, 909 Exclaim, 910 ExcludeKeyword, 911 ExplicitKeyword, 912 ExportKeyword, 913 ExternKeyword, 914 FrameworkKeyword, 915 LinkKeyword, 916 ModuleKeyword, 917 Period, 918 PrivateKeyword, 919 UmbrellaKeyword, 920 UseKeyword, 921 RequiresKeyword, 922 Star, 923 StringLiteral, 924 LBrace, 925 RBrace, 926 LSquare, 927 RSquare 928 } Kind; 929 930 unsigned Location; 931 unsigned StringLength; 932 const char *StringData; 933 934 void clear() { 935 Kind = EndOfFile; 936 Location = 0; 937 StringLength = 0; 938 StringData = nullptr; 939 } 940 941 bool is(TokenKind K) const { return Kind == K; } 942 943 SourceLocation getLocation() const { 944 return SourceLocation::getFromRawEncoding(Location); 945 } 946 947 StringRef getString() const { 948 return StringRef(StringData, StringLength); 949 } 950 }; 951 952 /// \brief The set of attributes that can be attached to a module. 953 struct Attributes { 954 Attributes() : IsSystem(), IsExternC(), IsExhaustive() { } 955 956 /// \brief Whether this is a system module. 957 unsigned IsSystem : 1; 958 959 /// \brief Whether this is an extern "C" module. 960 unsigned IsExternC : 1; 961 962 /// \brief Whether this is an exhaustive set of configuration macros. 963 unsigned IsExhaustive : 1; 964 }; 965 966 967 class ModuleMapParser { 968 Lexer &L; 969 SourceManager &SourceMgr; 970 971 /// \brief Default target information, used only for string literal 972 /// parsing. 973 const TargetInfo *Target; 974 975 DiagnosticsEngine &Diags; 976 ModuleMap ⤅ 977 978 /// \brief The current module map file. 979 const FileEntry *ModuleMapFile; 980 981 /// \brief The directory that this module map resides in. 982 const DirectoryEntry *Directory; 983 984 /// \brief The directory containing Clang-supplied headers. 985 const DirectoryEntry *BuiltinIncludeDir; 986 987 /// \brief Whether this module map is in a system header directory. 988 bool IsSystem; 989 990 /// \brief Whether an error occurred. 991 bool HadError; 992 993 /// \brief Stores string data for the various string literals referenced 994 /// during parsing. 995 llvm::BumpPtrAllocator StringData; 996 997 /// \brief The current token. 998 MMToken Tok; 999 1000 /// \brief The active module. 1001 Module *ActiveModule; 1002 1003 /// \brief Consume the current token and return its location. 1004 SourceLocation consumeToken(); 1005 1006 /// \brief Skip tokens until we reach the a token with the given kind 1007 /// (or the end of the file). 1008 void skipUntil(MMToken::TokenKind K); 1009 1010 typedef SmallVector<std::pair<std::string, SourceLocation>, 2> ModuleId; 1011 bool parseModuleId(ModuleId &Id); 1012 void parseModuleDecl(); 1013 void parseExternModuleDecl(); 1014 void parseRequiresDecl(); 1015 void parseHeaderDecl(clang::MMToken::TokenKind, 1016 SourceLocation LeadingLoc); 1017 void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc); 1018 void parseExportDecl(); 1019 void parseUseDecl(); 1020 void parseLinkDecl(); 1021 void parseConfigMacros(); 1022 void parseConflict(); 1023 void parseInferredModuleDecl(bool Framework, bool Explicit); 1024 bool parseOptionalAttributes(Attributes &Attrs); 1025 1026 public: 1027 explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr, 1028 const TargetInfo *Target, 1029 DiagnosticsEngine &Diags, 1030 ModuleMap &Map, 1031 const FileEntry *ModuleMapFile, 1032 const DirectoryEntry *Directory, 1033 const DirectoryEntry *BuiltinIncludeDir, 1034 bool IsSystem) 1035 : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map), 1036 ModuleMapFile(ModuleMapFile), Directory(Directory), 1037 BuiltinIncludeDir(BuiltinIncludeDir), IsSystem(IsSystem), 1038 HadError(false), ActiveModule(nullptr) 1039 { 1040 Tok.clear(); 1041 consumeToken(); 1042 } 1043 1044 bool parseModuleMapFile(); 1045 }; 1046 } 1047 1048 SourceLocation ModuleMapParser::consumeToken() { 1049 retry: 1050 SourceLocation Result = Tok.getLocation(); 1051 Tok.clear(); 1052 1053 Token LToken; 1054 L.LexFromRawLexer(LToken); 1055 Tok.Location = LToken.getLocation().getRawEncoding(); 1056 switch (LToken.getKind()) { 1057 case tok::raw_identifier: { 1058 StringRef RI = LToken.getRawIdentifier(); 1059 Tok.StringData = RI.data(); 1060 Tok.StringLength = RI.size(); 1061 Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(RI) 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 1080 case tok::comma: 1081 Tok.Kind = MMToken::Comma; 1082 break; 1083 1084 case tok::eof: 1085 Tok.Kind = MMToken::EndOfFile; 1086 break; 1087 1088 case tok::l_brace: 1089 Tok.Kind = MMToken::LBrace; 1090 break; 1091 1092 case tok::l_square: 1093 Tok.Kind = MMToken::LSquare; 1094 break; 1095 1096 case tok::period: 1097 Tok.Kind = MMToken::Period; 1098 break; 1099 1100 case tok::r_brace: 1101 Tok.Kind = MMToken::RBrace; 1102 break; 1103 1104 case tok::r_square: 1105 Tok.Kind = MMToken::RSquare; 1106 break; 1107 1108 case tok::star: 1109 Tok.Kind = MMToken::Star; 1110 break; 1111 1112 case tok::exclaim: 1113 Tok.Kind = MMToken::Exclaim; 1114 break; 1115 1116 case tok::string_literal: { 1117 if (LToken.hasUDSuffix()) { 1118 Diags.Report(LToken.getLocation(), diag::err_invalid_string_udl); 1119 HadError = true; 1120 goto retry; 1121 } 1122 1123 // Parse the string literal. 1124 LangOptions LangOpts; 1125 StringLiteralParser StringLiteral(LToken, SourceMgr, LangOpts, *Target); 1126 if (StringLiteral.hadError) 1127 goto retry; 1128 1129 // Copy the string literal into our string data allocator. 1130 unsigned Length = StringLiteral.GetStringLength(); 1131 char *Saved = StringData.Allocate<char>(Length + 1); 1132 memcpy(Saved, StringLiteral.GetString().data(), Length); 1133 Saved[Length] = 0; 1134 1135 // Form the token. 1136 Tok.Kind = MMToken::StringLiteral; 1137 Tok.StringData = Saved; 1138 Tok.StringLength = Length; 1139 break; 1140 } 1141 1142 case tok::comment: 1143 goto retry; 1144 1145 default: 1146 Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token); 1147 HadError = true; 1148 goto retry; 1149 } 1150 1151 return Result; 1152 } 1153 1154 void ModuleMapParser::skipUntil(MMToken::TokenKind K) { 1155 unsigned braceDepth = 0; 1156 unsigned squareDepth = 0; 1157 do { 1158 switch (Tok.Kind) { 1159 case MMToken::EndOfFile: 1160 return; 1161 1162 case MMToken::LBrace: 1163 if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 1164 return; 1165 1166 ++braceDepth; 1167 break; 1168 1169 case MMToken::LSquare: 1170 if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 1171 return; 1172 1173 ++squareDepth; 1174 break; 1175 1176 case MMToken::RBrace: 1177 if (braceDepth > 0) 1178 --braceDepth; 1179 else if (Tok.is(K)) 1180 return; 1181 break; 1182 1183 case MMToken::RSquare: 1184 if (squareDepth > 0) 1185 --squareDepth; 1186 else if (Tok.is(K)) 1187 return; 1188 break; 1189 1190 default: 1191 if (braceDepth == 0 && squareDepth == 0 && Tok.is(K)) 1192 return; 1193 break; 1194 } 1195 1196 consumeToken(); 1197 } while (true); 1198 } 1199 1200 /// \brief Parse a module-id. 1201 /// 1202 /// module-id: 1203 /// identifier 1204 /// identifier '.' module-id 1205 /// 1206 /// \returns true if an error occurred, false otherwise. 1207 bool ModuleMapParser::parseModuleId(ModuleId &Id) { 1208 Id.clear(); 1209 do { 1210 if (Tok.is(MMToken::Identifier) || Tok.is(MMToken::StringLiteral)) { 1211 Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation())); 1212 consumeToken(); 1213 } else { 1214 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name); 1215 return true; 1216 } 1217 1218 if (!Tok.is(MMToken::Period)) 1219 break; 1220 1221 consumeToken(); 1222 } while (true); 1223 1224 return false; 1225 } 1226 1227 namespace { 1228 /// \brief Enumerates the known attributes. 1229 enum AttributeKind { 1230 /// \brief An unknown attribute. 1231 AT_unknown, 1232 /// \brief The 'system' attribute. 1233 AT_system, 1234 /// \brief The 'extern_c' attribute. 1235 AT_extern_c, 1236 /// \brief The 'exhaustive' attribute. 1237 AT_exhaustive 1238 }; 1239 } 1240 1241 /// \brief Parse a module declaration. 1242 /// 1243 /// module-declaration: 1244 /// 'extern' 'module' module-id string-literal 1245 /// 'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt] 1246 /// { module-member* } 1247 /// 1248 /// module-member: 1249 /// requires-declaration 1250 /// header-declaration 1251 /// submodule-declaration 1252 /// export-declaration 1253 /// link-declaration 1254 /// 1255 /// submodule-declaration: 1256 /// module-declaration 1257 /// inferred-submodule-declaration 1258 void ModuleMapParser::parseModuleDecl() { 1259 assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) || 1260 Tok.is(MMToken::FrameworkKeyword) || Tok.is(MMToken::ExternKeyword)); 1261 if (Tok.is(MMToken::ExternKeyword)) { 1262 parseExternModuleDecl(); 1263 return; 1264 } 1265 1266 // Parse 'explicit' or 'framework' keyword, if present. 1267 SourceLocation ExplicitLoc; 1268 bool Explicit = false; 1269 bool Framework = false; 1270 1271 // Parse 'explicit' keyword, if present. 1272 if (Tok.is(MMToken::ExplicitKeyword)) { 1273 ExplicitLoc = consumeToken(); 1274 Explicit = true; 1275 } 1276 1277 // Parse 'framework' keyword, if present. 1278 if (Tok.is(MMToken::FrameworkKeyword)) { 1279 consumeToken(); 1280 Framework = true; 1281 } 1282 1283 // Parse 'module' keyword. 1284 if (!Tok.is(MMToken::ModuleKeyword)) { 1285 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 1286 consumeToken(); 1287 HadError = true; 1288 return; 1289 } 1290 consumeToken(); // 'module' keyword 1291 1292 // If we have a wildcard for the module name, this is an inferred submodule. 1293 // Parse it. 1294 if (Tok.is(MMToken::Star)) 1295 return parseInferredModuleDecl(Framework, Explicit); 1296 1297 // Parse the module name. 1298 ModuleId Id; 1299 if (parseModuleId(Id)) { 1300 HadError = true; 1301 return; 1302 } 1303 1304 if (ActiveModule) { 1305 if (Id.size() > 1) { 1306 Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id) 1307 << SourceRange(Id.front().second, Id.back().second); 1308 1309 HadError = true; 1310 return; 1311 } 1312 } else if (Id.size() == 1 && Explicit) { 1313 // Top-level modules can't be explicit. 1314 Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level); 1315 Explicit = false; 1316 ExplicitLoc = SourceLocation(); 1317 HadError = true; 1318 } 1319 1320 Module *PreviousActiveModule = ActiveModule; 1321 if (Id.size() > 1) { 1322 // This module map defines a submodule. Go find the module of which it 1323 // is a submodule. 1324 ActiveModule = nullptr; 1325 for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) { 1326 if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) { 1327 ActiveModule = Next; 1328 continue; 1329 } 1330 1331 if (ActiveModule) { 1332 Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified) 1333 << Id[I].first 1334 << ActiveModule->getTopLevelModule()->getFullModuleName(); 1335 } else { 1336 Diags.Report(Id[I].second, diag::err_mmap_expected_module_name); 1337 } 1338 HadError = true; 1339 return; 1340 } 1341 } 1342 1343 StringRef ModuleName = Id.back().first; 1344 SourceLocation ModuleNameLoc = Id.back().second; 1345 1346 // Parse the optional attribute list. 1347 Attributes Attrs; 1348 parseOptionalAttributes(Attrs); 1349 1350 // Parse the opening brace. 1351 if (!Tok.is(MMToken::LBrace)) { 1352 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace) 1353 << ModuleName; 1354 HadError = true; 1355 return; 1356 } 1357 SourceLocation LBraceLoc = consumeToken(); 1358 1359 // Determine whether this (sub)module has already been defined. 1360 if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) { 1361 if (Existing->DefinitionLoc.isInvalid() && !ActiveModule) { 1362 // Skip the module definition. 1363 skipUntil(MMToken::RBrace); 1364 if (Tok.is(MMToken::RBrace)) 1365 consumeToken(); 1366 else { 1367 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 1368 Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 1369 HadError = true; 1370 } 1371 return; 1372 } 1373 1374 Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition) 1375 << ModuleName; 1376 Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition); 1377 1378 // Skip the module definition. 1379 skipUntil(MMToken::RBrace); 1380 if (Tok.is(MMToken::RBrace)) 1381 consumeToken(); 1382 1383 HadError = true; 1384 return; 1385 } 1386 1387 // If this is a submodule, use the parent's module map, since we don't want 1388 // the private module map file. 1389 const FileEntry *ModuleMap = ActiveModule ? ActiveModule->ModuleMap 1390 : ModuleMapFile; 1391 1392 // Start defining this module. 1393 ActiveModule = Map.findOrCreateModule(ModuleName, ActiveModule, ModuleMap, 1394 Framework, Explicit).first; 1395 ActiveModule->DefinitionLoc = ModuleNameLoc; 1396 if (Attrs.IsSystem || IsSystem) 1397 ActiveModule->IsSystem = true; 1398 if (Attrs.IsExternC) 1399 ActiveModule->IsExternC = true; 1400 1401 bool Done = false; 1402 do { 1403 switch (Tok.Kind) { 1404 case MMToken::EndOfFile: 1405 case MMToken::RBrace: 1406 Done = true; 1407 break; 1408 1409 case MMToken::ConfigMacros: 1410 parseConfigMacros(); 1411 break; 1412 1413 case MMToken::Conflict: 1414 parseConflict(); 1415 break; 1416 1417 case MMToken::ExplicitKeyword: 1418 case MMToken::ExternKeyword: 1419 case MMToken::FrameworkKeyword: 1420 case MMToken::ModuleKeyword: 1421 parseModuleDecl(); 1422 break; 1423 1424 case MMToken::ExportKeyword: 1425 parseExportDecl(); 1426 break; 1427 1428 case MMToken::UseKeyword: 1429 parseUseDecl(); 1430 break; 1431 1432 case MMToken::RequiresKeyword: 1433 parseRequiresDecl(); 1434 break; 1435 1436 case MMToken::UmbrellaKeyword: { 1437 SourceLocation UmbrellaLoc = consumeToken(); 1438 if (Tok.is(MMToken::HeaderKeyword)) 1439 parseHeaderDecl(MMToken::UmbrellaKeyword, UmbrellaLoc); 1440 else 1441 parseUmbrellaDirDecl(UmbrellaLoc); 1442 break; 1443 } 1444 1445 case MMToken::ExcludeKeyword: { 1446 SourceLocation ExcludeLoc = consumeToken(); 1447 if (Tok.is(MMToken::HeaderKeyword)) { 1448 parseHeaderDecl(MMToken::ExcludeKeyword, ExcludeLoc); 1449 } else { 1450 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 1451 << "exclude"; 1452 } 1453 break; 1454 } 1455 1456 case MMToken::PrivateKeyword: { 1457 SourceLocation PrivateLoc = consumeToken(); 1458 if (Tok.is(MMToken::HeaderKeyword)) { 1459 parseHeaderDecl(MMToken::PrivateKeyword, PrivateLoc); 1460 } else { 1461 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 1462 << "private"; 1463 } 1464 break; 1465 } 1466 1467 case MMToken::HeaderKeyword: 1468 parseHeaderDecl(MMToken::HeaderKeyword, SourceLocation()); 1469 break; 1470 1471 case MMToken::LinkKeyword: 1472 parseLinkDecl(); 1473 break; 1474 1475 default: 1476 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member); 1477 consumeToken(); 1478 break; 1479 } 1480 } while (!Done); 1481 1482 if (Tok.is(MMToken::RBrace)) 1483 consumeToken(); 1484 else { 1485 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 1486 Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 1487 HadError = true; 1488 } 1489 1490 // If the active module is a top-level framework, and there are no link 1491 // libraries, automatically link against the framework. 1492 if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() && 1493 ActiveModule->LinkLibraries.empty()) { 1494 inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager()); 1495 } 1496 1497 // If the module meets all requirements but is still unavailable, mark the 1498 // whole tree as unavailable to prevent it from building. 1499 if (!ActiveModule->IsAvailable && !ActiveModule->IsMissingRequirement && 1500 ActiveModule->Parent) { 1501 ActiveModule->getTopLevelModule()->markUnavailable(); 1502 ActiveModule->getTopLevelModule()->MissingHeaders.append( 1503 ActiveModule->MissingHeaders.begin(), ActiveModule->MissingHeaders.end()); 1504 } 1505 1506 // We're done parsing this module. Pop back to the previous module. 1507 ActiveModule = PreviousActiveModule; 1508 } 1509 1510 /// \brief Parse an extern module declaration. 1511 /// 1512 /// extern module-declaration: 1513 /// 'extern' 'module' module-id string-literal 1514 void ModuleMapParser::parseExternModuleDecl() { 1515 assert(Tok.is(MMToken::ExternKeyword)); 1516 consumeToken(); // 'extern' keyword 1517 1518 // Parse 'module' keyword. 1519 if (!Tok.is(MMToken::ModuleKeyword)) { 1520 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 1521 consumeToken(); 1522 HadError = true; 1523 return; 1524 } 1525 consumeToken(); // 'module' keyword 1526 1527 // Parse the module name. 1528 ModuleId Id; 1529 if (parseModuleId(Id)) { 1530 HadError = true; 1531 return; 1532 } 1533 1534 // Parse the referenced module map file name. 1535 if (!Tok.is(MMToken::StringLiteral)) { 1536 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_mmap_file); 1537 HadError = true; 1538 return; 1539 } 1540 std::string FileName = Tok.getString(); 1541 consumeToken(); // filename 1542 1543 StringRef FileNameRef = FileName; 1544 SmallString<128> ModuleMapFileName; 1545 if (llvm::sys::path::is_relative(FileNameRef)) { 1546 ModuleMapFileName += Directory->getName(); 1547 llvm::sys::path::append(ModuleMapFileName, FileName); 1548 FileNameRef = ModuleMapFileName.str(); 1549 } 1550 if (const FileEntry *File = SourceMgr.getFileManager().getFile(FileNameRef)) 1551 Map.parseModuleMapFile(File, /*IsSystem=*/false); 1552 } 1553 1554 /// \brief Parse a requires declaration. 1555 /// 1556 /// requires-declaration: 1557 /// 'requires' feature-list 1558 /// 1559 /// feature-list: 1560 /// feature ',' feature-list 1561 /// feature 1562 /// 1563 /// feature: 1564 /// '!'[opt] identifier 1565 void ModuleMapParser::parseRequiresDecl() { 1566 assert(Tok.is(MMToken::RequiresKeyword)); 1567 1568 // Parse 'requires' keyword. 1569 consumeToken(); 1570 1571 // Parse the feature-list. 1572 do { 1573 bool RequiredState = true; 1574 if (Tok.is(MMToken::Exclaim)) { 1575 RequiredState = false; 1576 consumeToken(); 1577 } 1578 1579 if (!Tok.is(MMToken::Identifier)) { 1580 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature); 1581 HadError = true; 1582 return; 1583 } 1584 1585 // Consume the feature name. 1586 std::string Feature = Tok.getString(); 1587 consumeToken(); 1588 1589 // Add this feature. 1590 ActiveModule->addRequirement(Feature, RequiredState, 1591 Map.LangOpts, *Map.Target); 1592 1593 if (!Tok.is(MMToken::Comma)) 1594 break; 1595 1596 // Consume the comma. 1597 consumeToken(); 1598 } while (true); 1599 } 1600 1601 /// \brief Append to \p Paths the set of paths needed to get to the 1602 /// subframework in which the given module lives. 1603 static void appendSubframeworkPaths(Module *Mod, 1604 SmallVectorImpl<char> &Path) { 1605 // Collect the framework names from the given module to the top-level module. 1606 SmallVector<StringRef, 2> Paths; 1607 for (; Mod; Mod = Mod->Parent) { 1608 if (Mod->IsFramework) 1609 Paths.push_back(Mod->Name); 1610 } 1611 1612 if (Paths.empty()) 1613 return; 1614 1615 // Add Frameworks/Name.framework for each subframework. 1616 for (unsigned I = Paths.size() - 1; I != 0; --I) 1617 llvm::sys::path::append(Path, "Frameworks", Paths[I-1] + ".framework"); 1618 } 1619 1620 /// \brief Parse a header declaration. 1621 /// 1622 /// header-declaration: 1623 /// 'umbrella'[opt] 'header' string-literal 1624 /// 'exclude'[opt] 'header' string-literal 1625 void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken, 1626 SourceLocation LeadingLoc) { 1627 assert(Tok.is(MMToken::HeaderKeyword)); 1628 consumeToken(); 1629 1630 // Parse the header name. 1631 if (!Tok.is(MMToken::StringLiteral)) { 1632 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 1633 << "header"; 1634 HadError = true; 1635 return; 1636 } 1637 Module::HeaderDirective Header; 1638 Header.FileName = Tok.getString(); 1639 Header.FileNameLoc = consumeToken(); 1640 1641 // Check whether we already have an umbrella. 1642 if (LeadingToken == MMToken::UmbrellaKeyword && ActiveModule->Umbrella) { 1643 Diags.Report(Header.FileNameLoc, diag::err_mmap_umbrella_clash) 1644 << ActiveModule->getFullModuleName(); 1645 HadError = true; 1646 return; 1647 } 1648 1649 // Look for this file. 1650 const FileEntry *File = nullptr; 1651 const FileEntry *BuiltinFile = nullptr; 1652 SmallString<128> PathName; 1653 if (llvm::sys::path::is_absolute(Header.FileName)) { 1654 PathName = Header.FileName; 1655 File = SourceMgr.getFileManager().getFile(PathName); 1656 } else { 1657 // Search for the header file within the search directory. 1658 PathName = Directory->getName(); 1659 unsigned PathLength = PathName.size(); 1660 1661 if (ActiveModule->isPartOfFramework()) { 1662 appendSubframeworkPaths(ActiveModule, PathName); 1663 1664 // Check whether this file is in the public headers. 1665 llvm::sys::path::append(PathName, "Headers", Header.FileName); 1666 File = SourceMgr.getFileManager().getFile(PathName); 1667 1668 if (!File) { 1669 // Check whether this file is in the private headers. 1670 PathName.resize(PathLength); 1671 llvm::sys::path::append(PathName, "PrivateHeaders", Header.FileName); 1672 File = SourceMgr.getFileManager().getFile(PathName); 1673 } 1674 } else { 1675 // Lookup for normal headers. 1676 llvm::sys::path::append(PathName, Header.FileName); 1677 File = SourceMgr.getFileManager().getFile(PathName); 1678 1679 // If this is a system module with a top-level header, this header 1680 // may have a counterpart (or replacement) in the set of headers 1681 // supplied by Clang. Find that builtin header. 1682 if (ActiveModule->IsSystem && LeadingToken != MMToken::UmbrellaKeyword && 1683 BuiltinIncludeDir && BuiltinIncludeDir != Directory && 1684 isBuiltinHeader(Header.FileName)) { 1685 SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName()); 1686 llvm::sys::path::append(BuiltinPathName, Header.FileName); 1687 BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName); 1688 1689 // If Clang supplies this header but the underlying system does not, 1690 // just silently swap in our builtin version. Otherwise, we'll end 1691 // up adding both (later). 1692 if (!File && BuiltinFile) { 1693 File = BuiltinFile; 1694 BuiltinFile = nullptr; 1695 } 1696 } 1697 } 1698 } 1699 1700 // FIXME: We shouldn't be eagerly stat'ing every file named in a module map. 1701 // Come up with a lazy way to do this. 1702 if (File) { 1703 if (LeadingToken == MMToken::UmbrellaKeyword) { 1704 const DirectoryEntry *UmbrellaDir = File->getDir(); 1705 if (Module *UmbrellaModule = Map.UmbrellaDirs[UmbrellaDir]) { 1706 Diags.Report(LeadingLoc, diag::err_mmap_umbrella_clash) 1707 << UmbrellaModule->getFullModuleName(); 1708 HadError = true; 1709 } else { 1710 // Record this umbrella header. 1711 Map.setUmbrellaHeader(ActiveModule, File); 1712 } 1713 } else { 1714 // Record this header. 1715 ModuleMap::ModuleHeaderRole Role = ModuleMap::NormalHeader; 1716 if (LeadingToken == MMToken::ExcludeKeyword) 1717 Role = ModuleMap::ExcludedHeader; 1718 else if (LeadingToken == MMToken::PrivateKeyword) 1719 Role = ModuleMap::PrivateHeader; 1720 else 1721 assert(LeadingToken == MMToken::HeaderKeyword); 1722 1723 Map.addHeader(ActiveModule, File, Role); 1724 1725 // If there is a builtin counterpart to this file, add it now. 1726 if (BuiltinFile) 1727 Map.addHeader(ActiveModule, BuiltinFile, Role); 1728 } 1729 } else if (LeadingToken != MMToken::ExcludeKeyword) { 1730 // Ignore excluded header files. They're optional anyway. 1731 1732 // If we find a module that has a missing header, we mark this module as 1733 // unavailable and store the header directive for displaying diagnostics. 1734 Header.IsUmbrella = LeadingToken == MMToken::UmbrellaKeyword; 1735 ActiveModule->markUnavailable(); 1736 ActiveModule->MissingHeaders.push_back(Header); 1737 } 1738 } 1739 1740 /// \brief Parse an umbrella directory declaration. 1741 /// 1742 /// umbrella-dir-declaration: 1743 /// umbrella string-literal 1744 void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) { 1745 // Parse the directory name. 1746 if (!Tok.is(MMToken::StringLiteral)) { 1747 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 1748 << "umbrella"; 1749 HadError = true; 1750 return; 1751 } 1752 1753 std::string DirName = Tok.getString(); 1754 SourceLocation DirNameLoc = consumeToken(); 1755 1756 // Check whether we already have an umbrella. 1757 if (ActiveModule->Umbrella) { 1758 Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash) 1759 << ActiveModule->getFullModuleName(); 1760 HadError = true; 1761 return; 1762 } 1763 1764 // Look for this file. 1765 const DirectoryEntry *Dir = nullptr; 1766 if (llvm::sys::path::is_absolute(DirName)) 1767 Dir = SourceMgr.getFileManager().getDirectory(DirName); 1768 else { 1769 SmallString<128> PathName; 1770 PathName = Directory->getName(); 1771 llvm::sys::path::append(PathName, DirName); 1772 Dir = SourceMgr.getFileManager().getDirectory(PathName); 1773 } 1774 1775 if (!Dir) { 1776 Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found) 1777 << DirName; 1778 HadError = true; 1779 return; 1780 } 1781 1782 if (Module *OwningModule = Map.UmbrellaDirs[Dir]) { 1783 Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash) 1784 << OwningModule->getFullModuleName(); 1785 HadError = true; 1786 return; 1787 } 1788 1789 // Record this umbrella directory. 1790 Map.setUmbrellaDir(ActiveModule, Dir); 1791 } 1792 1793 /// \brief Parse a module export declaration. 1794 /// 1795 /// export-declaration: 1796 /// 'export' wildcard-module-id 1797 /// 1798 /// wildcard-module-id: 1799 /// identifier 1800 /// '*' 1801 /// identifier '.' wildcard-module-id 1802 void ModuleMapParser::parseExportDecl() { 1803 assert(Tok.is(MMToken::ExportKeyword)); 1804 SourceLocation ExportLoc = consumeToken(); 1805 1806 // Parse the module-id with an optional wildcard at the end. 1807 ModuleId ParsedModuleId; 1808 bool Wildcard = false; 1809 do { 1810 if (Tok.is(MMToken::Identifier)) { 1811 ParsedModuleId.push_back(std::make_pair(Tok.getString(), 1812 Tok.getLocation())); 1813 consumeToken(); 1814 1815 if (Tok.is(MMToken::Period)) { 1816 consumeToken(); 1817 continue; 1818 } 1819 1820 break; 1821 } 1822 1823 if(Tok.is(MMToken::Star)) { 1824 Wildcard = true; 1825 consumeToken(); 1826 break; 1827 } 1828 1829 Diags.Report(Tok.getLocation(), diag::err_mmap_module_id); 1830 HadError = true; 1831 return; 1832 } while (true); 1833 1834 Module::UnresolvedExportDecl Unresolved = { 1835 ExportLoc, ParsedModuleId, Wildcard 1836 }; 1837 ActiveModule->UnresolvedExports.push_back(Unresolved); 1838 } 1839 1840 /// \brief Parse a module uses declaration. 1841 /// 1842 /// uses-declaration: 1843 /// 'uses' wildcard-module-id 1844 void ModuleMapParser::parseUseDecl() { 1845 assert(Tok.is(MMToken::UseKeyword)); 1846 consumeToken(); 1847 // Parse the module-id. 1848 ModuleId ParsedModuleId; 1849 parseModuleId(ParsedModuleId); 1850 1851 ActiveModule->UnresolvedDirectUses.push_back(ParsedModuleId); 1852 } 1853 1854 /// \brief Parse a link declaration. 1855 /// 1856 /// module-declaration: 1857 /// 'link' 'framework'[opt] string-literal 1858 void ModuleMapParser::parseLinkDecl() { 1859 assert(Tok.is(MMToken::LinkKeyword)); 1860 SourceLocation LinkLoc = consumeToken(); 1861 1862 // Parse the optional 'framework' keyword. 1863 bool IsFramework = false; 1864 if (Tok.is(MMToken::FrameworkKeyword)) { 1865 consumeToken(); 1866 IsFramework = true; 1867 } 1868 1869 // Parse the library name 1870 if (!Tok.is(MMToken::StringLiteral)) { 1871 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_library_name) 1872 << IsFramework << SourceRange(LinkLoc); 1873 HadError = true; 1874 return; 1875 } 1876 1877 std::string LibraryName = Tok.getString(); 1878 consumeToken(); 1879 ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName, 1880 IsFramework)); 1881 } 1882 1883 /// \brief Parse a configuration macro declaration. 1884 /// 1885 /// module-declaration: 1886 /// 'config_macros' attributes[opt] config-macro-list? 1887 /// 1888 /// config-macro-list: 1889 /// identifier (',' identifier)? 1890 void ModuleMapParser::parseConfigMacros() { 1891 assert(Tok.is(MMToken::ConfigMacros)); 1892 SourceLocation ConfigMacrosLoc = consumeToken(); 1893 1894 // Only top-level modules can have configuration macros. 1895 if (ActiveModule->Parent) { 1896 Diags.Report(ConfigMacrosLoc, diag::err_mmap_config_macro_submodule); 1897 } 1898 1899 // Parse the optional attributes. 1900 Attributes Attrs; 1901 parseOptionalAttributes(Attrs); 1902 if (Attrs.IsExhaustive && !ActiveModule->Parent) { 1903 ActiveModule->ConfigMacrosExhaustive = true; 1904 } 1905 1906 // If we don't have an identifier, we're done. 1907 if (!Tok.is(MMToken::Identifier)) 1908 return; 1909 1910 // Consume the first identifier. 1911 if (!ActiveModule->Parent) { 1912 ActiveModule->ConfigMacros.push_back(Tok.getString().str()); 1913 } 1914 consumeToken(); 1915 1916 do { 1917 // If there's a comma, consume it. 1918 if (!Tok.is(MMToken::Comma)) 1919 break; 1920 consumeToken(); 1921 1922 // We expect to see a macro name here. 1923 if (!Tok.is(MMToken::Identifier)) { 1924 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_config_macro); 1925 break; 1926 } 1927 1928 // Consume the macro name. 1929 if (!ActiveModule->Parent) { 1930 ActiveModule->ConfigMacros.push_back(Tok.getString().str()); 1931 } 1932 consumeToken(); 1933 } while (true); 1934 } 1935 1936 /// \brief Format a module-id into a string. 1937 static std::string formatModuleId(const ModuleId &Id) { 1938 std::string result; 1939 { 1940 llvm::raw_string_ostream OS(result); 1941 1942 for (unsigned I = 0, N = Id.size(); I != N; ++I) { 1943 if (I) 1944 OS << "."; 1945 OS << Id[I].first; 1946 } 1947 } 1948 1949 return result; 1950 } 1951 1952 /// \brief Parse a conflict declaration. 1953 /// 1954 /// module-declaration: 1955 /// 'conflict' module-id ',' string-literal 1956 void ModuleMapParser::parseConflict() { 1957 assert(Tok.is(MMToken::Conflict)); 1958 SourceLocation ConflictLoc = consumeToken(); 1959 Module::UnresolvedConflict Conflict; 1960 1961 // Parse the module-id. 1962 if (parseModuleId(Conflict.Id)) 1963 return; 1964 1965 // Parse the ','. 1966 if (!Tok.is(MMToken::Comma)) { 1967 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_comma) 1968 << SourceRange(ConflictLoc); 1969 return; 1970 } 1971 consumeToken(); 1972 1973 // Parse the message. 1974 if (!Tok.is(MMToken::StringLiteral)) { 1975 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_message) 1976 << formatModuleId(Conflict.Id); 1977 return; 1978 } 1979 Conflict.Message = Tok.getString().str(); 1980 consumeToken(); 1981 1982 // Add this unresolved conflict. 1983 ActiveModule->UnresolvedConflicts.push_back(Conflict); 1984 } 1985 1986 /// \brief Parse an inferred module declaration (wildcard modules). 1987 /// 1988 /// module-declaration: 1989 /// 'explicit'[opt] 'framework'[opt] 'module' * attributes[opt] 1990 /// { inferred-module-member* } 1991 /// 1992 /// inferred-module-member: 1993 /// 'export' '*' 1994 /// 'exclude' identifier 1995 void ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) { 1996 assert(Tok.is(MMToken::Star)); 1997 SourceLocation StarLoc = consumeToken(); 1998 bool Failed = false; 1999 2000 // Inferred modules must be submodules. 2001 if (!ActiveModule && !Framework) { 2002 Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule); 2003 Failed = true; 2004 } 2005 2006 if (ActiveModule) { 2007 // Inferred modules must have umbrella directories. 2008 if (!Failed && ActiveModule->IsAvailable && 2009 !ActiveModule->getUmbrellaDir()) { 2010 Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella); 2011 Failed = true; 2012 } 2013 2014 // Check for redefinition of an inferred module. 2015 if (!Failed && ActiveModule->InferSubmodules) { 2016 Diags.Report(StarLoc, diag::err_mmap_inferred_redef); 2017 if (ActiveModule->InferredSubmoduleLoc.isValid()) 2018 Diags.Report(ActiveModule->InferredSubmoduleLoc, 2019 diag::note_mmap_prev_definition); 2020 Failed = true; 2021 } 2022 2023 // Check for the 'framework' keyword, which is not permitted here. 2024 if (Framework) { 2025 Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule); 2026 Framework = false; 2027 } 2028 } else if (Explicit) { 2029 Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework); 2030 Explicit = false; 2031 } 2032 2033 // If there were any problems with this inferred submodule, skip its body. 2034 if (Failed) { 2035 if (Tok.is(MMToken::LBrace)) { 2036 consumeToken(); 2037 skipUntil(MMToken::RBrace); 2038 if (Tok.is(MMToken::RBrace)) 2039 consumeToken(); 2040 } 2041 HadError = true; 2042 return; 2043 } 2044 2045 // Parse optional attributes. 2046 Attributes Attrs; 2047 parseOptionalAttributes(Attrs); 2048 2049 if (ActiveModule) { 2050 // Note that we have an inferred submodule. 2051 ActiveModule->InferSubmodules = true; 2052 ActiveModule->InferredSubmoduleLoc = StarLoc; 2053 ActiveModule->InferExplicitSubmodules = Explicit; 2054 } else { 2055 // We'll be inferring framework modules for this directory. 2056 Map.InferredDirectories[Directory].InferModules = true; 2057 Map.InferredDirectories[Directory].InferSystemModules = Attrs.IsSystem; 2058 Map.InferredDirectories[Directory].ModuleMapFile = ModuleMapFile; 2059 // FIXME: Handle the 'framework' keyword. 2060 } 2061 2062 // Parse the opening brace. 2063 if (!Tok.is(MMToken::LBrace)) { 2064 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard); 2065 HadError = true; 2066 return; 2067 } 2068 SourceLocation LBraceLoc = consumeToken(); 2069 2070 // Parse the body of the inferred submodule. 2071 bool Done = false; 2072 do { 2073 switch (Tok.Kind) { 2074 case MMToken::EndOfFile: 2075 case MMToken::RBrace: 2076 Done = true; 2077 break; 2078 2079 case MMToken::ExcludeKeyword: { 2080 if (ActiveModule) { 2081 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 2082 << (ActiveModule != nullptr); 2083 consumeToken(); 2084 break; 2085 } 2086 2087 consumeToken(); 2088 if (!Tok.is(MMToken::Identifier)) { 2089 Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name); 2090 break; 2091 } 2092 2093 Map.InferredDirectories[Directory].ExcludedModules 2094 .push_back(Tok.getString()); 2095 consumeToken(); 2096 break; 2097 } 2098 2099 case MMToken::ExportKeyword: 2100 if (!ActiveModule) { 2101 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 2102 << (ActiveModule != nullptr); 2103 consumeToken(); 2104 break; 2105 } 2106 2107 consumeToken(); 2108 if (Tok.is(MMToken::Star)) 2109 ActiveModule->InferExportWildcard = true; 2110 else 2111 Diags.Report(Tok.getLocation(), 2112 diag::err_mmap_expected_export_wildcard); 2113 consumeToken(); 2114 break; 2115 2116 case MMToken::ExplicitKeyword: 2117 case MMToken::ModuleKeyword: 2118 case MMToken::HeaderKeyword: 2119 case MMToken::PrivateKeyword: 2120 case MMToken::UmbrellaKeyword: 2121 default: 2122 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 2123 << (ActiveModule != nullptr); 2124 consumeToken(); 2125 break; 2126 } 2127 } while (!Done); 2128 2129 if (Tok.is(MMToken::RBrace)) 2130 consumeToken(); 2131 else { 2132 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 2133 Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 2134 HadError = true; 2135 } 2136 } 2137 2138 /// \brief Parse optional attributes. 2139 /// 2140 /// attributes: 2141 /// attribute attributes 2142 /// attribute 2143 /// 2144 /// attribute: 2145 /// [ identifier ] 2146 /// 2147 /// \param Attrs Will be filled in with the parsed attributes. 2148 /// 2149 /// \returns true if an error occurred, false otherwise. 2150 bool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) { 2151 bool HadError = false; 2152 2153 while (Tok.is(MMToken::LSquare)) { 2154 // Consume the '['. 2155 SourceLocation LSquareLoc = consumeToken(); 2156 2157 // Check whether we have an attribute name here. 2158 if (!Tok.is(MMToken::Identifier)) { 2159 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute); 2160 skipUntil(MMToken::RSquare); 2161 if (Tok.is(MMToken::RSquare)) 2162 consumeToken(); 2163 HadError = true; 2164 } 2165 2166 // Decode the attribute name. 2167 AttributeKind Attribute 2168 = llvm::StringSwitch<AttributeKind>(Tok.getString()) 2169 .Case("exhaustive", AT_exhaustive) 2170 .Case("extern_c", AT_extern_c) 2171 .Case("system", AT_system) 2172 .Default(AT_unknown); 2173 switch (Attribute) { 2174 case AT_unknown: 2175 Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute) 2176 << Tok.getString(); 2177 break; 2178 2179 case AT_system: 2180 Attrs.IsSystem = true; 2181 break; 2182 2183 case AT_extern_c: 2184 Attrs.IsExternC = true; 2185 break; 2186 2187 case AT_exhaustive: 2188 Attrs.IsExhaustive = true; 2189 break; 2190 } 2191 consumeToken(); 2192 2193 // Consume the ']'. 2194 if (!Tok.is(MMToken::RSquare)) { 2195 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare); 2196 Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match); 2197 skipUntil(MMToken::RSquare); 2198 HadError = true; 2199 } 2200 2201 if (Tok.is(MMToken::RSquare)) 2202 consumeToken(); 2203 } 2204 2205 return HadError; 2206 } 2207 2208 /// \brief Parse a module map file. 2209 /// 2210 /// module-map-file: 2211 /// module-declaration* 2212 bool ModuleMapParser::parseModuleMapFile() { 2213 do { 2214 switch (Tok.Kind) { 2215 case MMToken::EndOfFile: 2216 return HadError; 2217 2218 case MMToken::ExplicitKeyword: 2219 case MMToken::ExternKeyword: 2220 case MMToken::ModuleKeyword: 2221 case MMToken::FrameworkKeyword: 2222 parseModuleDecl(); 2223 break; 2224 2225 case MMToken::Comma: 2226 case MMToken::ConfigMacros: 2227 case MMToken::Conflict: 2228 case MMToken::Exclaim: 2229 case MMToken::ExcludeKeyword: 2230 case MMToken::ExportKeyword: 2231 case MMToken::HeaderKeyword: 2232 case MMToken::Identifier: 2233 case MMToken::LBrace: 2234 case MMToken::LinkKeyword: 2235 case MMToken::LSquare: 2236 case MMToken::Period: 2237 case MMToken::PrivateKeyword: 2238 case MMToken::RBrace: 2239 case MMToken::RSquare: 2240 case MMToken::RequiresKeyword: 2241 case MMToken::Star: 2242 case MMToken::StringLiteral: 2243 case MMToken::UmbrellaKeyword: 2244 case MMToken::UseKeyword: 2245 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 2246 HadError = true; 2247 consumeToken(); 2248 break; 2249 } 2250 } while (true); 2251 } 2252 2253 bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem) { 2254 llvm::DenseMap<const FileEntry *, bool>::iterator Known 2255 = ParsedModuleMap.find(File); 2256 if (Known != ParsedModuleMap.end()) 2257 return Known->second; 2258 2259 assert(Target && "Missing target information"); 2260 auto FileCharacter = IsSystem ? SrcMgr::C_System : SrcMgr::C_User; 2261 FileID ID = SourceMgr.createFileID(File, SourceLocation(), FileCharacter); 2262 const llvm::MemoryBuffer *Buffer = SourceMgr.getBuffer(ID); 2263 if (!Buffer) 2264 return ParsedModuleMap[File] = true; 2265 2266 // Find the directory for the module. For frameworks, that may require going 2267 // up from the 'Modules' directory. 2268 const DirectoryEntry *Dir = File->getDir(); 2269 StringRef DirName(Dir->getName()); 2270 if (llvm::sys::path::filename(DirName) == "Modules") { 2271 DirName = llvm::sys::path::parent_path(DirName); 2272 if (DirName.endswith(".framework")) 2273 Dir = SourceMgr.getFileManager().getDirectory(DirName); 2274 assert(Dir && "parent must exist"); 2275 } 2276 2277 // Parse this module map file. 2278 Lexer L(ID, SourceMgr.getBuffer(ID), SourceMgr, MMapLangOpts); 2279 ModuleMapParser Parser(L, SourceMgr, Target, Diags, *this, File, Dir, 2280 BuiltinIncludeDir, IsSystem); 2281 bool Result = Parser.parseModuleMapFile(); 2282 ParsedModuleMap[File] = Result; 2283 return Result; 2284 } 2285