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 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 source module over all others. 347 if (H.getModule()->getTopLevelModule() == SourceModule) 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 (!Parent) { 560 if (LangOpts.CurrentModule == Name) 561 SourceModule = Result; 562 Modules[Name] = Result; 563 } 564 return std::make_pair(Result, true); 565 } 566 567 /// \brief For a framework module, infer the framework against which we 568 /// should link. 569 static void inferFrameworkLink(Module *Mod, const DirectoryEntry *FrameworkDir, 570 FileManager &FileMgr) { 571 assert(Mod->IsFramework && "Can only infer linking for framework modules"); 572 assert(!Mod->isSubFramework() && 573 "Can only infer linking for top-level frameworks"); 574 575 SmallString<128> LibName; 576 LibName += FrameworkDir->getName(); 577 llvm::sys::path::append(LibName, Mod->Name); 578 579 // The library name of a framework has more than one possible extension since 580 // the introduction of the text-based dynamic library format. We need to check 581 // for both before we give up. 582 static const char *frameworkExtensions[] = {"", ".tbd"}; 583 for (const auto *extension : frameworkExtensions) { 584 llvm::sys::path::replace_extension(LibName, extension); 585 if (FileMgr.getFile(LibName)) { 586 Mod->LinkLibraries.push_back(Module::LinkLibrary(Mod->Name, 587 /*IsFramework=*/true)); 588 return; 589 } 590 } 591 } 592 593 Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir, 594 bool IsSystem, Module *Parent) { 595 Attributes Attrs; 596 Attrs.IsSystem = IsSystem; 597 return inferFrameworkModule(FrameworkDir, Attrs, Parent); 598 } 599 600 Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir, 601 Attributes Attrs, Module *Parent) { 602 // Note: as an egregious but useful hack we use the real path here, because 603 // we might be looking at an embedded framework that symlinks out to a 604 // top-level framework, and we need to infer as if we were naming the 605 // top-level framework. 606 StringRef FrameworkDirName = 607 SourceMgr.getFileManager().getCanonicalName(FrameworkDir); 608 609 // In case this is a case-insensitive filesystem, use the canonical 610 // directory name as the ModuleName, since modules are case-sensitive. 611 // FIXME: we should be able to give a fix-it hint for the correct spelling. 612 SmallString<32> ModuleNameStorage; 613 StringRef ModuleName = sanitizeFilenameAsIdentifier( 614 llvm::sys::path::stem(FrameworkDirName), ModuleNameStorage); 615 616 // Check whether we've already found this module. 617 if (Module *Mod = lookupModuleQualified(ModuleName, Parent)) 618 return Mod; 619 620 FileManager &FileMgr = SourceMgr.getFileManager(); 621 622 // If the framework has a parent path from which we're allowed to infer 623 // a framework module, do so. 624 const FileEntry *ModuleMapFile = nullptr; 625 if (!Parent) { 626 // Determine whether we're allowed to infer a module map. 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, Attrs.IsSystem, ParentDir); 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 Attrs.IsSystem |= inferred->second.Attrs.IsSystem; 660 Attrs.IsExternC |= inferred->second.Attrs.IsExternC; 661 Attrs.IsExhaustive |= inferred->second.Attrs.IsExhaustive; 662 ModuleMapFile = inferred->second.ModuleMapFile; 663 } 664 } 665 } 666 667 // If we're not allowed to infer a framework module, don't. 668 if (!canInfer) 669 return nullptr; 670 } else 671 ModuleMapFile = getModuleMapFileForUniquing(Parent); 672 673 674 // Look for an umbrella header. 675 SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName()); 676 llvm::sys::path::append(UmbrellaName, "Headers", ModuleName + ".h"); 677 const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName); 678 679 // FIXME: If there's no umbrella header, we could probably scan the 680 // framework to load *everything*. But, it's not clear that this is a good 681 // idea. 682 if (!UmbrellaHeader) 683 return nullptr; 684 685 Module *Result = new Module(ModuleName, SourceLocation(), Parent, 686 /*IsFramework=*/true, /*IsExplicit=*/false, 687 NumCreatedModules++); 688 InferredModuleAllowedBy[Result] = ModuleMapFile; 689 Result->IsInferred = true; 690 if (!Parent) { 691 if (LangOpts.CurrentModule == ModuleName) 692 SourceModule = Result; 693 Modules[ModuleName] = Result; 694 } 695 696 Result->IsSystem |= Attrs.IsSystem; 697 Result->IsExternC |= Attrs.IsExternC; 698 Result->ConfigMacrosExhaustive |= Attrs.IsExhaustive; 699 Result->Directory = FrameworkDir; 700 701 // umbrella header "umbrella-header-name" 702 // 703 // The "Headers/" component of the name is implied because this is 704 // a framework module. 705 setUmbrellaHeader(Result, UmbrellaHeader, ModuleName + ".h"); 706 707 // export * 708 Result->Exports.push_back(Module::ExportDecl(nullptr, true)); 709 710 // module * { export * } 711 Result->InferSubmodules = true; 712 Result->InferExportWildcard = true; 713 714 // Look for subframeworks. 715 std::error_code EC; 716 SmallString<128> SubframeworksDirName 717 = StringRef(FrameworkDir->getName()); 718 llvm::sys::path::append(SubframeworksDirName, "Frameworks"); 719 llvm::sys::path::native(SubframeworksDirName); 720 for (llvm::sys::fs::directory_iterator Dir(SubframeworksDirName, EC), DirEnd; 721 Dir != DirEnd && !EC; Dir.increment(EC)) { 722 if (!StringRef(Dir->path()).endswith(".framework")) 723 continue; 724 725 if (const DirectoryEntry *SubframeworkDir 726 = FileMgr.getDirectory(Dir->path())) { 727 // Note: as an egregious but useful hack, we use the real path here and 728 // check whether it is actually a subdirectory of the parent directory. 729 // This will not be the case if the 'subframework' is actually a symlink 730 // out to a top-level framework. 731 StringRef SubframeworkDirName = FileMgr.getCanonicalName(SubframeworkDir); 732 bool FoundParent = false; 733 do { 734 // Get the parent directory name. 735 SubframeworkDirName 736 = llvm::sys::path::parent_path(SubframeworkDirName); 737 if (SubframeworkDirName.empty()) 738 break; 739 740 if (FileMgr.getDirectory(SubframeworkDirName) == FrameworkDir) { 741 FoundParent = true; 742 break; 743 } 744 } while (true); 745 746 if (!FoundParent) 747 continue; 748 749 // FIXME: Do we want to warn about subframeworks without umbrella headers? 750 inferFrameworkModule(SubframeworkDir, Attrs, Result); 751 } 752 } 753 754 // If the module is a top-level framework, automatically link against the 755 // framework. 756 if (!Result->isSubFramework()) { 757 inferFrameworkLink(Result, FrameworkDir, FileMgr); 758 } 759 760 return Result; 761 } 762 763 void ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader, 764 Twine NameAsWritten) { 765 Headers[UmbrellaHeader].push_back(KnownHeader(Mod, NormalHeader)); 766 Mod->Umbrella = UmbrellaHeader; 767 Mod->UmbrellaAsWritten = NameAsWritten.str(); 768 UmbrellaDirs[UmbrellaHeader->getDir()] = Mod; 769 } 770 771 void ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir, 772 Twine NameAsWritten) { 773 Mod->Umbrella = UmbrellaDir; 774 Mod->UmbrellaAsWritten = NameAsWritten.str(); 775 UmbrellaDirs[UmbrellaDir] = Mod; 776 } 777 778 static Module::HeaderKind headerRoleToKind(ModuleMap::ModuleHeaderRole Role) { 779 switch ((int)Role) { 780 default: llvm_unreachable("unknown header role"); 781 case ModuleMap::NormalHeader: 782 return Module::HK_Normal; 783 case ModuleMap::PrivateHeader: 784 return Module::HK_Private; 785 case ModuleMap::TextualHeader: 786 return Module::HK_Textual; 787 case ModuleMap::PrivateHeader | ModuleMap::TextualHeader: 788 return Module::HK_PrivateTextual; 789 } 790 } 791 792 void ModuleMap::addHeader(Module *Mod, Module::Header Header, 793 ModuleHeaderRole Role, bool Imported) { 794 KnownHeader KH(Mod, Role); 795 796 // Only add each header to the headers list once. 797 // FIXME: Should we diagnose if a header is listed twice in the 798 // same module definition? 799 auto &HeaderList = Headers[Header.Entry]; 800 for (auto H : HeaderList) 801 if (H == KH) 802 return; 803 804 HeaderList.push_back(KH); 805 Mod->Headers[headerRoleToKind(Role)].push_back(std::move(Header)); 806 807 bool isCompilingModuleHeader = 808 LangOpts.CompilingModule && Mod->getTopLevelModule() == SourceModule; 809 if (!Imported || isCompilingModuleHeader) { 810 // When we import HeaderFileInfo, the external source is expected to 811 // set the isModuleHeader flag itself. 812 HeaderInfo.MarkFileModuleHeader(Header.Entry, Role, 813 isCompilingModuleHeader); 814 } 815 } 816 817 void ModuleMap::excludeHeader(Module *Mod, Module::Header Header) { 818 // Add this as a known header so we won't implicitly add it to any 819 // umbrella directory module. 820 // FIXME: Should we only exclude it from umbrella modules within the 821 // specified module? 822 (void) Headers[Header.Entry]; 823 824 Mod->Headers[Module::HK_Excluded].push_back(std::move(Header)); 825 } 826 827 const FileEntry * 828 ModuleMap::getContainingModuleMapFile(const Module *Module) const { 829 if (Module->DefinitionLoc.isInvalid()) 830 return nullptr; 831 832 return SourceMgr.getFileEntryForID( 833 SourceMgr.getFileID(Module->DefinitionLoc)); 834 } 835 836 const FileEntry *ModuleMap::getModuleMapFileForUniquing(const Module *M) const { 837 if (M->IsInferred) { 838 assert(InferredModuleAllowedBy.count(M) && "missing inferred module map"); 839 return InferredModuleAllowedBy.find(M)->second; 840 } 841 return getContainingModuleMapFile(M); 842 } 843 844 void ModuleMap::setInferredModuleAllowedBy(Module *M, const FileEntry *ModMap) { 845 assert(M->IsInferred && "module not inferred"); 846 InferredModuleAllowedBy[M] = ModMap; 847 } 848 849 LLVM_DUMP_METHOD void ModuleMap::dump() { 850 llvm::errs() << "Modules:"; 851 for (llvm::StringMap<Module *>::iterator M = Modules.begin(), 852 MEnd = Modules.end(); 853 M != MEnd; ++M) 854 M->getValue()->print(llvm::errs(), 2); 855 856 llvm::errs() << "Headers:"; 857 for (HeadersMap::iterator H = Headers.begin(), HEnd = Headers.end(); 858 H != HEnd; ++H) { 859 llvm::errs() << " \"" << H->first->getName() << "\" -> "; 860 for (SmallVectorImpl<KnownHeader>::const_iterator I = H->second.begin(), 861 E = H->second.end(); 862 I != E; ++I) { 863 if (I != H->second.begin()) 864 llvm::errs() << ","; 865 llvm::errs() << I->getModule()->getFullModuleName(); 866 } 867 llvm::errs() << "\n"; 868 } 869 } 870 871 bool ModuleMap::resolveExports(Module *Mod, bool Complain) { 872 auto Unresolved = std::move(Mod->UnresolvedExports); 873 Mod->UnresolvedExports.clear(); 874 for (auto &UE : Unresolved) { 875 Module::ExportDecl Export = resolveExport(Mod, UE, Complain); 876 if (Export.getPointer() || Export.getInt()) 877 Mod->Exports.push_back(Export); 878 else 879 Mod->UnresolvedExports.push_back(UE); 880 } 881 return !Mod->UnresolvedExports.empty(); 882 } 883 884 bool ModuleMap::resolveUses(Module *Mod, bool Complain) { 885 auto Unresolved = std::move(Mod->UnresolvedDirectUses); 886 Mod->UnresolvedDirectUses.clear(); 887 for (auto &UDU : Unresolved) { 888 Module *DirectUse = resolveModuleId(UDU, Mod, Complain); 889 if (DirectUse) 890 Mod->DirectUses.push_back(DirectUse); 891 else 892 Mod->UnresolvedDirectUses.push_back(UDU); 893 } 894 return !Mod->UnresolvedDirectUses.empty(); 895 } 896 897 bool ModuleMap::resolveConflicts(Module *Mod, bool Complain) { 898 auto Unresolved = std::move(Mod->UnresolvedConflicts); 899 Mod->UnresolvedConflicts.clear(); 900 for (auto &UC : Unresolved) { 901 if (Module *OtherMod = resolveModuleId(UC.Id, Mod, Complain)) { 902 Module::Conflict Conflict; 903 Conflict.Other = OtherMod; 904 Conflict.Message = UC.Message; 905 Mod->Conflicts.push_back(Conflict); 906 } else 907 Mod->UnresolvedConflicts.push_back(UC); 908 } 909 return !Mod->UnresolvedConflicts.empty(); 910 } 911 912 Module *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) { 913 if (Loc.isInvalid()) 914 return nullptr; 915 916 // Use the expansion location to determine which module we're in. 917 FullSourceLoc ExpansionLoc = Loc.getExpansionLoc(); 918 if (!ExpansionLoc.isFileID()) 919 return nullptr; 920 921 const SourceManager &SrcMgr = Loc.getManager(); 922 FileID ExpansionFileID = ExpansionLoc.getFileID(); 923 924 while (const FileEntry *ExpansionFile 925 = SrcMgr.getFileEntryForID(ExpansionFileID)) { 926 // Find the module that owns this header (if any). 927 if (Module *Mod = findModuleForHeader(ExpansionFile).getModule()) 928 return Mod; 929 930 // No module owns this header, so look up the inclusion chain to see if 931 // any included header has an associated module. 932 SourceLocation IncludeLoc = SrcMgr.getIncludeLoc(ExpansionFileID); 933 if (IncludeLoc.isInvalid()) 934 return nullptr; 935 936 ExpansionFileID = SrcMgr.getFileID(IncludeLoc); 937 } 938 939 return nullptr; 940 } 941 942 //----------------------------------------------------------------------------// 943 // Module map file parser 944 //----------------------------------------------------------------------------// 945 946 namespace clang { 947 /// \brief A token in a module map file. 948 struct MMToken { 949 enum TokenKind { 950 Comma, 951 ConfigMacros, 952 Conflict, 953 EndOfFile, 954 HeaderKeyword, 955 Identifier, 956 Exclaim, 957 ExcludeKeyword, 958 ExplicitKeyword, 959 ExportKeyword, 960 ExternKeyword, 961 FrameworkKeyword, 962 LinkKeyword, 963 ModuleKeyword, 964 Period, 965 PrivateKeyword, 966 UmbrellaKeyword, 967 UseKeyword, 968 RequiresKeyword, 969 Star, 970 StringLiteral, 971 TextualKeyword, 972 LBrace, 973 RBrace, 974 LSquare, 975 RSquare 976 } Kind; 977 978 unsigned Location; 979 unsigned StringLength; 980 const char *StringData; 981 982 void clear() { 983 Kind = EndOfFile; 984 Location = 0; 985 StringLength = 0; 986 StringData = nullptr; 987 } 988 989 bool is(TokenKind K) const { return Kind == K; } 990 991 SourceLocation getLocation() const { 992 return SourceLocation::getFromRawEncoding(Location); 993 } 994 995 StringRef getString() const { 996 return StringRef(StringData, StringLength); 997 } 998 }; 999 1000 class ModuleMapParser { 1001 Lexer &L; 1002 SourceManager &SourceMgr; 1003 1004 /// \brief Default target information, used only for string literal 1005 /// parsing. 1006 const TargetInfo *Target; 1007 1008 DiagnosticsEngine &Diags; 1009 ModuleMap ⤅ 1010 1011 /// \brief The current module map file. 1012 const FileEntry *ModuleMapFile; 1013 1014 /// \brief The directory that file names in this module map file should 1015 /// be resolved relative to. 1016 const DirectoryEntry *Directory; 1017 1018 /// \brief The directory containing Clang-supplied headers. 1019 const DirectoryEntry *BuiltinIncludeDir; 1020 1021 /// \brief Whether this module map is in a system header directory. 1022 bool IsSystem; 1023 1024 /// \brief Whether an error occurred. 1025 bool HadError; 1026 1027 /// \brief Stores string data for the various string literals referenced 1028 /// during parsing. 1029 llvm::BumpPtrAllocator StringData; 1030 1031 /// \brief The current token. 1032 MMToken Tok; 1033 1034 /// \brief The active module. 1035 Module *ActiveModule; 1036 1037 /// \brief Whether a module uses the 'requires excluded' hack to mark its 1038 /// contents as 'textual'. 1039 /// 1040 /// On older Darwin SDK versions, 'requires excluded' is used to mark the 1041 /// contents of the Darwin.C.excluded (assert.h) and Tcl.Private modules as 1042 /// non-modular headers. For backwards compatibility, we continue to 1043 /// support this idiom for just these modules, and map the headers to 1044 /// 'textual' to match the original intent. 1045 llvm::SmallPtrSet<Module *, 2> UsesRequiresExcludedHack; 1046 1047 /// \brief Consume the current token and return its location. 1048 SourceLocation consumeToken(); 1049 1050 /// \brief Skip tokens until we reach the a token with the given kind 1051 /// (or the end of the file). 1052 void skipUntil(MMToken::TokenKind K); 1053 1054 typedef SmallVector<std::pair<std::string, SourceLocation>, 2> ModuleId; 1055 bool parseModuleId(ModuleId &Id); 1056 void parseModuleDecl(); 1057 void parseExternModuleDecl(); 1058 void parseRequiresDecl(); 1059 void parseHeaderDecl(clang::MMToken::TokenKind, 1060 SourceLocation LeadingLoc); 1061 void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc); 1062 void parseExportDecl(); 1063 void parseUseDecl(); 1064 void parseLinkDecl(); 1065 void parseConfigMacros(); 1066 void parseConflict(); 1067 void parseInferredModuleDecl(bool Framework, bool Explicit); 1068 1069 typedef ModuleMap::Attributes Attributes; 1070 bool parseOptionalAttributes(Attributes &Attrs); 1071 1072 public: 1073 explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr, 1074 const TargetInfo *Target, 1075 DiagnosticsEngine &Diags, 1076 ModuleMap &Map, 1077 const FileEntry *ModuleMapFile, 1078 const DirectoryEntry *Directory, 1079 const DirectoryEntry *BuiltinIncludeDir, 1080 bool IsSystem) 1081 : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map), 1082 ModuleMapFile(ModuleMapFile), Directory(Directory), 1083 BuiltinIncludeDir(BuiltinIncludeDir), IsSystem(IsSystem), 1084 HadError(false), ActiveModule(nullptr) 1085 { 1086 Tok.clear(); 1087 consumeToken(); 1088 } 1089 1090 bool parseModuleMapFile(); 1091 }; 1092 } 1093 1094 SourceLocation ModuleMapParser::consumeToken() { 1095 retry: 1096 SourceLocation Result = Tok.getLocation(); 1097 Tok.clear(); 1098 1099 Token LToken; 1100 L.LexFromRawLexer(LToken); 1101 Tok.Location = LToken.getLocation().getRawEncoding(); 1102 switch (LToken.getKind()) { 1103 case tok::raw_identifier: { 1104 StringRef RI = LToken.getRawIdentifier(); 1105 Tok.StringData = RI.data(); 1106 Tok.StringLength = RI.size(); 1107 Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(RI) 1108 .Case("config_macros", MMToken::ConfigMacros) 1109 .Case("conflict", MMToken::Conflict) 1110 .Case("exclude", MMToken::ExcludeKeyword) 1111 .Case("explicit", MMToken::ExplicitKeyword) 1112 .Case("export", MMToken::ExportKeyword) 1113 .Case("extern", MMToken::ExternKeyword) 1114 .Case("framework", MMToken::FrameworkKeyword) 1115 .Case("header", MMToken::HeaderKeyword) 1116 .Case("link", MMToken::LinkKeyword) 1117 .Case("module", MMToken::ModuleKeyword) 1118 .Case("private", MMToken::PrivateKeyword) 1119 .Case("requires", MMToken::RequiresKeyword) 1120 .Case("textual", MMToken::TextualKeyword) 1121 .Case("umbrella", MMToken::UmbrellaKeyword) 1122 .Case("use", MMToken::UseKeyword) 1123 .Default(MMToken::Identifier); 1124 break; 1125 } 1126 1127 case tok::comma: 1128 Tok.Kind = MMToken::Comma; 1129 break; 1130 1131 case tok::eof: 1132 Tok.Kind = MMToken::EndOfFile; 1133 break; 1134 1135 case tok::l_brace: 1136 Tok.Kind = MMToken::LBrace; 1137 break; 1138 1139 case tok::l_square: 1140 Tok.Kind = MMToken::LSquare; 1141 break; 1142 1143 case tok::period: 1144 Tok.Kind = MMToken::Period; 1145 break; 1146 1147 case tok::r_brace: 1148 Tok.Kind = MMToken::RBrace; 1149 break; 1150 1151 case tok::r_square: 1152 Tok.Kind = MMToken::RSquare; 1153 break; 1154 1155 case tok::star: 1156 Tok.Kind = MMToken::Star; 1157 break; 1158 1159 case tok::exclaim: 1160 Tok.Kind = MMToken::Exclaim; 1161 break; 1162 1163 case tok::string_literal: { 1164 if (LToken.hasUDSuffix()) { 1165 Diags.Report(LToken.getLocation(), diag::err_invalid_string_udl); 1166 HadError = true; 1167 goto retry; 1168 } 1169 1170 // Parse the string literal. 1171 LangOptions LangOpts; 1172 StringLiteralParser StringLiteral(LToken, SourceMgr, LangOpts, *Target); 1173 if (StringLiteral.hadError) 1174 goto retry; 1175 1176 // Copy the string literal into our string data allocator. 1177 unsigned Length = StringLiteral.GetStringLength(); 1178 char *Saved = StringData.Allocate<char>(Length + 1); 1179 memcpy(Saved, StringLiteral.GetString().data(), Length); 1180 Saved[Length] = 0; 1181 1182 // Form the token. 1183 Tok.Kind = MMToken::StringLiteral; 1184 Tok.StringData = Saved; 1185 Tok.StringLength = Length; 1186 break; 1187 } 1188 1189 case tok::comment: 1190 goto retry; 1191 1192 default: 1193 Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token); 1194 HadError = true; 1195 goto retry; 1196 } 1197 1198 return Result; 1199 } 1200 1201 void ModuleMapParser::skipUntil(MMToken::TokenKind K) { 1202 unsigned braceDepth = 0; 1203 unsigned squareDepth = 0; 1204 do { 1205 switch (Tok.Kind) { 1206 case MMToken::EndOfFile: 1207 return; 1208 1209 case MMToken::LBrace: 1210 if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 1211 return; 1212 1213 ++braceDepth; 1214 break; 1215 1216 case MMToken::LSquare: 1217 if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 1218 return; 1219 1220 ++squareDepth; 1221 break; 1222 1223 case MMToken::RBrace: 1224 if (braceDepth > 0) 1225 --braceDepth; 1226 else if (Tok.is(K)) 1227 return; 1228 break; 1229 1230 case MMToken::RSquare: 1231 if (squareDepth > 0) 1232 --squareDepth; 1233 else if (Tok.is(K)) 1234 return; 1235 break; 1236 1237 default: 1238 if (braceDepth == 0 && squareDepth == 0 && Tok.is(K)) 1239 return; 1240 break; 1241 } 1242 1243 consumeToken(); 1244 } while (true); 1245 } 1246 1247 /// \brief Parse a module-id. 1248 /// 1249 /// module-id: 1250 /// identifier 1251 /// identifier '.' module-id 1252 /// 1253 /// \returns true if an error occurred, false otherwise. 1254 bool ModuleMapParser::parseModuleId(ModuleId &Id) { 1255 Id.clear(); 1256 do { 1257 if (Tok.is(MMToken::Identifier) || Tok.is(MMToken::StringLiteral)) { 1258 Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation())); 1259 consumeToken(); 1260 } else { 1261 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name); 1262 return true; 1263 } 1264 1265 if (!Tok.is(MMToken::Period)) 1266 break; 1267 1268 consumeToken(); 1269 } while (true); 1270 1271 return false; 1272 } 1273 1274 namespace { 1275 /// \brief Enumerates the known attributes. 1276 enum AttributeKind { 1277 /// \brief An unknown attribute. 1278 AT_unknown, 1279 /// \brief The 'system' attribute. 1280 AT_system, 1281 /// \brief The 'extern_c' attribute. 1282 AT_extern_c, 1283 /// \brief The 'exhaustive' attribute. 1284 AT_exhaustive 1285 }; 1286 } 1287 1288 /// \brief Parse a module declaration. 1289 /// 1290 /// module-declaration: 1291 /// 'extern' 'module' module-id string-literal 1292 /// 'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt] 1293 /// { module-member* } 1294 /// 1295 /// module-member: 1296 /// requires-declaration 1297 /// header-declaration 1298 /// submodule-declaration 1299 /// export-declaration 1300 /// link-declaration 1301 /// 1302 /// submodule-declaration: 1303 /// module-declaration 1304 /// inferred-submodule-declaration 1305 void ModuleMapParser::parseModuleDecl() { 1306 assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) || 1307 Tok.is(MMToken::FrameworkKeyword) || Tok.is(MMToken::ExternKeyword)); 1308 if (Tok.is(MMToken::ExternKeyword)) { 1309 parseExternModuleDecl(); 1310 return; 1311 } 1312 1313 // Parse 'explicit' or 'framework' keyword, if present. 1314 SourceLocation ExplicitLoc; 1315 bool Explicit = false; 1316 bool Framework = false; 1317 1318 // Parse 'explicit' keyword, if present. 1319 if (Tok.is(MMToken::ExplicitKeyword)) { 1320 ExplicitLoc = consumeToken(); 1321 Explicit = true; 1322 } 1323 1324 // Parse 'framework' keyword, if present. 1325 if (Tok.is(MMToken::FrameworkKeyword)) { 1326 consumeToken(); 1327 Framework = true; 1328 } 1329 1330 // Parse 'module' keyword. 1331 if (!Tok.is(MMToken::ModuleKeyword)) { 1332 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 1333 consumeToken(); 1334 HadError = true; 1335 return; 1336 } 1337 consumeToken(); // 'module' keyword 1338 1339 // If we have a wildcard for the module name, this is an inferred submodule. 1340 // Parse it. 1341 if (Tok.is(MMToken::Star)) 1342 return parseInferredModuleDecl(Framework, Explicit); 1343 1344 // Parse the module name. 1345 ModuleId Id; 1346 if (parseModuleId(Id)) { 1347 HadError = true; 1348 return; 1349 } 1350 1351 if (ActiveModule) { 1352 if (Id.size() > 1) { 1353 Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id) 1354 << SourceRange(Id.front().second, Id.back().second); 1355 1356 HadError = true; 1357 return; 1358 } 1359 } else if (Id.size() == 1 && Explicit) { 1360 // Top-level modules can't be explicit. 1361 Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level); 1362 Explicit = false; 1363 ExplicitLoc = SourceLocation(); 1364 HadError = true; 1365 } 1366 1367 Module *PreviousActiveModule = ActiveModule; 1368 if (Id.size() > 1) { 1369 // This module map defines a submodule. Go find the module of which it 1370 // is a submodule. 1371 ActiveModule = nullptr; 1372 const Module *TopLevelModule = nullptr; 1373 for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) { 1374 if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) { 1375 if (I == 0) 1376 TopLevelModule = Next; 1377 ActiveModule = Next; 1378 continue; 1379 } 1380 1381 if (ActiveModule) { 1382 Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified) 1383 << Id[I].first 1384 << ActiveModule->getTopLevelModule()->getFullModuleName(); 1385 } else { 1386 Diags.Report(Id[I].second, diag::err_mmap_expected_module_name); 1387 } 1388 HadError = true; 1389 return; 1390 } 1391 1392 if (ModuleMapFile != Map.getContainingModuleMapFile(TopLevelModule)) { 1393 assert(ModuleMapFile != Map.getModuleMapFileForUniquing(TopLevelModule) && 1394 "submodule defined in same file as 'module *' that allowed its " 1395 "top-level module"); 1396 Map.addAdditionalModuleMapFile(TopLevelModule, ModuleMapFile); 1397 } 1398 } 1399 1400 StringRef ModuleName = Id.back().first; 1401 SourceLocation ModuleNameLoc = Id.back().second; 1402 1403 // Parse the optional attribute list. 1404 Attributes Attrs; 1405 if (parseOptionalAttributes(Attrs)) 1406 return; 1407 1408 1409 // Parse the opening brace. 1410 if (!Tok.is(MMToken::LBrace)) { 1411 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace) 1412 << ModuleName; 1413 HadError = true; 1414 return; 1415 } 1416 SourceLocation LBraceLoc = consumeToken(); 1417 1418 // Determine whether this (sub)module has already been defined. 1419 if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) { 1420 if (Existing->DefinitionLoc.isInvalid() && !ActiveModule) { 1421 // Skip the module definition. 1422 skipUntil(MMToken::RBrace); 1423 if (Tok.is(MMToken::RBrace)) 1424 consumeToken(); 1425 else { 1426 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 1427 Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 1428 HadError = true; 1429 } 1430 return; 1431 } 1432 1433 Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition) 1434 << ModuleName; 1435 Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition); 1436 1437 // Skip the module definition. 1438 skipUntil(MMToken::RBrace); 1439 if (Tok.is(MMToken::RBrace)) 1440 consumeToken(); 1441 1442 HadError = true; 1443 return; 1444 } 1445 1446 // Start defining this module. 1447 ActiveModule = Map.findOrCreateModule(ModuleName, ActiveModule, Framework, 1448 Explicit).first; 1449 ActiveModule->DefinitionLoc = ModuleNameLoc; 1450 if (Attrs.IsSystem || IsSystem) 1451 ActiveModule->IsSystem = true; 1452 if (Attrs.IsExternC) 1453 ActiveModule->IsExternC = true; 1454 ActiveModule->Directory = Directory; 1455 1456 bool Done = false; 1457 do { 1458 switch (Tok.Kind) { 1459 case MMToken::EndOfFile: 1460 case MMToken::RBrace: 1461 Done = true; 1462 break; 1463 1464 case MMToken::ConfigMacros: 1465 parseConfigMacros(); 1466 break; 1467 1468 case MMToken::Conflict: 1469 parseConflict(); 1470 break; 1471 1472 case MMToken::ExplicitKeyword: 1473 case MMToken::ExternKeyword: 1474 case MMToken::FrameworkKeyword: 1475 case MMToken::ModuleKeyword: 1476 parseModuleDecl(); 1477 break; 1478 1479 case MMToken::ExportKeyword: 1480 parseExportDecl(); 1481 break; 1482 1483 case MMToken::UseKeyword: 1484 parseUseDecl(); 1485 break; 1486 1487 case MMToken::RequiresKeyword: 1488 parseRequiresDecl(); 1489 break; 1490 1491 case MMToken::TextualKeyword: 1492 parseHeaderDecl(MMToken::TextualKeyword, consumeToken()); 1493 break; 1494 1495 case MMToken::UmbrellaKeyword: { 1496 SourceLocation UmbrellaLoc = consumeToken(); 1497 if (Tok.is(MMToken::HeaderKeyword)) 1498 parseHeaderDecl(MMToken::UmbrellaKeyword, UmbrellaLoc); 1499 else 1500 parseUmbrellaDirDecl(UmbrellaLoc); 1501 break; 1502 } 1503 1504 case MMToken::ExcludeKeyword: 1505 parseHeaderDecl(MMToken::ExcludeKeyword, consumeToken()); 1506 break; 1507 1508 case MMToken::PrivateKeyword: 1509 parseHeaderDecl(MMToken::PrivateKeyword, consumeToken()); 1510 break; 1511 1512 case MMToken::HeaderKeyword: 1513 parseHeaderDecl(MMToken::HeaderKeyword, consumeToken()); 1514 break; 1515 1516 case MMToken::LinkKeyword: 1517 parseLinkDecl(); 1518 break; 1519 1520 default: 1521 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member); 1522 consumeToken(); 1523 break; 1524 } 1525 } while (!Done); 1526 1527 if (Tok.is(MMToken::RBrace)) 1528 consumeToken(); 1529 else { 1530 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 1531 Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 1532 HadError = true; 1533 } 1534 1535 // If the active module is a top-level framework, and there are no link 1536 // libraries, automatically link against the framework. 1537 if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() && 1538 ActiveModule->LinkLibraries.empty()) { 1539 inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager()); 1540 } 1541 1542 // If the module meets all requirements but is still unavailable, mark the 1543 // whole tree as unavailable to prevent it from building. 1544 if (!ActiveModule->IsAvailable && !ActiveModule->IsMissingRequirement && 1545 ActiveModule->Parent) { 1546 ActiveModule->getTopLevelModule()->markUnavailable(); 1547 ActiveModule->getTopLevelModule()->MissingHeaders.append( 1548 ActiveModule->MissingHeaders.begin(), ActiveModule->MissingHeaders.end()); 1549 } 1550 1551 // We're done parsing this module. Pop back to the previous module. 1552 ActiveModule = PreviousActiveModule; 1553 } 1554 1555 /// \brief Parse an extern module declaration. 1556 /// 1557 /// extern module-declaration: 1558 /// 'extern' 'module' module-id string-literal 1559 void ModuleMapParser::parseExternModuleDecl() { 1560 assert(Tok.is(MMToken::ExternKeyword)); 1561 SourceLocation ExternLoc = consumeToken(); // 'extern' keyword 1562 1563 // Parse 'module' keyword. 1564 if (!Tok.is(MMToken::ModuleKeyword)) { 1565 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 1566 consumeToken(); 1567 HadError = true; 1568 return; 1569 } 1570 consumeToken(); // 'module' keyword 1571 1572 // Parse the module name. 1573 ModuleId Id; 1574 if (parseModuleId(Id)) { 1575 HadError = true; 1576 return; 1577 } 1578 1579 // Parse the referenced module map file name. 1580 if (!Tok.is(MMToken::StringLiteral)) { 1581 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_mmap_file); 1582 HadError = true; 1583 return; 1584 } 1585 std::string FileName = Tok.getString(); 1586 consumeToken(); // filename 1587 1588 StringRef FileNameRef = FileName; 1589 SmallString<128> ModuleMapFileName; 1590 if (llvm::sys::path::is_relative(FileNameRef)) { 1591 ModuleMapFileName += Directory->getName(); 1592 llvm::sys::path::append(ModuleMapFileName, FileName); 1593 FileNameRef = ModuleMapFileName; 1594 } 1595 if (const FileEntry *File = SourceMgr.getFileManager().getFile(FileNameRef)) 1596 Map.parseModuleMapFile( 1597 File, /*IsSystem=*/false, 1598 Map.HeaderInfo.getHeaderSearchOpts().ModuleMapFileHomeIsCwd 1599 ? Directory 1600 : File->getDir(), ExternLoc); 1601 } 1602 1603 /// Whether to add the requirement \p Feature to the module \p M. 1604 /// 1605 /// This preserves backwards compatibility for two hacks in the Darwin system 1606 /// module map files: 1607 /// 1608 /// 1. The use of 'requires excluded' to make headers non-modular, which 1609 /// should really be mapped to 'textual' now that we have this feature. We 1610 /// drop the 'excluded' requirement, and set \p IsRequiresExcludedHack to 1611 /// true. Later, this bit will be used to map all the headers inside this 1612 /// module to 'textual'. 1613 /// 1614 /// This affects Darwin.C.excluded (for assert.h) and Tcl.Private. 1615 /// 1616 /// 2. Removes a bogus cplusplus requirement from IOKit.avc. This requirement 1617 /// was never correct and causes issues now that we check it, so drop it. 1618 static bool shouldAddRequirement(Module *M, StringRef Feature, 1619 bool &IsRequiresExcludedHack) { 1620 static const StringRef DarwinCExcluded[] = {"Darwin", "C", "excluded"}; 1621 static const StringRef TclPrivate[] = {"Tcl", "Private"}; 1622 static const StringRef IOKitAVC[] = {"IOKit", "avc"}; 1623 1624 if (Feature == "excluded" && (M->fullModuleNameIs(DarwinCExcluded) || 1625 M->fullModuleNameIs(TclPrivate))) { 1626 IsRequiresExcludedHack = true; 1627 return false; 1628 } else if (Feature == "cplusplus" && M->fullModuleNameIs(IOKitAVC)) { 1629 return false; 1630 } 1631 1632 return true; 1633 } 1634 1635 /// \brief Parse a requires declaration. 1636 /// 1637 /// requires-declaration: 1638 /// 'requires' feature-list 1639 /// 1640 /// feature-list: 1641 /// feature ',' feature-list 1642 /// feature 1643 /// 1644 /// feature: 1645 /// '!'[opt] identifier 1646 void ModuleMapParser::parseRequiresDecl() { 1647 assert(Tok.is(MMToken::RequiresKeyword)); 1648 1649 // Parse 'requires' keyword. 1650 consumeToken(); 1651 1652 // Parse the feature-list. 1653 do { 1654 bool RequiredState = true; 1655 if (Tok.is(MMToken::Exclaim)) { 1656 RequiredState = false; 1657 consumeToken(); 1658 } 1659 1660 if (!Tok.is(MMToken::Identifier)) { 1661 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature); 1662 HadError = true; 1663 return; 1664 } 1665 1666 // Consume the feature name. 1667 std::string Feature = Tok.getString(); 1668 consumeToken(); 1669 1670 bool IsRequiresExcludedHack = false; 1671 bool ShouldAddRequirement = 1672 shouldAddRequirement(ActiveModule, Feature, IsRequiresExcludedHack); 1673 1674 if (IsRequiresExcludedHack) 1675 UsesRequiresExcludedHack.insert(ActiveModule); 1676 1677 if (ShouldAddRequirement) { 1678 // Add this feature. 1679 ActiveModule->addRequirement(Feature, RequiredState, Map.LangOpts, 1680 *Map.Target); 1681 } 1682 1683 if (!Tok.is(MMToken::Comma)) 1684 break; 1685 1686 // Consume the comma. 1687 consumeToken(); 1688 } while (true); 1689 } 1690 1691 /// \brief Append to \p Paths the set of paths needed to get to the 1692 /// subframework in which the given module lives. 1693 static void appendSubframeworkPaths(Module *Mod, 1694 SmallVectorImpl<char> &Path) { 1695 // Collect the framework names from the given module to the top-level module. 1696 SmallVector<StringRef, 2> Paths; 1697 for (; Mod; Mod = Mod->Parent) { 1698 if (Mod->IsFramework) 1699 Paths.push_back(Mod->Name); 1700 } 1701 1702 if (Paths.empty()) 1703 return; 1704 1705 // Add Frameworks/Name.framework for each subframework. 1706 for (unsigned I = Paths.size() - 1; I != 0; --I) 1707 llvm::sys::path::append(Path, "Frameworks", Paths[I-1] + ".framework"); 1708 } 1709 1710 /// \brief Parse a header declaration. 1711 /// 1712 /// header-declaration: 1713 /// 'textual'[opt] 'header' string-literal 1714 /// 'private' 'textual'[opt] 'header' string-literal 1715 /// 'exclude' 'header' string-literal 1716 /// 'umbrella' 'header' string-literal 1717 /// 1718 /// FIXME: Support 'private textual header'. 1719 void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken, 1720 SourceLocation LeadingLoc) { 1721 // We've already consumed the first token. 1722 ModuleMap::ModuleHeaderRole Role = ModuleMap::NormalHeader; 1723 if (LeadingToken == MMToken::PrivateKeyword) { 1724 Role = ModuleMap::PrivateHeader; 1725 // 'private' may optionally be followed by 'textual'. 1726 if (Tok.is(MMToken::TextualKeyword)) { 1727 LeadingToken = Tok.Kind; 1728 consumeToken(); 1729 } 1730 } 1731 1732 if (LeadingToken == MMToken::TextualKeyword) 1733 Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader); 1734 1735 if (UsesRequiresExcludedHack.count(ActiveModule)) { 1736 // Mark this header 'textual' (see doc comment for 1737 // Module::UsesRequiresExcludedHack). 1738 Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader); 1739 } 1740 1741 if (LeadingToken != MMToken::HeaderKeyword) { 1742 if (!Tok.is(MMToken::HeaderKeyword)) { 1743 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 1744 << (LeadingToken == MMToken::PrivateKeyword ? "private" : 1745 LeadingToken == MMToken::ExcludeKeyword ? "exclude" : 1746 LeadingToken == MMToken::TextualKeyword ? "textual" : "umbrella"); 1747 return; 1748 } 1749 consumeToken(); 1750 } 1751 1752 // Parse the header name. 1753 if (!Tok.is(MMToken::StringLiteral)) { 1754 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 1755 << "header"; 1756 HadError = true; 1757 return; 1758 } 1759 Module::UnresolvedHeaderDirective Header; 1760 Header.FileName = Tok.getString(); 1761 Header.FileNameLoc = consumeToken(); 1762 1763 // Check whether we already have an umbrella. 1764 if (LeadingToken == MMToken::UmbrellaKeyword && ActiveModule->Umbrella) { 1765 Diags.Report(Header.FileNameLoc, diag::err_mmap_umbrella_clash) 1766 << ActiveModule->getFullModuleName(); 1767 HadError = true; 1768 return; 1769 } 1770 1771 // Look for this file. 1772 const FileEntry *File = nullptr; 1773 const FileEntry *BuiltinFile = nullptr; 1774 SmallString<128> RelativePathName; 1775 if (llvm::sys::path::is_absolute(Header.FileName)) { 1776 RelativePathName = Header.FileName; 1777 File = SourceMgr.getFileManager().getFile(RelativePathName); 1778 } else { 1779 // Search for the header file within the search directory. 1780 SmallString<128> FullPathName(Directory->getName()); 1781 unsigned FullPathLength = FullPathName.size(); 1782 1783 if (ActiveModule->isPartOfFramework()) { 1784 appendSubframeworkPaths(ActiveModule, RelativePathName); 1785 1786 // Check whether this file is in the public headers. 1787 llvm::sys::path::append(RelativePathName, "Headers", Header.FileName); 1788 llvm::sys::path::append(FullPathName, RelativePathName); 1789 File = SourceMgr.getFileManager().getFile(FullPathName); 1790 1791 if (!File) { 1792 // Check whether this file is in the private headers. 1793 // FIXME: Should we retain the subframework paths here? 1794 RelativePathName.clear(); 1795 FullPathName.resize(FullPathLength); 1796 llvm::sys::path::append(RelativePathName, "PrivateHeaders", 1797 Header.FileName); 1798 llvm::sys::path::append(FullPathName, RelativePathName); 1799 File = SourceMgr.getFileManager().getFile(FullPathName); 1800 } 1801 } else { 1802 // Lookup for normal headers. 1803 llvm::sys::path::append(RelativePathName, Header.FileName); 1804 llvm::sys::path::append(FullPathName, RelativePathName); 1805 File = SourceMgr.getFileManager().getFile(FullPathName); 1806 1807 // If this is a system module with a top-level header, this header 1808 // may have a counterpart (or replacement) in the set of headers 1809 // supplied by Clang. Find that builtin header. 1810 if (ActiveModule->IsSystem && LeadingToken != MMToken::UmbrellaKeyword && 1811 BuiltinIncludeDir && BuiltinIncludeDir != Directory && 1812 isBuiltinHeader(Header.FileName)) { 1813 SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName()); 1814 llvm::sys::path::append(BuiltinPathName, Header.FileName); 1815 BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName); 1816 1817 // If Clang supplies this header but the underlying system does not, 1818 // just silently swap in our builtin version. Otherwise, we'll end 1819 // up adding both (later). 1820 // 1821 // For local visibility, entirely replace the system file with our 1822 // one and textually include the system one. We need to pass macros 1823 // from our header to the system one if we #include_next it. 1824 // 1825 // FIXME: Can we do this in all cases? 1826 if (BuiltinFile && (!File || Map.LangOpts.ModulesLocalVisibility)) { 1827 File = BuiltinFile; 1828 RelativePathName = BuiltinPathName; 1829 BuiltinFile = nullptr; 1830 } 1831 } 1832 } 1833 } 1834 1835 // FIXME: We shouldn't be eagerly stat'ing every file named in a module map. 1836 // Come up with a lazy way to do this. 1837 if (File) { 1838 if (LeadingToken == MMToken::UmbrellaKeyword) { 1839 const DirectoryEntry *UmbrellaDir = File->getDir(); 1840 if (Module *UmbrellaModule = Map.UmbrellaDirs[UmbrellaDir]) { 1841 Diags.Report(LeadingLoc, diag::err_mmap_umbrella_clash) 1842 << UmbrellaModule->getFullModuleName(); 1843 HadError = true; 1844 } else { 1845 // Record this umbrella header. 1846 Map.setUmbrellaHeader(ActiveModule, File, RelativePathName.str()); 1847 } 1848 } else if (LeadingToken == MMToken::ExcludeKeyword) { 1849 Module::Header H = {RelativePathName.str(), File}; 1850 Map.excludeHeader(ActiveModule, H); 1851 } else { 1852 // If there is a builtin counterpart to this file, add it now, before 1853 // the "real" header, so we build the built-in one first when building 1854 // the module. 1855 if (BuiltinFile) { 1856 // FIXME: Taking the name from the FileEntry is unstable and can give 1857 // different results depending on how we've previously named that file 1858 // in this build. 1859 Module::Header H = { BuiltinFile->getName(), BuiltinFile }; 1860 Map.addHeader(ActiveModule, H, Role); 1861 } 1862 1863 // Record this header. 1864 Module::Header H = { RelativePathName.str(), File }; 1865 Map.addHeader(ActiveModule, H, Role); 1866 } 1867 } else if (LeadingToken != MMToken::ExcludeKeyword) { 1868 // Ignore excluded header files. They're optional anyway. 1869 1870 // If we find a module that has a missing header, we mark this module as 1871 // unavailable and store the header directive for displaying diagnostics. 1872 Header.IsUmbrella = LeadingToken == MMToken::UmbrellaKeyword; 1873 ActiveModule->markUnavailable(); 1874 ActiveModule->MissingHeaders.push_back(Header); 1875 } 1876 } 1877 1878 static int compareModuleHeaders(const Module::Header *A, 1879 const Module::Header *B) { 1880 return A->NameAsWritten.compare(B->NameAsWritten); 1881 } 1882 1883 /// \brief Parse an umbrella directory declaration. 1884 /// 1885 /// umbrella-dir-declaration: 1886 /// umbrella string-literal 1887 void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) { 1888 // Parse the directory name. 1889 if (!Tok.is(MMToken::StringLiteral)) { 1890 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 1891 << "umbrella"; 1892 HadError = true; 1893 return; 1894 } 1895 1896 std::string DirName = Tok.getString(); 1897 SourceLocation DirNameLoc = consumeToken(); 1898 1899 // Check whether we already have an umbrella. 1900 if (ActiveModule->Umbrella) { 1901 Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash) 1902 << ActiveModule->getFullModuleName(); 1903 HadError = true; 1904 return; 1905 } 1906 1907 // Look for this file. 1908 const DirectoryEntry *Dir = nullptr; 1909 if (llvm::sys::path::is_absolute(DirName)) 1910 Dir = SourceMgr.getFileManager().getDirectory(DirName); 1911 else { 1912 SmallString<128> PathName; 1913 PathName = Directory->getName(); 1914 llvm::sys::path::append(PathName, DirName); 1915 Dir = SourceMgr.getFileManager().getDirectory(PathName); 1916 } 1917 1918 if (!Dir) { 1919 Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found) 1920 << DirName; 1921 HadError = true; 1922 return; 1923 } 1924 1925 if (UsesRequiresExcludedHack.count(ActiveModule)) { 1926 // Mark this header 'textual' (see doc comment for 1927 // ModuleMapParser::UsesRequiresExcludedHack). Although iterating over the 1928 // directory is relatively expensive, in practice this only applies to the 1929 // uncommonly used Tcl module on Darwin platforms. 1930 std::error_code EC; 1931 SmallVector<Module::Header, 6> Headers; 1932 for (llvm::sys::fs::recursive_directory_iterator I(Dir->getName(), EC), E; 1933 I != E && !EC; I.increment(EC)) { 1934 if (const FileEntry *FE = SourceMgr.getFileManager().getFile(I->path())) { 1935 1936 Module::Header Header = {I->path(), FE}; 1937 Headers.push_back(std::move(Header)); 1938 } 1939 } 1940 1941 // Sort header paths so that the pcm doesn't depend on iteration order. 1942 llvm::array_pod_sort(Headers.begin(), Headers.end(), compareModuleHeaders); 1943 1944 for (auto &Header : Headers) 1945 Map.addHeader(ActiveModule, std::move(Header), ModuleMap::TextualHeader); 1946 return; 1947 } 1948 1949 if (Module *OwningModule = Map.UmbrellaDirs[Dir]) { 1950 Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash) 1951 << OwningModule->getFullModuleName(); 1952 HadError = true; 1953 return; 1954 } 1955 1956 // Record this umbrella directory. 1957 Map.setUmbrellaDir(ActiveModule, Dir, DirName); 1958 } 1959 1960 /// \brief Parse a module export declaration. 1961 /// 1962 /// export-declaration: 1963 /// 'export' wildcard-module-id 1964 /// 1965 /// wildcard-module-id: 1966 /// identifier 1967 /// '*' 1968 /// identifier '.' wildcard-module-id 1969 void ModuleMapParser::parseExportDecl() { 1970 assert(Tok.is(MMToken::ExportKeyword)); 1971 SourceLocation ExportLoc = consumeToken(); 1972 1973 // Parse the module-id with an optional wildcard at the end. 1974 ModuleId ParsedModuleId; 1975 bool Wildcard = false; 1976 do { 1977 // FIXME: Support string-literal module names here. 1978 if (Tok.is(MMToken::Identifier)) { 1979 ParsedModuleId.push_back(std::make_pair(Tok.getString(), 1980 Tok.getLocation())); 1981 consumeToken(); 1982 1983 if (Tok.is(MMToken::Period)) { 1984 consumeToken(); 1985 continue; 1986 } 1987 1988 break; 1989 } 1990 1991 if(Tok.is(MMToken::Star)) { 1992 Wildcard = true; 1993 consumeToken(); 1994 break; 1995 } 1996 1997 Diags.Report(Tok.getLocation(), diag::err_mmap_module_id); 1998 HadError = true; 1999 return; 2000 } while (true); 2001 2002 Module::UnresolvedExportDecl Unresolved = { 2003 ExportLoc, ParsedModuleId, Wildcard 2004 }; 2005 ActiveModule->UnresolvedExports.push_back(Unresolved); 2006 } 2007 2008 /// \brief Parse a module use declaration. 2009 /// 2010 /// use-declaration: 2011 /// 'use' wildcard-module-id 2012 void ModuleMapParser::parseUseDecl() { 2013 assert(Tok.is(MMToken::UseKeyword)); 2014 auto KWLoc = consumeToken(); 2015 // Parse the module-id. 2016 ModuleId ParsedModuleId; 2017 parseModuleId(ParsedModuleId); 2018 2019 if (ActiveModule->Parent) 2020 Diags.Report(KWLoc, diag::err_mmap_use_decl_submodule); 2021 else 2022 ActiveModule->UnresolvedDirectUses.push_back(ParsedModuleId); 2023 } 2024 2025 /// \brief Parse a link declaration. 2026 /// 2027 /// module-declaration: 2028 /// 'link' 'framework'[opt] string-literal 2029 void ModuleMapParser::parseLinkDecl() { 2030 assert(Tok.is(MMToken::LinkKeyword)); 2031 SourceLocation LinkLoc = consumeToken(); 2032 2033 // Parse the optional 'framework' keyword. 2034 bool IsFramework = false; 2035 if (Tok.is(MMToken::FrameworkKeyword)) { 2036 consumeToken(); 2037 IsFramework = true; 2038 } 2039 2040 // Parse the library name 2041 if (!Tok.is(MMToken::StringLiteral)) { 2042 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_library_name) 2043 << IsFramework << SourceRange(LinkLoc); 2044 HadError = true; 2045 return; 2046 } 2047 2048 std::string LibraryName = Tok.getString(); 2049 consumeToken(); 2050 ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName, 2051 IsFramework)); 2052 } 2053 2054 /// \brief Parse a configuration macro declaration. 2055 /// 2056 /// module-declaration: 2057 /// 'config_macros' attributes[opt] config-macro-list? 2058 /// 2059 /// config-macro-list: 2060 /// identifier (',' identifier)? 2061 void ModuleMapParser::parseConfigMacros() { 2062 assert(Tok.is(MMToken::ConfigMacros)); 2063 SourceLocation ConfigMacrosLoc = consumeToken(); 2064 2065 // Only top-level modules can have configuration macros. 2066 if (ActiveModule->Parent) { 2067 Diags.Report(ConfigMacrosLoc, diag::err_mmap_config_macro_submodule); 2068 } 2069 2070 // Parse the optional attributes. 2071 Attributes Attrs; 2072 if (parseOptionalAttributes(Attrs)) 2073 return; 2074 2075 if (Attrs.IsExhaustive && !ActiveModule->Parent) { 2076 ActiveModule->ConfigMacrosExhaustive = true; 2077 } 2078 2079 // If we don't have an identifier, we're done. 2080 // FIXME: Support macros with the same name as a keyword here. 2081 if (!Tok.is(MMToken::Identifier)) 2082 return; 2083 2084 // Consume the first identifier. 2085 if (!ActiveModule->Parent) { 2086 ActiveModule->ConfigMacros.push_back(Tok.getString().str()); 2087 } 2088 consumeToken(); 2089 2090 do { 2091 // If there's a comma, consume it. 2092 if (!Tok.is(MMToken::Comma)) 2093 break; 2094 consumeToken(); 2095 2096 // We expect to see a macro name here. 2097 // FIXME: Support macros with the same name as a keyword here. 2098 if (!Tok.is(MMToken::Identifier)) { 2099 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_config_macro); 2100 break; 2101 } 2102 2103 // Consume the macro name. 2104 if (!ActiveModule->Parent) { 2105 ActiveModule->ConfigMacros.push_back(Tok.getString().str()); 2106 } 2107 consumeToken(); 2108 } while (true); 2109 } 2110 2111 /// \brief Format a module-id into a string. 2112 static std::string formatModuleId(const ModuleId &Id) { 2113 std::string result; 2114 { 2115 llvm::raw_string_ostream OS(result); 2116 2117 for (unsigned I = 0, N = Id.size(); I != N; ++I) { 2118 if (I) 2119 OS << "."; 2120 OS << Id[I].first; 2121 } 2122 } 2123 2124 return result; 2125 } 2126 2127 /// \brief Parse a conflict declaration. 2128 /// 2129 /// module-declaration: 2130 /// 'conflict' module-id ',' string-literal 2131 void ModuleMapParser::parseConflict() { 2132 assert(Tok.is(MMToken::Conflict)); 2133 SourceLocation ConflictLoc = consumeToken(); 2134 Module::UnresolvedConflict Conflict; 2135 2136 // Parse the module-id. 2137 if (parseModuleId(Conflict.Id)) 2138 return; 2139 2140 // Parse the ','. 2141 if (!Tok.is(MMToken::Comma)) { 2142 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_comma) 2143 << SourceRange(ConflictLoc); 2144 return; 2145 } 2146 consumeToken(); 2147 2148 // Parse the message. 2149 if (!Tok.is(MMToken::StringLiteral)) { 2150 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_message) 2151 << formatModuleId(Conflict.Id); 2152 return; 2153 } 2154 Conflict.Message = Tok.getString().str(); 2155 consumeToken(); 2156 2157 // Add this unresolved conflict. 2158 ActiveModule->UnresolvedConflicts.push_back(Conflict); 2159 } 2160 2161 /// \brief Parse an inferred module declaration (wildcard modules). 2162 /// 2163 /// module-declaration: 2164 /// 'explicit'[opt] 'framework'[opt] 'module' * attributes[opt] 2165 /// { inferred-module-member* } 2166 /// 2167 /// inferred-module-member: 2168 /// 'export' '*' 2169 /// 'exclude' identifier 2170 void ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) { 2171 assert(Tok.is(MMToken::Star)); 2172 SourceLocation StarLoc = consumeToken(); 2173 bool Failed = false; 2174 2175 // Inferred modules must be submodules. 2176 if (!ActiveModule && !Framework) { 2177 Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule); 2178 Failed = true; 2179 } 2180 2181 if (ActiveModule) { 2182 // Inferred modules must have umbrella directories. 2183 if (!Failed && ActiveModule->IsAvailable && 2184 !ActiveModule->getUmbrellaDir()) { 2185 Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella); 2186 Failed = true; 2187 } 2188 2189 // Check for redefinition of an inferred module. 2190 if (!Failed && ActiveModule->InferSubmodules) { 2191 Diags.Report(StarLoc, diag::err_mmap_inferred_redef); 2192 if (ActiveModule->InferredSubmoduleLoc.isValid()) 2193 Diags.Report(ActiveModule->InferredSubmoduleLoc, 2194 diag::note_mmap_prev_definition); 2195 Failed = true; 2196 } 2197 2198 // Check for the 'framework' keyword, which is not permitted here. 2199 if (Framework) { 2200 Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule); 2201 Framework = false; 2202 } 2203 } else if (Explicit) { 2204 Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework); 2205 Explicit = false; 2206 } 2207 2208 // If there were any problems with this inferred submodule, skip its body. 2209 if (Failed) { 2210 if (Tok.is(MMToken::LBrace)) { 2211 consumeToken(); 2212 skipUntil(MMToken::RBrace); 2213 if (Tok.is(MMToken::RBrace)) 2214 consumeToken(); 2215 } 2216 HadError = true; 2217 return; 2218 } 2219 2220 // Parse optional attributes. 2221 Attributes Attrs; 2222 if (parseOptionalAttributes(Attrs)) 2223 return; 2224 2225 if (ActiveModule) { 2226 // Note that we have an inferred submodule. 2227 ActiveModule->InferSubmodules = true; 2228 ActiveModule->InferredSubmoduleLoc = StarLoc; 2229 ActiveModule->InferExplicitSubmodules = Explicit; 2230 } else { 2231 // We'll be inferring framework modules for this directory. 2232 Map.InferredDirectories[Directory].InferModules = true; 2233 Map.InferredDirectories[Directory].Attrs = Attrs; 2234 Map.InferredDirectories[Directory].ModuleMapFile = ModuleMapFile; 2235 // FIXME: Handle the 'framework' keyword. 2236 } 2237 2238 // Parse the opening brace. 2239 if (!Tok.is(MMToken::LBrace)) { 2240 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard); 2241 HadError = true; 2242 return; 2243 } 2244 SourceLocation LBraceLoc = consumeToken(); 2245 2246 // Parse the body of the inferred submodule. 2247 bool Done = false; 2248 do { 2249 switch (Tok.Kind) { 2250 case MMToken::EndOfFile: 2251 case MMToken::RBrace: 2252 Done = true; 2253 break; 2254 2255 case MMToken::ExcludeKeyword: { 2256 if (ActiveModule) { 2257 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 2258 << (ActiveModule != nullptr); 2259 consumeToken(); 2260 break; 2261 } 2262 2263 consumeToken(); 2264 // FIXME: Support string-literal module names here. 2265 if (!Tok.is(MMToken::Identifier)) { 2266 Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name); 2267 break; 2268 } 2269 2270 Map.InferredDirectories[Directory].ExcludedModules 2271 .push_back(Tok.getString()); 2272 consumeToken(); 2273 break; 2274 } 2275 2276 case MMToken::ExportKeyword: 2277 if (!ActiveModule) { 2278 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 2279 << (ActiveModule != nullptr); 2280 consumeToken(); 2281 break; 2282 } 2283 2284 consumeToken(); 2285 if (Tok.is(MMToken::Star)) 2286 ActiveModule->InferExportWildcard = true; 2287 else 2288 Diags.Report(Tok.getLocation(), 2289 diag::err_mmap_expected_export_wildcard); 2290 consumeToken(); 2291 break; 2292 2293 case MMToken::ExplicitKeyword: 2294 case MMToken::ModuleKeyword: 2295 case MMToken::HeaderKeyword: 2296 case MMToken::PrivateKeyword: 2297 case MMToken::UmbrellaKeyword: 2298 default: 2299 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 2300 << (ActiveModule != nullptr); 2301 consumeToken(); 2302 break; 2303 } 2304 } while (!Done); 2305 2306 if (Tok.is(MMToken::RBrace)) 2307 consumeToken(); 2308 else { 2309 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 2310 Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 2311 HadError = true; 2312 } 2313 } 2314 2315 /// \brief Parse optional attributes. 2316 /// 2317 /// attributes: 2318 /// attribute attributes 2319 /// attribute 2320 /// 2321 /// attribute: 2322 /// [ identifier ] 2323 /// 2324 /// \param Attrs Will be filled in with the parsed attributes. 2325 /// 2326 /// \returns true if an error occurred, false otherwise. 2327 bool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) { 2328 bool HadError = false; 2329 2330 while (Tok.is(MMToken::LSquare)) { 2331 // Consume the '['. 2332 SourceLocation LSquareLoc = consumeToken(); 2333 2334 // Check whether we have an attribute name here. 2335 if (!Tok.is(MMToken::Identifier)) { 2336 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute); 2337 skipUntil(MMToken::RSquare); 2338 if (Tok.is(MMToken::RSquare)) 2339 consumeToken(); 2340 HadError = true; 2341 } 2342 2343 // Decode the attribute name. 2344 AttributeKind Attribute 2345 = llvm::StringSwitch<AttributeKind>(Tok.getString()) 2346 .Case("exhaustive", AT_exhaustive) 2347 .Case("extern_c", AT_extern_c) 2348 .Case("system", AT_system) 2349 .Default(AT_unknown); 2350 switch (Attribute) { 2351 case AT_unknown: 2352 Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute) 2353 << Tok.getString(); 2354 break; 2355 2356 case AT_system: 2357 Attrs.IsSystem = true; 2358 break; 2359 2360 case AT_extern_c: 2361 Attrs.IsExternC = true; 2362 break; 2363 2364 case AT_exhaustive: 2365 Attrs.IsExhaustive = true; 2366 break; 2367 } 2368 consumeToken(); 2369 2370 // Consume the ']'. 2371 if (!Tok.is(MMToken::RSquare)) { 2372 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare); 2373 Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match); 2374 skipUntil(MMToken::RSquare); 2375 HadError = true; 2376 } 2377 2378 if (Tok.is(MMToken::RSquare)) 2379 consumeToken(); 2380 } 2381 2382 return HadError; 2383 } 2384 2385 /// \brief Parse a module map file. 2386 /// 2387 /// module-map-file: 2388 /// module-declaration* 2389 bool ModuleMapParser::parseModuleMapFile() { 2390 do { 2391 switch (Tok.Kind) { 2392 case MMToken::EndOfFile: 2393 return HadError; 2394 2395 case MMToken::ExplicitKeyword: 2396 case MMToken::ExternKeyword: 2397 case MMToken::ModuleKeyword: 2398 case MMToken::FrameworkKeyword: 2399 parseModuleDecl(); 2400 break; 2401 2402 case MMToken::Comma: 2403 case MMToken::ConfigMacros: 2404 case MMToken::Conflict: 2405 case MMToken::Exclaim: 2406 case MMToken::ExcludeKeyword: 2407 case MMToken::ExportKeyword: 2408 case MMToken::HeaderKeyword: 2409 case MMToken::Identifier: 2410 case MMToken::LBrace: 2411 case MMToken::LinkKeyword: 2412 case MMToken::LSquare: 2413 case MMToken::Period: 2414 case MMToken::PrivateKeyword: 2415 case MMToken::RBrace: 2416 case MMToken::RSquare: 2417 case MMToken::RequiresKeyword: 2418 case MMToken::Star: 2419 case MMToken::StringLiteral: 2420 case MMToken::TextualKeyword: 2421 case MMToken::UmbrellaKeyword: 2422 case MMToken::UseKeyword: 2423 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 2424 HadError = true; 2425 consumeToken(); 2426 break; 2427 } 2428 } while (true); 2429 } 2430 2431 bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem, 2432 const DirectoryEntry *Dir, 2433 SourceLocation ExternModuleLoc) { 2434 llvm::DenseMap<const FileEntry *, bool>::iterator Known 2435 = ParsedModuleMap.find(File); 2436 if (Known != ParsedModuleMap.end()) 2437 return Known->second; 2438 2439 assert(Target && "Missing target information"); 2440 auto FileCharacter = IsSystem ? SrcMgr::C_System : SrcMgr::C_User; 2441 FileID ID = SourceMgr.createFileID(File, ExternModuleLoc, FileCharacter); 2442 const llvm::MemoryBuffer *Buffer = SourceMgr.getBuffer(ID); 2443 if (!Buffer) 2444 return ParsedModuleMap[File] = true; 2445 2446 // Parse this module map file. 2447 Lexer L(ID, SourceMgr.getBuffer(ID), SourceMgr, MMapLangOpts); 2448 SourceLocation Start = L.getSourceLocation(); 2449 ModuleMapParser Parser(L, SourceMgr, Target, Diags, *this, File, Dir, 2450 BuiltinIncludeDir, IsSystem); 2451 bool Result = Parser.parseModuleMapFile(); 2452 ParsedModuleMap[File] = Result; 2453 2454 // Notify callbacks that we parsed it. 2455 for (const auto &Cb : Callbacks) 2456 Cb->moduleMapFileRead(Start, *File, IsSystem); 2457 return Result; 2458 } 2459