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