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