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