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/Basic/VirtualFileSystem.h" 26 #include "clang/Lex/HeaderSearch.h" 27 #include "clang/Lex/HeaderSearchOptions.h" 28 #include "clang/Lex/LexDiagnostic.h" 29 #include "clang/Lex/Lexer.h" 30 #include "clang/Lex/LiteralSupport.h" 31 #include "clang/Lex/Token.h" 32 #include "llvm/ADT/DenseMap.h" 33 #include "llvm/ADT/None.h" 34 #include "llvm/ADT/STLExtras.h" 35 #include "llvm/ADT/SmallPtrSet.h" 36 #include "llvm/ADT/SmallString.h" 37 #include "llvm/ADT/SmallVector.h" 38 #include "llvm/ADT/StringMap.h" 39 #include "llvm/ADT/StringRef.h" 40 #include "llvm/ADT/StringSwitch.h" 41 #include "llvm/Support/Allocator.h" 42 #include "llvm/Support/Compiler.h" 43 #include "llvm/Support/ErrorHandling.h" 44 #include "llvm/Support/MemoryBuffer.h" 45 #include "llvm/Support/Path.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 (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 assert(!PendingGlobalModule && "created multiple global modules"); 810 PendingGlobalModule.reset( 811 new Module("<global>", Loc, nullptr, /*IsFramework*/ false, 812 /*IsExplicit*/ true, NumCreatedModules++)); 813 PendingGlobalModule->Kind = Module::GlobalModuleFragment; 814 return PendingGlobalModule.get(); 815 } 816 817 Module *ModuleMap::createModuleForInterfaceUnit(SourceLocation Loc, 818 StringRef Name, 819 Module *GlobalModule) { 820 assert(LangOpts.CurrentModule == Name && "module name mismatch"); 821 assert(!Modules[Name] && "redefining existing module"); 822 823 auto *Result = 824 new Module(Name, Loc, nullptr, /*IsFramework*/ false, 825 /*IsExplicit*/ false, NumCreatedModules++); 826 Result->Kind = Module::ModuleInterfaceUnit; 827 Modules[Name] = SourceModule = Result; 828 829 // Reparent the current global module fragment as a submodule of this module. 830 assert(GlobalModule == PendingGlobalModule.get() && 831 "unexpected global module"); 832 GlobalModule->setParent(Result); 833 PendingGlobalModule.release(); // now owned by parent 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 /// For a framework module, infer the framework against which we 845 /// should link. 846 static void inferFrameworkLink(Module *Mod, const DirectoryEntry *FrameworkDir, 847 FileManager &FileMgr) { 848 assert(Mod->IsFramework && "Can only infer linking for framework modules"); 849 assert(!Mod->isSubFramework() && 850 "Can only infer linking for top-level frameworks"); 851 852 SmallString<128> LibName; 853 LibName += FrameworkDir->getName(); 854 llvm::sys::path::append(LibName, Mod->Name); 855 856 // The library name of a framework has more than one possible extension since 857 // the introduction of the text-based dynamic library format. We need to check 858 // for both before we give up. 859 for (const char *extension : {"", ".tbd"}) { 860 llvm::sys::path::replace_extension(LibName, extension); 861 if (FileMgr.getFile(LibName)) { 862 Mod->LinkLibraries.push_back(Module::LinkLibrary(Mod->Name, 863 /*IsFramework=*/true)); 864 return; 865 } 866 } 867 } 868 869 Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir, 870 bool IsSystem, Module *Parent) { 871 Attributes Attrs; 872 Attrs.IsSystem = IsSystem; 873 return inferFrameworkModule(FrameworkDir, Attrs, Parent); 874 } 875 876 Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir, 877 Attributes Attrs, Module *Parent) { 878 // Note: as an egregious but useful hack we use the real path here, because 879 // we might be looking at an embedded framework that symlinks out to a 880 // top-level framework, and we need to infer as if we were naming the 881 // top-level framework. 882 StringRef FrameworkDirName = 883 SourceMgr.getFileManager().getCanonicalName(FrameworkDir); 884 885 // In case this is a case-insensitive filesystem, use the canonical 886 // directory name as the ModuleName, since modules are case-sensitive. 887 // FIXME: we should be able to give a fix-it hint for the correct spelling. 888 SmallString<32> ModuleNameStorage; 889 StringRef ModuleName = sanitizeFilenameAsIdentifier( 890 llvm::sys::path::stem(FrameworkDirName), ModuleNameStorage); 891 892 // Check whether we've already found this module. 893 if (Module *Mod = lookupModuleQualified(ModuleName, Parent)) 894 return Mod; 895 896 FileManager &FileMgr = SourceMgr.getFileManager(); 897 898 // If the framework has a parent path from which we're allowed to infer 899 // a framework module, do so. 900 const FileEntry *ModuleMapFile = nullptr; 901 if (!Parent) { 902 // Determine whether we're allowed to infer a module map. 903 bool canInfer = false; 904 if (llvm::sys::path::has_parent_path(FrameworkDirName)) { 905 // Figure out the parent path. 906 StringRef Parent = llvm::sys::path::parent_path(FrameworkDirName); 907 if (const DirectoryEntry *ParentDir = FileMgr.getDirectory(Parent)) { 908 // Check whether we have already looked into the parent directory 909 // for a module map. 910 llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator 911 inferred = InferredDirectories.find(ParentDir); 912 if (inferred == InferredDirectories.end()) { 913 // We haven't looked here before. Load a module map, if there is 914 // one. 915 bool IsFrameworkDir = Parent.endswith(".framework"); 916 if (const FileEntry *ModMapFile = 917 HeaderInfo.lookupModuleMapFile(ParentDir, IsFrameworkDir)) { 918 parseModuleMapFile(ModMapFile, Attrs.IsSystem, ParentDir); 919 inferred = InferredDirectories.find(ParentDir); 920 } 921 922 if (inferred == InferredDirectories.end()) 923 inferred = InferredDirectories.insert( 924 std::make_pair(ParentDir, InferredDirectory())).first; 925 } 926 927 if (inferred->second.InferModules) { 928 // We're allowed to infer for this directory, but make sure it's okay 929 // to infer this particular module. 930 StringRef Name = llvm::sys::path::stem(FrameworkDirName); 931 canInfer = std::find(inferred->second.ExcludedModules.begin(), 932 inferred->second.ExcludedModules.end(), 933 Name) == inferred->second.ExcludedModules.end(); 934 935 Attrs.IsSystem |= inferred->second.Attrs.IsSystem; 936 Attrs.IsExternC |= inferred->second.Attrs.IsExternC; 937 Attrs.IsExhaustive |= inferred->second.Attrs.IsExhaustive; 938 Attrs.NoUndeclaredIncludes |= 939 inferred->second.Attrs.NoUndeclaredIncludes; 940 ModuleMapFile = inferred->second.ModuleMapFile; 941 } 942 } 943 } 944 945 // If we're not allowed to infer a framework module, don't. 946 if (!canInfer) 947 return nullptr; 948 } else 949 ModuleMapFile = getModuleMapFileForUniquing(Parent); 950 951 952 // Look for an umbrella header. 953 SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName()); 954 llvm::sys::path::append(UmbrellaName, "Headers", ModuleName + ".h"); 955 const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName); 956 957 // FIXME: If there's no umbrella header, we could probably scan the 958 // framework to load *everything*. But, it's not clear that this is a good 959 // idea. 960 if (!UmbrellaHeader) 961 return nullptr; 962 963 Module *Result = new Module(ModuleName, SourceLocation(), Parent, 964 /*IsFramework=*/true, /*IsExplicit=*/false, 965 NumCreatedModules++); 966 InferredModuleAllowedBy[Result] = ModuleMapFile; 967 Result->IsInferred = true; 968 if (!Parent) { 969 if (LangOpts.CurrentModule == ModuleName) 970 SourceModule = Result; 971 Modules[ModuleName] = Result; 972 ModuleScopeIDs[Result] = CurrentModuleScopeID; 973 } 974 975 Result->IsSystem |= Attrs.IsSystem; 976 Result->IsExternC |= Attrs.IsExternC; 977 Result->ConfigMacrosExhaustive |= Attrs.IsExhaustive; 978 Result->NoUndeclaredIncludes |= Attrs.NoUndeclaredIncludes; 979 Result->Directory = FrameworkDir; 980 981 // umbrella header "umbrella-header-name" 982 // 983 // The "Headers/" component of the name is implied because this is 984 // a framework module. 985 setUmbrellaHeader(Result, UmbrellaHeader, ModuleName + ".h"); 986 987 // export * 988 Result->Exports.push_back(Module::ExportDecl(nullptr, true)); 989 990 // module * { export * } 991 Result->InferSubmodules = true; 992 Result->InferExportWildcard = true; 993 994 // Look for subframeworks. 995 std::error_code EC; 996 SmallString<128> SubframeworksDirName 997 = StringRef(FrameworkDir->getName()); 998 llvm::sys::path::append(SubframeworksDirName, "Frameworks"); 999 llvm::sys::path::native(SubframeworksDirName); 1000 vfs::FileSystem &FS = *FileMgr.getVirtualFileSystem(); 1001 for (vfs::directory_iterator Dir = FS.dir_begin(SubframeworksDirName, EC), 1002 DirEnd; 1003 Dir != DirEnd && !EC; Dir.increment(EC)) { 1004 if (!StringRef(Dir->path()).endswith(".framework")) 1005 continue; 1006 1007 if (const DirectoryEntry *SubframeworkDir = 1008 FileMgr.getDirectory(Dir->path())) { 1009 // Note: as an egregious but useful hack, we use the real path here and 1010 // check whether it is actually a subdirectory of the parent directory. 1011 // This will not be the case if the 'subframework' is actually a symlink 1012 // out to a top-level framework. 1013 StringRef SubframeworkDirName = FileMgr.getCanonicalName(SubframeworkDir); 1014 bool FoundParent = false; 1015 do { 1016 // Get the parent directory name. 1017 SubframeworkDirName 1018 = llvm::sys::path::parent_path(SubframeworkDirName); 1019 if (SubframeworkDirName.empty()) 1020 break; 1021 1022 if (FileMgr.getDirectory(SubframeworkDirName) == FrameworkDir) { 1023 FoundParent = true; 1024 break; 1025 } 1026 } while (true); 1027 1028 if (!FoundParent) 1029 continue; 1030 1031 // FIXME: Do we want to warn about subframeworks without umbrella headers? 1032 inferFrameworkModule(SubframeworkDir, Attrs, Result); 1033 } 1034 } 1035 1036 // If the module is a top-level framework, automatically link against the 1037 // framework. 1038 if (!Result->isSubFramework()) { 1039 inferFrameworkLink(Result, FrameworkDir, FileMgr); 1040 } 1041 1042 return Result; 1043 } 1044 1045 Module *ModuleMap::createShadowedModule(StringRef Name, bool IsFramework, 1046 Module *ShadowingModule) { 1047 1048 // Create a new module with this name. 1049 Module *Result = 1050 new Module(Name, SourceLocation(), /*Parent=*/nullptr, IsFramework, 1051 /*IsExplicit=*/false, NumCreatedModules++); 1052 Result->ShadowingModule = ShadowingModule; 1053 Result->IsAvailable = false; 1054 ModuleScopeIDs[Result] = CurrentModuleScopeID; 1055 ShadowModules.push_back(Result); 1056 1057 return Result; 1058 } 1059 1060 void ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader, 1061 Twine NameAsWritten) { 1062 Headers[UmbrellaHeader].push_back(KnownHeader(Mod, NormalHeader)); 1063 Mod->Umbrella = UmbrellaHeader; 1064 Mod->UmbrellaAsWritten = NameAsWritten.str(); 1065 UmbrellaDirs[UmbrellaHeader->getDir()] = Mod; 1066 1067 // Notify callbacks that we just added a new header. 1068 for (const auto &Cb : Callbacks) 1069 Cb->moduleMapAddUmbrellaHeader(&SourceMgr.getFileManager(), UmbrellaHeader); 1070 } 1071 1072 void ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir, 1073 Twine NameAsWritten) { 1074 Mod->Umbrella = UmbrellaDir; 1075 Mod->UmbrellaAsWritten = NameAsWritten.str(); 1076 UmbrellaDirs[UmbrellaDir] = Mod; 1077 } 1078 1079 void ModuleMap::addUnresolvedHeader(Module *Mod, 1080 Module::UnresolvedHeaderDirective Header, 1081 bool &NeedsFramework) { 1082 // If there is a builtin counterpart to this file, add it now so it can 1083 // wrap the system header. 1084 if (resolveAsBuiltinHeader(Mod, Header)) { 1085 // If we have both a builtin and system version of the file, the 1086 // builtin version may want to inject macros into the system header, so 1087 // force the system header to be treated as a textual header in this 1088 // case. 1089 Header.Kind = headerRoleToKind(ModuleMap::ModuleHeaderRole( 1090 headerKindToRole(Header.Kind) | ModuleMap::TextualHeader)); 1091 Header.HasBuiltinHeader = true; 1092 } 1093 1094 // If possible, don't stat the header until we need to. This requires the 1095 // user to have provided us with some stat information about the file. 1096 // FIXME: Add support for lazily stat'ing umbrella headers and excluded 1097 // headers. 1098 if ((Header.Size || Header.ModTime) && !Header.IsUmbrella && 1099 Header.Kind != Module::HK_Excluded) { 1100 // We expect more variation in mtime than size, so if we're given both, 1101 // use the mtime as the key. 1102 if (Header.ModTime) 1103 LazyHeadersByModTime[*Header.ModTime].push_back(Mod); 1104 else 1105 LazyHeadersBySize[*Header.Size].push_back(Mod); 1106 Mod->UnresolvedHeaders.push_back(Header); 1107 return; 1108 } 1109 1110 // We don't have stat information or can't defer looking this file up. 1111 // Perform the lookup now. 1112 resolveHeader(Mod, Header, NeedsFramework); 1113 } 1114 1115 void ModuleMap::resolveHeaderDirectives(const FileEntry *File) const { 1116 auto BySize = LazyHeadersBySize.find(File->getSize()); 1117 if (BySize != LazyHeadersBySize.end()) { 1118 for (auto *M : BySize->second) 1119 resolveHeaderDirectives(M); 1120 LazyHeadersBySize.erase(BySize); 1121 } 1122 1123 auto ByModTime = LazyHeadersByModTime.find(File->getModificationTime()); 1124 if (ByModTime != LazyHeadersByModTime.end()) { 1125 for (auto *M : ByModTime->second) 1126 resolveHeaderDirectives(M); 1127 LazyHeadersByModTime.erase(ByModTime); 1128 } 1129 } 1130 1131 void ModuleMap::resolveHeaderDirectives(Module *Mod) const { 1132 bool NeedsFramework = false; 1133 for (auto &Header : Mod->UnresolvedHeaders) 1134 // This operation is logically const; we're just changing how we represent 1135 // the header information for this file. 1136 const_cast<ModuleMap*>(this)->resolveHeader(Mod, Header, NeedsFramework); 1137 Mod->UnresolvedHeaders.clear(); 1138 } 1139 1140 void ModuleMap::addHeader(Module *Mod, Module::Header Header, 1141 ModuleHeaderRole Role, bool Imported) { 1142 KnownHeader KH(Mod, Role); 1143 1144 // Only add each header to the headers list once. 1145 // FIXME: Should we diagnose if a header is listed twice in the 1146 // same module definition? 1147 auto &HeaderList = Headers[Header.Entry]; 1148 for (auto H : HeaderList) 1149 if (H == KH) 1150 return; 1151 1152 HeaderList.push_back(KH); 1153 Mod->Headers[headerRoleToKind(Role)].push_back(Header); 1154 1155 bool isCompilingModuleHeader = 1156 LangOpts.isCompilingModule() && Mod->getTopLevelModule() == SourceModule; 1157 if (!Imported || isCompilingModuleHeader) { 1158 // When we import HeaderFileInfo, the external source is expected to 1159 // set the isModuleHeader flag itself. 1160 HeaderInfo.MarkFileModuleHeader(Header.Entry, Role, 1161 isCompilingModuleHeader); 1162 } 1163 1164 // Notify callbacks that we just added a new header. 1165 for (const auto &Cb : Callbacks) 1166 Cb->moduleMapAddHeader(Header.Entry->getName()); 1167 } 1168 1169 void ModuleMap::excludeHeader(Module *Mod, Module::Header Header) { 1170 // Add this as a known header so we won't implicitly add it to any 1171 // umbrella directory module. 1172 // FIXME: Should we only exclude it from umbrella modules within the 1173 // specified module? 1174 (void) Headers[Header.Entry]; 1175 1176 Mod->Headers[Module::HK_Excluded].push_back(std::move(Header)); 1177 } 1178 1179 const FileEntry * 1180 ModuleMap::getContainingModuleMapFile(const Module *Module) const { 1181 if (Module->DefinitionLoc.isInvalid()) 1182 return nullptr; 1183 1184 return SourceMgr.getFileEntryForID( 1185 SourceMgr.getFileID(Module->DefinitionLoc)); 1186 } 1187 1188 const FileEntry *ModuleMap::getModuleMapFileForUniquing(const Module *M) const { 1189 if (M->IsInferred) { 1190 assert(InferredModuleAllowedBy.count(M) && "missing inferred module map"); 1191 return InferredModuleAllowedBy.find(M)->second; 1192 } 1193 return getContainingModuleMapFile(M); 1194 } 1195 1196 void ModuleMap::setInferredModuleAllowedBy(Module *M, const FileEntry *ModMap) { 1197 assert(M->IsInferred && "module not inferred"); 1198 InferredModuleAllowedBy[M] = ModMap; 1199 } 1200 1201 LLVM_DUMP_METHOD void ModuleMap::dump() { 1202 llvm::errs() << "Modules:"; 1203 for (llvm::StringMap<Module *>::iterator M = Modules.begin(), 1204 MEnd = Modules.end(); 1205 M != MEnd; ++M) 1206 M->getValue()->print(llvm::errs(), 2); 1207 1208 llvm::errs() << "Headers:"; 1209 for (HeadersMap::iterator H = Headers.begin(), HEnd = Headers.end(); 1210 H != HEnd; ++H) { 1211 llvm::errs() << " \"" << H->first->getName() << "\" -> "; 1212 for (SmallVectorImpl<KnownHeader>::const_iterator I = H->second.begin(), 1213 E = H->second.end(); 1214 I != E; ++I) { 1215 if (I != H->second.begin()) 1216 llvm::errs() << ","; 1217 llvm::errs() << I->getModule()->getFullModuleName(); 1218 } 1219 llvm::errs() << "\n"; 1220 } 1221 } 1222 1223 bool ModuleMap::resolveExports(Module *Mod, bool Complain) { 1224 auto Unresolved = std::move(Mod->UnresolvedExports); 1225 Mod->UnresolvedExports.clear(); 1226 for (auto &UE : Unresolved) { 1227 Module::ExportDecl Export = resolveExport(Mod, UE, Complain); 1228 if (Export.getPointer() || Export.getInt()) 1229 Mod->Exports.push_back(Export); 1230 else 1231 Mod->UnresolvedExports.push_back(UE); 1232 } 1233 return !Mod->UnresolvedExports.empty(); 1234 } 1235 1236 bool ModuleMap::resolveUses(Module *Mod, bool Complain) { 1237 auto Unresolved = std::move(Mod->UnresolvedDirectUses); 1238 Mod->UnresolvedDirectUses.clear(); 1239 for (auto &UDU : Unresolved) { 1240 Module *DirectUse = resolveModuleId(UDU, Mod, Complain); 1241 if (DirectUse) 1242 Mod->DirectUses.push_back(DirectUse); 1243 else 1244 Mod->UnresolvedDirectUses.push_back(UDU); 1245 } 1246 return !Mod->UnresolvedDirectUses.empty(); 1247 } 1248 1249 bool ModuleMap::resolveConflicts(Module *Mod, bool Complain) { 1250 auto Unresolved = std::move(Mod->UnresolvedConflicts); 1251 Mod->UnresolvedConflicts.clear(); 1252 for (auto &UC : Unresolved) { 1253 if (Module *OtherMod = resolveModuleId(UC.Id, Mod, Complain)) { 1254 Module::Conflict Conflict; 1255 Conflict.Other = OtherMod; 1256 Conflict.Message = UC.Message; 1257 Mod->Conflicts.push_back(Conflict); 1258 } else 1259 Mod->UnresolvedConflicts.push_back(UC); 1260 } 1261 return !Mod->UnresolvedConflicts.empty(); 1262 } 1263 1264 //----------------------------------------------------------------------------// 1265 // Module map file parser 1266 //----------------------------------------------------------------------------// 1267 1268 namespace clang { 1269 1270 /// A token in a module map file. 1271 struct MMToken { 1272 enum TokenKind { 1273 Comma, 1274 ConfigMacros, 1275 Conflict, 1276 EndOfFile, 1277 HeaderKeyword, 1278 Identifier, 1279 Exclaim, 1280 ExcludeKeyword, 1281 ExplicitKeyword, 1282 ExportKeyword, 1283 ExportAsKeyword, 1284 ExternKeyword, 1285 FrameworkKeyword, 1286 LinkKeyword, 1287 ModuleKeyword, 1288 Period, 1289 PrivateKeyword, 1290 UmbrellaKeyword, 1291 UseKeyword, 1292 RequiresKeyword, 1293 Star, 1294 StringLiteral, 1295 IntegerLiteral, 1296 TextualKeyword, 1297 LBrace, 1298 RBrace, 1299 LSquare, 1300 RSquare 1301 } Kind; 1302 1303 unsigned Location; 1304 unsigned StringLength; 1305 union { 1306 // If Kind != IntegerLiteral. 1307 const char *StringData; 1308 1309 // If Kind == IntegerLiteral. 1310 uint64_t IntegerValue; 1311 }; 1312 1313 void clear() { 1314 Kind = EndOfFile; 1315 Location = 0; 1316 StringLength = 0; 1317 StringData = nullptr; 1318 } 1319 1320 bool is(TokenKind K) const { return Kind == K; } 1321 1322 SourceLocation getLocation() const { 1323 return SourceLocation::getFromRawEncoding(Location); 1324 } 1325 1326 uint64_t getInteger() const { 1327 return Kind == IntegerLiteral ? IntegerValue : 0; 1328 } 1329 1330 StringRef getString() const { 1331 return Kind == IntegerLiteral ? StringRef() 1332 : StringRef(StringData, StringLength); 1333 } 1334 }; 1335 1336 class ModuleMapParser { 1337 Lexer &L; 1338 SourceManager &SourceMgr; 1339 1340 /// Default target information, used only for string literal 1341 /// parsing. 1342 const TargetInfo *Target; 1343 1344 DiagnosticsEngine &Diags; 1345 ModuleMap ⤅ 1346 1347 /// The current module map file. 1348 const FileEntry *ModuleMapFile; 1349 1350 /// Source location of most recent parsed module declaration 1351 SourceLocation CurrModuleDeclLoc; 1352 1353 /// The directory that file names in this module map file should 1354 /// be resolved relative to. 1355 const DirectoryEntry *Directory; 1356 1357 /// Whether this module map is in a system header directory. 1358 bool IsSystem; 1359 1360 /// Whether an error occurred. 1361 bool HadError = false; 1362 1363 /// Stores string data for the various string literals referenced 1364 /// during parsing. 1365 llvm::BumpPtrAllocator StringData; 1366 1367 /// The current token. 1368 MMToken Tok; 1369 1370 /// The active module. 1371 Module *ActiveModule = nullptr; 1372 1373 /// Whether a module uses the 'requires excluded' hack to mark its 1374 /// contents as 'textual'. 1375 /// 1376 /// On older Darwin SDK versions, 'requires excluded' is used to mark the 1377 /// contents of the Darwin.C.excluded (assert.h) and Tcl.Private modules as 1378 /// non-modular headers. For backwards compatibility, we continue to 1379 /// support this idiom for just these modules, and map the headers to 1380 /// 'textual' to match the original intent. 1381 llvm::SmallPtrSet<Module *, 2> UsesRequiresExcludedHack; 1382 1383 /// Consume the current token and return its location. 1384 SourceLocation consumeToken(); 1385 1386 /// Skip tokens until we reach the a token with the given kind 1387 /// (or the end of the file). 1388 void skipUntil(MMToken::TokenKind K); 1389 1390 using ModuleId = SmallVector<std::pair<std::string, SourceLocation>, 2>; 1391 1392 bool parseModuleId(ModuleId &Id); 1393 void parseModuleDecl(); 1394 void parseExternModuleDecl(); 1395 void parseRequiresDecl(); 1396 void parseHeaderDecl(MMToken::TokenKind, SourceLocation LeadingLoc); 1397 void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc); 1398 void parseExportDecl(); 1399 void parseExportAsDecl(); 1400 void parseUseDecl(); 1401 void parseLinkDecl(); 1402 void parseConfigMacros(); 1403 void parseConflict(); 1404 void parseInferredModuleDecl(bool Framework, bool Explicit); 1405 1406 /// Private modules are canonicalized as Foo_Private. Clang provides extra 1407 /// module map search logic to find the appropriate private module when PCH 1408 /// is used with implicit module maps. Warn when private modules are written 1409 /// in other ways (FooPrivate and Foo.Private), providing notes and fixits. 1410 void diagnosePrivateModules(SourceLocation ExplicitLoc, 1411 SourceLocation FrameworkLoc); 1412 1413 using Attributes = ModuleMap::Attributes; 1414 1415 bool parseOptionalAttributes(Attributes &Attrs); 1416 1417 public: 1418 explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr, 1419 const TargetInfo *Target, DiagnosticsEngine &Diags, 1420 ModuleMap &Map, const FileEntry *ModuleMapFile, 1421 const DirectoryEntry *Directory, bool IsSystem) 1422 : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map), 1423 ModuleMapFile(ModuleMapFile), Directory(Directory), 1424 IsSystem(IsSystem) { 1425 Tok.clear(); 1426 consumeToken(); 1427 } 1428 1429 bool parseModuleMapFile(); 1430 1431 bool terminatedByDirective() { return false; } 1432 SourceLocation getLocation() { return Tok.getLocation(); } 1433 }; 1434 1435 } // namespace clang 1436 1437 SourceLocation ModuleMapParser::consumeToken() { 1438 SourceLocation Result = Tok.getLocation(); 1439 1440 retry: 1441 Tok.clear(); 1442 Token LToken; 1443 L.LexFromRawLexer(LToken); 1444 Tok.Location = LToken.getLocation().getRawEncoding(); 1445 switch (LToken.getKind()) { 1446 case tok::raw_identifier: { 1447 StringRef RI = LToken.getRawIdentifier(); 1448 Tok.StringData = RI.data(); 1449 Tok.StringLength = RI.size(); 1450 Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(RI) 1451 .Case("config_macros", MMToken::ConfigMacros) 1452 .Case("conflict", MMToken::Conflict) 1453 .Case("exclude", MMToken::ExcludeKeyword) 1454 .Case("explicit", MMToken::ExplicitKeyword) 1455 .Case("export", MMToken::ExportKeyword) 1456 .Case("export_as", MMToken::ExportAsKeyword) 1457 .Case("extern", MMToken::ExternKeyword) 1458 .Case("framework", MMToken::FrameworkKeyword) 1459 .Case("header", MMToken::HeaderKeyword) 1460 .Case("link", MMToken::LinkKeyword) 1461 .Case("module", MMToken::ModuleKeyword) 1462 .Case("private", MMToken::PrivateKeyword) 1463 .Case("requires", MMToken::RequiresKeyword) 1464 .Case("textual", MMToken::TextualKeyword) 1465 .Case("umbrella", MMToken::UmbrellaKeyword) 1466 .Case("use", MMToken::UseKeyword) 1467 .Default(MMToken::Identifier); 1468 break; 1469 } 1470 1471 case tok::comma: 1472 Tok.Kind = MMToken::Comma; 1473 break; 1474 1475 case tok::eof: 1476 Tok.Kind = MMToken::EndOfFile; 1477 break; 1478 1479 case tok::l_brace: 1480 Tok.Kind = MMToken::LBrace; 1481 break; 1482 1483 case tok::l_square: 1484 Tok.Kind = MMToken::LSquare; 1485 break; 1486 1487 case tok::period: 1488 Tok.Kind = MMToken::Period; 1489 break; 1490 1491 case tok::r_brace: 1492 Tok.Kind = MMToken::RBrace; 1493 break; 1494 1495 case tok::r_square: 1496 Tok.Kind = MMToken::RSquare; 1497 break; 1498 1499 case tok::star: 1500 Tok.Kind = MMToken::Star; 1501 break; 1502 1503 case tok::exclaim: 1504 Tok.Kind = MMToken::Exclaim; 1505 break; 1506 1507 case tok::string_literal: { 1508 if (LToken.hasUDSuffix()) { 1509 Diags.Report(LToken.getLocation(), diag::err_invalid_string_udl); 1510 HadError = true; 1511 goto retry; 1512 } 1513 1514 // Parse the string literal. 1515 LangOptions LangOpts; 1516 StringLiteralParser StringLiteral(LToken, SourceMgr, LangOpts, *Target); 1517 if (StringLiteral.hadError) 1518 goto retry; 1519 1520 // Copy the string literal into our string data allocator. 1521 unsigned Length = StringLiteral.GetStringLength(); 1522 char *Saved = StringData.Allocate<char>(Length + 1); 1523 memcpy(Saved, StringLiteral.GetString().data(), Length); 1524 Saved[Length] = 0; 1525 1526 // Form the token. 1527 Tok.Kind = MMToken::StringLiteral; 1528 Tok.StringData = Saved; 1529 Tok.StringLength = Length; 1530 break; 1531 } 1532 1533 case tok::numeric_constant: { 1534 // We don't support any suffixes or other complications. 1535 SmallString<32> SpellingBuffer; 1536 SpellingBuffer.resize(LToken.getLength() + 1); 1537 const char *Start = SpellingBuffer.data(); 1538 unsigned Length = 1539 Lexer::getSpelling(LToken, Start, SourceMgr, L.getLangOpts()); 1540 uint64_t Value; 1541 if (StringRef(Start, Length).getAsInteger(0, Value)) { 1542 Diags.Report(Tok.getLocation(), diag::err_mmap_unknown_token); 1543 HadError = true; 1544 goto retry; 1545 } 1546 1547 Tok.Kind = MMToken::IntegerLiteral; 1548 Tok.IntegerValue = Value; 1549 break; 1550 } 1551 1552 case tok::comment: 1553 goto retry; 1554 1555 case tok::hash: 1556 // A module map can be terminated prematurely by 1557 // #pragma clang module contents 1558 // When building the module, we'll treat the rest of the file as the 1559 // contents of the module. 1560 { 1561 auto NextIsIdent = [&](StringRef Str) -> bool { 1562 L.LexFromRawLexer(LToken); 1563 return !LToken.isAtStartOfLine() && LToken.is(tok::raw_identifier) && 1564 LToken.getRawIdentifier() == Str; 1565 }; 1566 if (NextIsIdent("pragma") && NextIsIdent("clang") && 1567 NextIsIdent("module") && NextIsIdent("contents")) { 1568 Tok.Kind = MMToken::EndOfFile; 1569 break; 1570 } 1571 } 1572 LLVM_FALLTHROUGH; 1573 1574 default: 1575 Diags.Report(Tok.getLocation(), diag::err_mmap_unknown_token); 1576 HadError = true; 1577 goto retry; 1578 } 1579 1580 return Result; 1581 } 1582 1583 void ModuleMapParser::skipUntil(MMToken::TokenKind K) { 1584 unsigned braceDepth = 0; 1585 unsigned squareDepth = 0; 1586 do { 1587 switch (Tok.Kind) { 1588 case MMToken::EndOfFile: 1589 return; 1590 1591 case MMToken::LBrace: 1592 if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 1593 return; 1594 1595 ++braceDepth; 1596 break; 1597 1598 case MMToken::LSquare: 1599 if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 1600 return; 1601 1602 ++squareDepth; 1603 break; 1604 1605 case MMToken::RBrace: 1606 if (braceDepth > 0) 1607 --braceDepth; 1608 else if (Tok.is(K)) 1609 return; 1610 break; 1611 1612 case MMToken::RSquare: 1613 if (squareDepth > 0) 1614 --squareDepth; 1615 else if (Tok.is(K)) 1616 return; 1617 break; 1618 1619 default: 1620 if (braceDepth == 0 && squareDepth == 0 && Tok.is(K)) 1621 return; 1622 break; 1623 } 1624 1625 consumeToken(); 1626 } while (true); 1627 } 1628 1629 /// Parse a module-id. 1630 /// 1631 /// module-id: 1632 /// identifier 1633 /// identifier '.' module-id 1634 /// 1635 /// \returns true if an error occurred, false otherwise. 1636 bool ModuleMapParser::parseModuleId(ModuleId &Id) { 1637 Id.clear(); 1638 do { 1639 if (Tok.is(MMToken::Identifier) || Tok.is(MMToken::StringLiteral)) { 1640 Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation())); 1641 consumeToken(); 1642 } else { 1643 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name); 1644 return true; 1645 } 1646 1647 if (!Tok.is(MMToken::Period)) 1648 break; 1649 1650 consumeToken(); 1651 } while (true); 1652 1653 return false; 1654 } 1655 1656 namespace { 1657 1658 /// Enumerates the known attributes. 1659 enum AttributeKind { 1660 /// An unknown attribute. 1661 AT_unknown, 1662 1663 /// The 'system' attribute. 1664 AT_system, 1665 1666 /// The 'extern_c' attribute. 1667 AT_extern_c, 1668 1669 /// The 'exhaustive' attribute. 1670 AT_exhaustive, 1671 1672 /// The 'no_undeclared_includes' attribute. 1673 AT_no_undeclared_includes 1674 }; 1675 1676 } // namespace 1677 1678 /// Private modules are canonicalized as Foo_Private. Clang provides extra 1679 /// module map search logic to find the appropriate private module when PCH 1680 /// is used with implicit module maps. Warn when private modules are written 1681 /// in other ways (FooPrivate and Foo.Private), providing notes and fixits. 1682 void ModuleMapParser::diagnosePrivateModules(SourceLocation ExplicitLoc, 1683 SourceLocation FrameworkLoc) { 1684 auto GenNoteAndFixIt = [&](StringRef BadName, StringRef Canonical, 1685 const Module *M, SourceRange ReplLoc) { 1686 auto D = Diags.Report(ActiveModule->DefinitionLoc, 1687 diag::note_mmap_rename_top_level_private_module); 1688 D << BadName << M->Name; 1689 D << FixItHint::CreateReplacement(ReplLoc, Canonical); 1690 }; 1691 1692 for (auto E = Map.module_begin(); E != Map.module_end(); ++E) { 1693 auto const *M = E->getValue(); 1694 if (M->Directory != ActiveModule->Directory) 1695 continue; 1696 1697 SmallString<128> FullName(ActiveModule->getFullModuleName()); 1698 if (!FullName.startswith(M->Name) && !FullName.endswith("Private")) 1699 continue; 1700 SmallString<128> FixedPrivModDecl; 1701 SmallString<128> Canonical(M->Name); 1702 Canonical.append("_Private"); 1703 1704 // Foo.Private -> Foo_Private 1705 if (ActiveModule->Parent && ActiveModule->Name == "Private" && !M->Parent && 1706 M->Name == ActiveModule->Parent->Name) { 1707 Diags.Report(ActiveModule->DefinitionLoc, 1708 diag::warn_mmap_mismatched_private_submodule) 1709 << FullName; 1710 1711 SourceLocation FixItInitBegin = CurrModuleDeclLoc; 1712 if (FrameworkLoc.isValid()) 1713 FixItInitBegin = FrameworkLoc; 1714 if (ExplicitLoc.isValid()) 1715 FixItInitBegin = ExplicitLoc; 1716 1717 if (FrameworkLoc.isValid() || ActiveModule->Parent->IsFramework) 1718 FixedPrivModDecl.append("framework "); 1719 FixedPrivModDecl.append("module "); 1720 FixedPrivModDecl.append(Canonical); 1721 1722 GenNoteAndFixIt(FullName, FixedPrivModDecl, M, 1723 SourceRange(FixItInitBegin, ActiveModule->DefinitionLoc)); 1724 continue; 1725 } 1726 1727 // FooPrivate and whatnots -> Foo_Private 1728 if (!ActiveModule->Parent && !M->Parent && M->Name != ActiveModule->Name && 1729 ActiveModule->Name != Canonical) { 1730 Diags.Report(ActiveModule->DefinitionLoc, 1731 diag::warn_mmap_mismatched_private_module_name) 1732 << ActiveModule->Name; 1733 GenNoteAndFixIt(ActiveModule->Name, Canonical, M, 1734 SourceRange(ActiveModule->DefinitionLoc)); 1735 } 1736 } 1737 } 1738 1739 /// Parse a module declaration. 1740 /// 1741 /// module-declaration: 1742 /// 'extern' 'module' module-id string-literal 1743 /// 'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt] 1744 /// { module-member* } 1745 /// 1746 /// module-member: 1747 /// requires-declaration 1748 /// header-declaration 1749 /// submodule-declaration 1750 /// export-declaration 1751 /// export-as-declaration 1752 /// link-declaration 1753 /// 1754 /// submodule-declaration: 1755 /// module-declaration 1756 /// inferred-submodule-declaration 1757 void ModuleMapParser::parseModuleDecl() { 1758 assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) || 1759 Tok.is(MMToken::FrameworkKeyword) || Tok.is(MMToken::ExternKeyword)); 1760 if (Tok.is(MMToken::ExternKeyword)) { 1761 parseExternModuleDecl(); 1762 return; 1763 } 1764 1765 // Parse 'explicit' or 'framework' keyword, if present. 1766 SourceLocation ExplicitLoc; 1767 SourceLocation FrameworkLoc; 1768 bool Explicit = false; 1769 bool Framework = false; 1770 1771 // Parse 'explicit' keyword, if present. 1772 if (Tok.is(MMToken::ExplicitKeyword)) { 1773 ExplicitLoc = consumeToken(); 1774 Explicit = true; 1775 } 1776 1777 // Parse 'framework' keyword, if present. 1778 if (Tok.is(MMToken::FrameworkKeyword)) { 1779 FrameworkLoc = consumeToken(); 1780 Framework = true; 1781 } 1782 1783 // Parse 'module' keyword. 1784 if (!Tok.is(MMToken::ModuleKeyword)) { 1785 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 1786 consumeToken(); 1787 HadError = true; 1788 return; 1789 } 1790 CurrModuleDeclLoc = consumeToken(); // 'module' keyword 1791 1792 // If we have a wildcard for the module name, this is an inferred submodule. 1793 // Parse it. 1794 if (Tok.is(MMToken::Star)) 1795 return parseInferredModuleDecl(Framework, Explicit); 1796 1797 // Parse the module name. 1798 ModuleId Id; 1799 if (parseModuleId(Id)) { 1800 HadError = true; 1801 return; 1802 } 1803 1804 if (ActiveModule) { 1805 if (Id.size() > 1) { 1806 Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id) 1807 << SourceRange(Id.front().second, Id.back().second); 1808 1809 HadError = true; 1810 return; 1811 } 1812 } else if (Id.size() == 1 && Explicit) { 1813 // Top-level modules can't be explicit. 1814 Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level); 1815 Explicit = false; 1816 ExplicitLoc = SourceLocation(); 1817 HadError = true; 1818 } 1819 1820 Module *PreviousActiveModule = ActiveModule; 1821 if (Id.size() > 1) { 1822 // This module map defines a submodule. Go find the module of which it 1823 // is a submodule. 1824 ActiveModule = nullptr; 1825 const Module *TopLevelModule = nullptr; 1826 for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) { 1827 if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) { 1828 if (I == 0) 1829 TopLevelModule = Next; 1830 ActiveModule = Next; 1831 continue; 1832 } 1833 1834 if (ActiveModule) { 1835 Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified) 1836 << Id[I].first 1837 << ActiveModule->getTopLevelModule()->getFullModuleName(); 1838 } else { 1839 Diags.Report(Id[I].second, diag::err_mmap_expected_module_name); 1840 } 1841 HadError = true; 1842 return; 1843 } 1844 1845 if (ModuleMapFile != Map.getContainingModuleMapFile(TopLevelModule)) { 1846 assert(ModuleMapFile != Map.getModuleMapFileForUniquing(TopLevelModule) && 1847 "submodule defined in same file as 'module *' that allowed its " 1848 "top-level module"); 1849 Map.addAdditionalModuleMapFile(TopLevelModule, ModuleMapFile); 1850 } 1851 } 1852 1853 StringRef ModuleName = Id.back().first; 1854 SourceLocation ModuleNameLoc = Id.back().second; 1855 1856 // Parse the optional attribute list. 1857 Attributes Attrs; 1858 if (parseOptionalAttributes(Attrs)) 1859 return; 1860 1861 // Parse the opening brace. 1862 if (!Tok.is(MMToken::LBrace)) { 1863 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace) 1864 << ModuleName; 1865 HadError = true; 1866 return; 1867 } 1868 SourceLocation LBraceLoc = consumeToken(); 1869 1870 // Determine whether this (sub)module has already been defined. 1871 Module *ShadowingModule = nullptr; 1872 if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) { 1873 // We might see a (re)definition of a module that we already have a 1874 // definition for in two cases: 1875 // - If we loaded one definition from an AST file and we've just found a 1876 // corresponding definition in a module map file, or 1877 bool LoadedFromASTFile = Existing->DefinitionLoc.isInvalid(); 1878 // - If we're building a (preprocessed) module and we've just loaded the 1879 // module map file from which it was created. 1880 bool ParsedAsMainInput = 1881 Map.LangOpts.getCompilingModule() == LangOptions::CMK_ModuleMap && 1882 Map.LangOpts.CurrentModule == ModuleName && 1883 SourceMgr.getDecomposedLoc(ModuleNameLoc).first != 1884 SourceMgr.getDecomposedLoc(Existing->DefinitionLoc).first; 1885 if (!ActiveModule && (LoadedFromASTFile || ParsedAsMainInput)) { 1886 // Skip the module definition. 1887 skipUntil(MMToken::RBrace); 1888 if (Tok.is(MMToken::RBrace)) 1889 consumeToken(); 1890 else { 1891 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 1892 Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 1893 HadError = true; 1894 } 1895 return; 1896 } 1897 1898 if (!Existing->Parent && Map.mayShadowNewModule(Existing)) { 1899 ShadowingModule = Existing; 1900 } else { 1901 // This is not a shawdowed module decl, it is an illegal redefinition. 1902 Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition) 1903 << ModuleName; 1904 Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition); 1905 1906 // Skip the module definition. 1907 skipUntil(MMToken::RBrace); 1908 if (Tok.is(MMToken::RBrace)) 1909 consumeToken(); 1910 1911 HadError = true; 1912 return; 1913 } 1914 } 1915 1916 // Start defining this module. 1917 if (ShadowingModule) { 1918 ActiveModule = 1919 Map.createShadowedModule(ModuleName, Framework, ShadowingModule); 1920 } else { 1921 ActiveModule = 1922 Map.findOrCreateModule(ModuleName, ActiveModule, Framework, Explicit) 1923 .first; 1924 } 1925 1926 ActiveModule->DefinitionLoc = ModuleNameLoc; 1927 if (Attrs.IsSystem || IsSystem) 1928 ActiveModule->IsSystem = true; 1929 if (Attrs.IsExternC) 1930 ActiveModule->IsExternC = true; 1931 if (Attrs.NoUndeclaredIncludes || 1932 (!ActiveModule->Parent && ModuleName == "Darwin")) 1933 ActiveModule->NoUndeclaredIncludes = true; 1934 ActiveModule->Directory = Directory; 1935 1936 StringRef MapFileName(ModuleMapFile->getName()); 1937 if (MapFileName.endswith("module.private.modulemap") || 1938 MapFileName.endswith("module_private.map")) { 1939 ActiveModule->ModuleMapIsPrivate = true; 1940 } 1941 1942 // Private modules named as FooPrivate, Foo.Private or similar are likely a 1943 // user error; provide warnings, notes and fixits to direct users to use 1944 // Foo_Private instead. 1945 SourceLocation StartLoc = 1946 SourceMgr.getLocForStartOfFile(SourceMgr.getMainFileID()); 1947 if (Map.HeaderInfo.getHeaderSearchOpts().ImplicitModuleMaps && 1948 !Diags.isIgnored(diag::warn_mmap_mismatched_private_submodule, 1949 StartLoc) && 1950 !Diags.isIgnored(diag::warn_mmap_mismatched_private_module_name, 1951 StartLoc) && 1952 ActiveModule->ModuleMapIsPrivate) 1953 diagnosePrivateModules(ExplicitLoc, FrameworkLoc); 1954 1955 bool Done = false; 1956 do { 1957 switch (Tok.Kind) { 1958 case MMToken::EndOfFile: 1959 case MMToken::RBrace: 1960 Done = true; 1961 break; 1962 1963 case MMToken::ConfigMacros: 1964 parseConfigMacros(); 1965 break; 1966 1967 case MMToken::Conflict: 1968 parseConflict(); 1969 break; 1970 1971 case MMToken::ExplicitKeyword: 1972 case MMToken::ExternKeyword: 1973 case MMToken::FrameworkKeyword: 1974 case MMToken::ModuleKeyword: 1975 parseModuleDecl(); 1976 break; 1977 1978 case MMToken::ExportKeyword: 1979 parseExportDecl(); 1980 break; 1981 1982 case MMToken::ExportAsKeyword: 1983 parseExportAsDecl(); 1984 break; 1985 1986 case MMToken::UseKeyword: 1987 parseUseDecl(); 1988 break; 1989 1990 case MMToken::RequiresKeyword: 1991 parseRequiresDecl(); 1992 break; 1993 1994 case MMToken::TextualKeyword: 1995 parseHeaderDecl(MMToken::TextualKeyword, consumeToken()); 1996 break; 1997 1998 case MMToken::UmbrellaKeyword: { 1999 SourceLocation UmbrellaLoc = consumeToken(); 2000 if (Tok.is(MMToken::HeaderKeyword)) 2001 parseHeaderDecl(MMToken::UmbrellaKeyword, UmbrellaLoc); 2002 else 2003 parseUmbrellaDirDecl(UmbrellaLoc); 2004 break; 2005 } 2006 2007 case MMToken::ExcludeKeyword: 2008 parseHeaderDecl(MMToken::ExcludeKeyword, consumeToken()); 2009 break; 2010 2011 case MMToken::PrivateKeyword: 2012 parseHeaderDecl(MMToken::PrivateKeyword, consumeToken()); 2013 break; 2014 2015 case MMToken::HeaderKeyword: 2016 parseHeaderDecl(MMToken::HeaderKeyword, consumeToken()); 2017 break; 2018 2019 case MMToken::LinkKeyword: 2020 parseLinkDecl(); 2021 break; 2022 2023 default: 2024 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member); 2025 consumeToken(); 2026 break; 2027 } 2028 } while (!Done); 2029 2030 if (Tok.is(MMToken::RBrace)) 2031 consumeToken(); 2032 else { 2033 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 2034 Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 2035 HadError = true; 2036 } 2037 2038 // If the active module is a top-level framework, and there are no link 2039 // libraries, automatically link against the framework. 2040 if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() && 2041 ActiveModule->LinkLibraries.empty()) { 2042 inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager()); 2043 } 2044 2045 // If the module meets all requirements but is still unavailable, mark the 2046 // whole tree as unavailable to prevent it from building. 2047 if (!ActiveModule->IsAvailable && !ActiveModule->IsMissingRequirement && 2048 ActiveModule->Parent) { 2049 ActiveModule->getTopLevelModule()->markUnavailable(); 2050 ActiveModule->getTopLevelModule()->MissingHeaders.append( 2051 ActiveModule->MissingHeaders.begin(), ActiveModule->MissingHeaders.end()); 2052 } 2053 2054 // We're done parsing this module. Pop back to the previous module. 2055 ActiveModule = PreviousActiveModule; 2056 } 2057 2058 /// Parse an extern module declaration. 2059 /// 2060 /// extern module-declaration: 2061 /// 'extern' 'module' module-id string-literal 2062 void ModuleMapParser::parseExternModuleDecl() { 2063 assert(Tok.is(MMToken::ExternKeyword)); 2064 SourceLocation ExternLoc = consumeToken(); // 'extern' keyword 2065 2066 // Parse 'module' keyword. 2067 if (!Tok.is(MMToken::ModuleKeyword)) { 2068 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 2069 consumeToken(); 2070 HadError = true; 2071 return; 2072 } 2073 consumeToken(); // 'module' keyword 2074 2075 // Parse the module name. 2076 ModuleId Id; 2077 if (parseModuleId(Id)) { 2078 HadError = true; 2079 return; 2080 } 2081 2082 // Parse the referenced module map file name. 2083 if (!Tok.is(MMToken::StringLiteral)) { 2084 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_mmap_file); 2085 HadError = true; 2086 return; 2087 } 2088 std::string FileName = Tok.getString(); 2089 consumeToken(); // filename 2090 2091 StringRef FileNameRef = FileName; 2092 SmallString<128> ModuleMapFileName; 2093 if (llvm::sys::path::is_relative(FileNameRef)) { 2094 ModuleMapFileName += Directory->getName(); 2095 llvm::sys::path::append(ModuleMapFileName, FileName); 2096 FileNameRef = ModuleMapFileName; 2097 } 2098 if (const FileEntry *File = SourceMgr.getFileManager().getFile(FileNameRef)) 2099 Map.parseModuleMapFile( 2100 File, /*IsSystem=*/false, 2101 Map.HeaderInfo.getHeaderSearchOpts().ModuleMapFileHomeIsCwd 2102 ? Directory 2103 : File->getDir(), 2104 FileID(), nullptr, ExternLoc); 2105 } 2106 2107 /// Whether to add the requirement \p Feature to the module \p M. 2108 /// 2109 /// This preserves backwards compatibility for two hacks in the Darwin system 2110 /// module map files: 2111 /// 2112 /// 1. The use of 'requires excluded' to make headers non-modular, which 2113 /// should really be mapped to 'textual' now that we have this feature. We 2114 /// drop the 'excluded' requirement, and set \p IsRequiresExcludedHack to 2115 /// true. Later, this bit will be used to map all the headers inside this 2116 /// module to 'textual'. 2117 /// 2118 /// This affects Darwin.C.excluded (for assert.h) and Tcl.Private. 2119 /// 2120 /// 2. Removes a bogus cplusplus requirement from IOKit.avc. This requirement 2121 /// was never correct and causes issues now that we check it, so drop it. 2122 static bool shouldAddRequirement(Module *M, StringRef Feature, 2123 bool &IsRequiresExcludedHack) { 2124 if (Feature == "excluded" && 2125 (M->fullModuleNameIs({"Darwin", "C", "excluded"}) || 2126 M->fullModuleNameIs({"Tcl", "Private"}))) { 2127 IsRequiresExcludedHack = true; 2128 return false; 2129 } else if (Feature == "cplusplus" && M->fullModuleNameIs({"IOKit", "avc"})) { 2130 return false; 2131 } 2132 2133 return true; 2134 } 2135 2136 /// Parse a requires declaration. 2137 /// 2138 /// requires-declaration: 2139 /// 'requires' feature-list 2140 /// 2141 /// feature-list: 2142 /// feature ',' feature-list 2143 /// feature 2144 /// 2145 /// feature: 2146 /// '!'[opt] identifier 2147 void ModuleMapParser::parseRequiresDecl() { 2148 assert(Tok.is(MMToken::RequiresKeyword)); 2149 2150 // Parse 'requires' keyword. 2151 consumeToken(); 2152 2153 // Parse the feature-list. 2154 do { 2155 bool RequiredState = true; 2156 if (Tok.is(MMToken::Exclaim)) { 2157 RequiredState = false; 2158 consumeToken(); 2159 } 2160 2161 if (!Tok.is(MMToken::Identifier)) { 2162 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature); 2163 HadError = true; 2164 return; 2165 } 2166 2167 // Consume the feature name. 2168 std::string Feature = Tok.getString(); 2169 consumeToken(); 2170 2171 bool IsRequiresExcludedHack = false; 2172 bool ShouldAddRequirement = 2173 shouldAddRequirement(ActiveModule, Feature, IsRequiresExcludedHack); 2174 2175 if (IsRequiresExcludedHack) 2176 UsesRequiresExcludedHack.insert(ActiveModule); 2177 2178 if (ShouldAddRequirement) { 2179 // Add this feature. 2180 ActiveModule->addRequirement(Feature, RequiredState, Map.LangOpts, 2181 *Map.Target); 2182 } 2183 2184 if (!Tok.is(MMToken::Comma)) 2185 break; 2186 2187 // Consume the comma. 2188 consumeToken(); 2189 } while (true); 2190 } 2191 2192 /// Parse a header declaration. 2193 /// 2194 /// header-declaration: 2195 /// 'textual'[opt] 'header' string-literal 2196 /// 'private' 'textual'[opt] 'header' string-literal 2197 /// 'exclude' 'header' string-literal 2198 /// 'umbrella' 'header' string-literal 2199 /// 2200 /// FIXME: Support 'private textual header'. 2201 void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken, 2202 SourceLocation LeadingLoc) { 2203 // We've already consumed the first token. 2204 ModuleMap::ModuleHeaderRole Role = ModuleMap::NormalHeader; 2205 if (LeadingToken == MMToken::PrivateKeyword) { 2206 Role = ModuleMap::PrivateHeader; 2207 // 'private' may optionally be followed by 'textual'. 2208 if (Tok.is(MMToken::TextualKeyword)) { 2209 LeadingToken = Tok.Kind; 2210 consumeToken(); 2211 } 2212 } 2213 2214 if (LeadingToken == MMToken::TextualKeyword) 2215 Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader); 2216 2217 if (UsesRequiresExcludedHack.count(ActiveModule)) { 2218 // Mark this header 'textual' (see doc comment for 2219 // Module::UsesRequiresExcludedHack). 2220 Role = ModuleMap::ModuleHeaderRole(Role | ModuleMap::TextualHeader); 2221 } 2222 2223 if (LeadingToken != MMToken::HeaderKeyword) { 2224 if (!Tok.is(MMToken::HeaderKeyword)) { 2225 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 2226 << (LeadingToken == MMToken::PrivateKeyword ? "private" : 2227 LeadingToken == MMToken::ExcludeKeyword ? "exclude" : 2228 LeadingToken == MMToken::TextualKeyword ? "textual" : "umbrella"); 2229 return; 2230 } 2231 consumeToken(); 2232 } 2233 2234 // Parse the header name. 2235 if (!Tok.is(MMToken::StringLiteral)) { 2236 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 2237 << "header"; 2238 HadError = true; 2239 return; 2240 } 2241 Module::UnresolvedHeaderDirective Header; 2242 Header.FileName = Tok.getString(); 2243 Header.FileNameLoc = consumeToken(); 2244 Header.IsUmbrella = LeadingToken == MMToken::UmbrellaKeyword; 2245 Header.Kind = 2246 (LeadingToken == MMToken::ExcludeKeyword ? Module::HK_Excluded 2247 : Map.headerRoleToKind(Role)); 2248 2249 // Check whether we already have an umbrella. 2250 if (Header.IsUmbrella && ActiveModule->Umbrella) { 2251 Diags.Report(Header.FileNameLoc, diag::err_mmap_umbrella_clash) 2252 << ActiveModule->getFullModuleName(); 2253 HadError = true; 2254 return; 2255 } 2256 2257 // If we were given stat information, parse it so we can skip looking for 2258 // the file. 2259 if (Tok.is(MMToken::LBrace)) { 2260 SourceLocation LBraceLoc = consumeToken(); 2261 2262 while (!Tok.is(MMToken::RBrace) && !Tok.is(MMToken::EndOfFile)) { 2263 enum Attribute { Size, ModTime, Unknown }; 2264 StringRef Str = Tok.getString(); 2265 SourceLocation Loc = consumeToken(); 2266 switch (llvm::StringSwitch<Attribute>(Str) 2267 .Case("size", Size) 2268 .Case("mtime", ModTime) 2269 .Default(Unknown)) { 2270 case Size: 2271 if (Header.Size) 2272 Diags.Report(Loc, diag::err_mmap_duplicate_header_attribute) << Str; 2273 if (!Tok.is(MMToken::IntegerLiteral)) { 2274 Diags.Report(Tok.getLocation(), 2275 diag::err_mmap_invalid_header_attribute_value) << Str; 2276 skipUntil(MMToken::RBrace); 2277 break; 2278 } 2279 Header.Size = Tok.getInteger(); 2280 consumeToken(); 2281 break; 2282 2283 case ModTime: 2284 if (Header.ModTime) 2285 Diags.Report(Loc, diag::err_mmap_duplicate_header_attribute) << Str; 2286 if (!Tok.is(MMToken::IntegerLiteral)) { 2287 Diags.Report(Tok.getLocation(), 2288 diag::err_mmap_invalid_header_attribute_value) << Str; 2289 skipUntil(MMToken::RBrace); 2290 break; 2291 } 2292 Header.ModTime = Tok.getInteger(); 2293 consumeToken(); 2294 break; 2295 2296 case Unknown: 2297 Diags.Report(Loc, diag::err_mmap_expected_header_attribute); 2298 skipUntil(MMToken::RBrace); 2299 break; 2300 } 2301 } 2302 2303 if (Tok.is(MMToken::RBrace)) 2304 consumeToken(); 2305 else { 2306 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 2307 Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 2308 HadError = true; 2309 } 2310 } 2311 2312 bool NeedsFramework = false; 2313 Map.addUnresolvedHeader(ActiveModule, std::move(Header), NeedsFramework); 2314 2315 if (NeedsFramework && ActiveModule) 2316 Diags.Report(CurrModuleDeclLoc, diag::note_mmap_add_framework_keyword) 2317 << ActiveModule->getFullModuleName() 2318 << FixItHint::CreateReplacement(CurrModuleDeclLoc, "framework module"); 2319 } 2320 2321 static int compareModuleHeaders(const Module::Header *A, 2322 const Module::Header *B) { 2323 return A->NameAsWritten.compare(B->NameAsWritten); 2324 } 2325 2326 /// Parse an umbrella directory declaration. 2327 /// 2328 /// umbrella-dir-declaration: 2329 /// umbrella string-literal 2330 void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) { 2331 // Parse the directory name. 2332 if (!Tok.is(MMToken::StringLiteral)) { 2333 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 2334 << "umbrella"; 2335 HadError = true; 2336 return; 2337 } 2338 2339 std::string DirName = Tok.getString(); 2340 SourceLocation DirNameLoc = consumeToken(); 2341 2342 // Check whether we already have an umbrella. 2343 if (ActiveModule->Umbrella) { 2344 Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash) 2345 << ActiveModule->getFullModuleName(); 2346 HadError = true; 2347 return; 2348 } 2349 2350 // Look for this file. 2351 const DirectoryEntry *Dir = nullptr; 2352 if (llvm::sys::path::is_absolute(DirName)) 2353 Dir = SourceMgr.getFileManager().getDirectory(DirName); 2354 else { 2355 SmallString<128> PathName; 2356 PathName = Directory->getName(); 2357 llvm::sys::path::append(PathName, DirName); 2358 Dir = SourceMgr.getFileManager().getDirectory(PathName); 2359 } 2360 2361 if (!Dir) { 2362 Diags.Report(DirNameLoc, diag::warn_mmap_umbrella_dir_not_found) 2363 << DirName; 2364 return; 2365 } 2366 2367 if (UsesRequiresExcludedHack.count(ActiveModule)) { 2368 // Mark this header 'textual' (see doc comment for 2369 // ModuleMapParser::UsesRequiresExcludedHack). Although iterating over the 2370 // directory is relatively expensive, in practice this only applies to the 2371 // uncommonly used Tcl module on Darwin platforms. 2372 std::error_code EC; 2373 SmallVector<Module::Header, 6> Headers; 2374 vfs::FileSystem &FS = *SourceMgr.getFileManager().getVirtualFileSystem(); 2375 for (vfs::recursive_directory_iterator I(FS, Dir->getName(), EC), E; 2376 I != E && !EC; I.increment(EC)) { 2377 if (const FileEntry *FE = SourceMgr.getFileManager().getFile(I->path())) { 2378 2379 Module::Header Header = {I->path(), FE}; 2380 Headers.push_back(std::move(Header)); 2381 } 2382 } 2383 2384 // Sort header paths so that the pcm doesn't depend on iteration order. 2385 llvm::array_pod_sort(Headers.begin(), Headers.end(), compareModuleHeaders); 2386 2387 for (auto &Header : Headers) 2388 Map.addHeader(ActiveModule, std::move(Header), ModuleMap::TextualHeader); 2389 return; 2390 } 2391 2392 if (Module *OwningModule = Map.UmbrellaDirs[Dir]) { 2393 Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash) 2394 << OwningModule->getFullModuleName(); 2395 HadError = true; 2396 return; 2397 } 2398 2399 // Record this umbrella directory. 2400 Map.setUmbrellaDir(ActiveModule, Dir, DirName); 2401 } 2402 2403 /// Parse a module export declaration. 2404 /// 2405 /// export-declaration: 2406 /// 'export' wildcard-module-id 2407 /// 2408 /// wildcard-module-id: 2409 /// identifier 2410 /// '*' 2411 /// identifier '.' wildcard-module-id 2412 void ModuleMapParser::parseExportDecl() { 2413 assert(Tok.is(MMToken::ExportKeyword)); 2414 SourceLocation ExportLoc = consumeToken(); 2415 2416 // Parse the module-id with an optional wildcard at the end. 2417 ModuleId ParsedModuleId; 2418 bool Wildcard = false; 2419 do { 2420 // FIXME: Support string-literal module names here. 2421 if (Tok.is(MMToken::Identifier)) { 2422 ParsedModuleId.push_back(std::make_pair(Tok.getString(), 2423 Tok.getLocation())); 2424 consumeToken(); 2425 2426 if (Tok.is(MMToken::Period)) { 2427 consumeToken(); 2428 continue; 2429 } 2430 2431 break; 2432 } 2433 2434 if(Tok.is(MMToken::Star)) { 2435 Wildcard = true; 2436 consumeToken(); 2437 break; 2438 } 2439 2440 Diags.Report(Tok.getLocation(), diag::err_mmap_module_id); 2441 HadError = true; 2442 return; 2443 } while (true); 2444 2445 Module::UnresolvedExportDecl Unresolved = { 2446 ExportLoc, ParsedModuleId, Wildcard 2447 }; 2448 ActiveModule->UnresolvedExports.push_back(Unresolved); 2449 } 2450 2451 /// Parse a module export_as declaration. 2452 /// 2453 /// export-as-declaration: 2454 /// 'export_as' identifier 2455 void ModuleMapParser::parseExportAsDecl() { 2456 assert(Tok.is(MMToken::ExportAsKeyword)); 2457 consumeToken(); 2458 2459 if (!Tok.is(MMToken::Identifier)) { 2460 Diags.Report(Tok.getLocation(), diag::err_mmap_module_id); 2461 HadError = true; 2462 return; 2463 } 2464 2465 if (ActiveModule->Parent) { 2466 Diags.Report(Tok.getLocation(), diag::err_mmap_submodule_export_as); 2467 consumeToken(); 2468 return; 2469 } 2470 2471 if (!ActiveModule->ExportAsModule.empty()) { 2472 if (ActiveModule->ExportAsModule == Tok.getString()) { 2473 Diags.Report(Tok.getLocation(), diag::warn_mmap_redundant_export_as) 2474 << ActiveModule->Name << Tok.getString(); 2475 } else { 2476 Diags.Report(Tok.getLocation(), diag::err_mmap_conflicting_export_as) 2477 << ActiveModule->Name << ActiveModule->ExportAsModule 2478 << Tok.getString(); 2479 } 2480 } 2481 2482 ActiveModule->ExportAsModule = Tok.getString(); 2483 Map.addLinkAsDependency(ActiveModule); 2484 2485 consumeToken(); 2486 } 2487 2488 /// Parse a module use declaration. 2489 /// 2490 /// use-declaration: 2491 /// 'use' wildcard-module-id 2492 void ModuleMapParser::parseUseDecl() { 2493 assert(Tok.is(MMToken::UseKeyword)); 2494 auto KWLoc = consumeToken(); 2495 // Parse the module-id. 2496 ModuleId ParsedModuleId; 2497 parseModuleId(ParsedModuleId); 2498 2499 if (ActiveModule->Parent) 2500 Diags.Report(KWLoc, diag::err_mmap_use_decl_submodule); 2501 else 2502 ActiveModule->UnresolvedDirectUses.push_back(ParsedModuleId); 2503 } 2504 2505 /// Parse a link declaration. 2506 /// 2507 /// module-declaration: 2508 /// 'link' 'framework'[opt] string-literal 2509 void ModuleMapParser::parseLinkDecl() { 2510 assert(Tok.is(MMToken::LinkKeyword)); 2511 SourceLocation LinkLoc = consumeToken(); 2512 2513 // Parse the optional 'framework' keyword. 2514 bool IsFramework = false; 2515 if (Tok.is(MMToken::FrameworkKeyword)) { 2516 consumeToken(); 2517 IsFramework = true; 2518 } 2519 2520 // Parse the library name 2521 if (!Tok.is(MMToken::StringLiteral)) { 2522 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_library_name) 2523 << IsFramework << SourceRange(LinkLoc); 2524 HadError = true; 2525 return; 2526 } 2527 2528 std::string LibraryName = Tok.getString(); 2529 consumeToken(); 2530 ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName, 2531 IsFramework)); 2532 } 2533 2534 /// Parse a configuration macro declaration. 2535 /// 2536 /// module-declaration: 2537 /// 'config_macros' attributes[opt] config-macro-list? 2538 /// 2539 /// config-macro-list: 2540 /// identifier (',' identifier)? 2541 void ModuleMapParser::parseConfigMacros() { 2542 assert(Tok.is(MMToken::ConfigMacros)); 2543 SourceLocation ConfigMacrosLoc = consumeToken(); 2544 2545 // Only top-level modules can have configuration macros. 2546 if (ActiveModule->Parent) { 2547 Diags.Report(ConfigMacrosLoc, diag::err_mmap_config_macro_submodule); 2548 } 2549 2550 // Parse the optional attributes. 2551 Attributes Attrs; 2552 if (parseOptionalAttributes(Attrs)) 2553 return; 2554 2555 if (Attrs.IsExhaustive && !ActiveModule->Parent) { 2556 ActiveModule->ConfigMacrosExhaustive = true; 2557 } 2558 2559 // If we don't have an identifier, we're done. 2560 // FIXME: Support macros with the same name as a keyword here. 2561 if (!Tok.is(MMToken::Identifier)) 2562 return; 2563 2564 // Consume the first identifier. 2565 if (!ActiveModule->Parent) { 2566 ActiveModule->ConfigMacros.push_back(Tok.getString().str()); 2567 } 2568 consumeToken(); 2569 2570 do { 2571 // If there's a comma, consume it. 2572 if (!Tok.is(MMToken::Comma)) 2573 break; 2574 consumeToken(); 2575 2576 // We expect to see a macro name here. 2577 // FIXME: Support macros with the same name as a keyword here. 2578 if (!Tok.is(MMToken::Identifier)) { 2579 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_config_macro); 2580 break; 2581 } 2582 2583 // Consume the macro name. 2584 if (!ActiveModule->Parent) { 2585 ActiveModule->ConfigMacros.push_back(Tok.getString().str()); 2586 } 2587 consumeToken(); 2588 } while (true); 2589 } 2590 2591 /// Format a module-id into a string. 2592 static std::string formatModuleId(const ModuleId &Id) { 2593 std::string result; 2594 { 2595 llvm::raw_string_ostream OS(result); 2596 2597 for (unsigned I = 0, N = Id.size(); I != N; ++I) { 2598 if (I) 2599 OS << "."; 2600 OS << Id[I].first; 2601 } 2602 } 2603 2604 return result; 2605 } 2606 2607 /// Parse a conflict declaration. 2608 /// 2609 /// module-declaration: 2610 /// 'conflict' module-id ',' string-literal 2611 void ModuleMapParser::parseConflict() { 2612 assert(Tok.is(MMToken::Conflict)); 2613 SourceLocation ConflictLoc = consumeToken(); 2614 Module::UnresolvedConflict Conflict; 2615 2616 // Parse the module-id. 2617 if (parseModuleId(Conflict.Id)) 2618 return; 2619 2620 // Parse the ','. 2621 if (!Tok.is(MMToken::Comma)) { 2622 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_comma) 2623 << SourceRange(ConflictLoc); 2624 return; 2625 } 2626 consumeToken(); 2627 2628 // Parse the message. 2629 if (!Tok.is(MMToken::StringLiteral)) { 2630 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_message) 2631 << formatModuleId(Conflict.Id); 2632 return; 2633 } 2634 Conflict.Message = Tok.getString().str(); 2635 consumeToken(); 2636 2637 // Add this unresolved conflict. 2638 ActiveModule->UnresolvedConflicts.push_back(Conflict); 2639 } 2640 2641 /// Parse an inferred module declaration (wildcard modules). 2642 /// 2643 /// module-declaration: 2644 /// 'explicit'[opt] 'framework'[opt] 'module' * attributes[opt] 2645 /// { inferred-module-member* } 2646 /// 2647 /// inferred-module-member: 2648 /// 'export' '*' 2649 /// 'exclude' identifier 2650 void ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) { 2651 assert(Tok.is(MMToken::Star)); 2652 SourceLocation StarLoc = consumeToken(); 2653 bool Failed = false; 2654 2655 // Inferred modules must be submodules. 2656 if (!ActiveModule && !Framework) { 2657 Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule); 2658 Failed = true; 2659 } 2660 2661 if (ActiveModule) { 2662 // Inferred modules must have umbrella directories. 2663 if (!Failed && ActiveModule->IsAvailable && 2664 !ActiveModule->getUmbrellaDir()) { 2665 Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella); 2666 Failed = true; 2667 } 2668 2669 // Check for redefinition of an inferred module. 2670 if (!Failed && ActiveModule->InferSubmodules) { 2671 Diags.Report(StarLoc, diag::err_mmap_inferred_redef); 2672 if (ActiveModule->InferredSubmoduleLoc.isValid()) 2673 Diags.Report(ActiveModule->InferredSubmoduleLoc, 2674 diag::note_mmap_prev_definition); 2675 Failed = true; 2676 } 2677 2678 // Check for the 'framework' keyword, which is not permitted here. 2679 if (Framework) { 2680 Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule); 2681 Framework = false; 2682 } 2683 } else if (Explicit) { 2684 Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework); 2685 Explicit = false; 2686 } 2687 2688 // If there were any problems with this inferred submodule, skip its body. 2689 if (Failed) { 2690 if (Tok.is(MMToken::LBrace)) { 2691 consumeToken(); 2692 skipUntil(MMToken::RBrace); 2693 if (Tok.is(MMToken::RBrace)) 2694 consumeToken(); 2695 } 2696 HadError = true; 2697 return; 2698 } 2699 2700 // Parse optional attributes. 2701 Attributes Attrs; 2702 if (parseOptionalAttributes(Attrs)) 2703 return; 2704 2705 if (ActiveModule) { 2706 // Note that we have an inferred submodule. 2707 ActiveModule->InferSubmodules = true; 2708 ActiveModule->InferredSubmoduleLoc = StarLoc; 2709 ActiveModule->InferExplicitSubmodules = Explicit; 2710 } else { 2711 // We'll be inferring framework modules for this directory. 2712 Map.InferredDirectories[Directory].InferModules = true; 2713 Map.InferredDirectories[Directory].Attrs = Attrs; 2714 Map.InferredDirectories[Directory].ModuleMapFile = ModuleMapFile; 2715 // FIXME: Handle the 'framework' keyword. 2716 } 2717 2718 // Parse the opening brace. 2719 if (!Tok.is(MMToken::LBrace)) { 2720 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard); 2721 HadError = true; 2722 return; 2723 } 2724 SourceLocation LBraceLoc = consumeToken(); 2725 2726 // Parse the body of the inferred submodule. 2727 bool Done = false; 2728 do { 2729 switch (Tok.Kind) { 2730 case MMToken::EndOfFile: 2731 case MMToken::RBrace: 2732 Done = true; 2733 break; 2734 2735 case MMToken::ExcludeKeyword: 2736 if (ActiveModule) { 2737 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 2738 << (ActiveModule != nullptr); 2739 consumeToken(); 2740 break; 2741 } 2742 2743 consumeToken(); 2744 // FIXME: Support string-literal module names here. 2745 if (!Tok.is(MMToken::Identifier)) { 2746 Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name); 2747 break; 2748 } 2749 2750 Map.InferredDirectories[Directory].ExcludedModules 2751 .push_back(Tok.getString()); 2752 consumeToken(); 2753 break; 2754 2755 case MMToken::ExportKeyword: 2756 if (!ActiveModule) { 2757 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 2758 << (ActiveModule != nullptr); 2759 consumeToken(); 2760 break; 2761 } 2762 2763 consumeToken(); 2764 if (Tok.is(MMToken::Star)) 2765 ActiveModule->InferExportWildcard = true; 2766 else 2767 Diags.Report(Tok.getLocation(), 2768 diag::err_mmap_expected_export_wildcard); 2769 consumeToken(); 2770 break; 2771 2772 case MMToken::ExplicitKeyword: 2773 case MMToken::ModuleKeyword: 2774 case MMToken::HeaderKeyword: 2775 case MMToken::PrivateKeyword: 2776 case MMToken::UmbrellaKeyword: 2777 default: 2778 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 2779 << (ActiveModule != nullptr); 2780 consumeToken(); 2781 break; 2782 } 2783 } while (!Done); 2784 2785 if (Tok.is(MMToken::RBrace)) 2786 consumeToken(); 2787 else { 2788 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 2789 Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 2790 HadError = true; 2791 } 2792 } 2793 2794 /// Parse optional attributes. 2795 /// 2796 /// attributes: 2797 /// attribute attributes 2798 /// attribute 2799 /// 2800 /// attribute: 2801 /// [ identifier ] 2802 /// 2803 /// \param Attrs Will be filled in with the parsed attributes. 2804 /// 2805 /// \returns true if an error occurred, false otherwise. 2806 bool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) { 2807 bool HadError = false; 2808 2809 while (Tok.is(MMToken::LSquare)) { 2810 // Consume the '['. 2811 SourceLocation LSquareLoc = consumeToken(); 2812 2813 // Check whether we have an attribute name here. 2814 if (!Tok.is(MMToken::Identifier)) { 2815 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute); 2816 skipUntil(MMToken::RSquare); 2817 if (Tok.is(MMToken::RSquare)) 2818 consumeToken(); 2819 HadError = true; 2820 } 2821 2822 // Decode the attribute name. 2823 AttributeKind Attribute 2824 = llvm::StringSwitch<AttributeKind>(Tok.getString()) 2825 .Case("exhaustive", AT_exhaustive) 2826 .Case("extern_c", AT_extern_c) 2827 .Case("no_undeclared_includes", AT_no_undeclared_includes) 2828 .Case("system", AT_system) 2829 .Default(AT_unknown); 2830 switch (Attribute) { 2831 case AT_unknown: 2832 Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute) 2833 << Tok.getString(); 2834 break; 2835 2836 case AT_system: 2837 Attrs.IsSystem = true; 2838 break; 2839 2840 case AT_extern_c: 2841 Attrs.IsExternC = true; 2842 break; 2843 2844 case AT_exhaustive: 2845 Attrs.IsExhaustive = true; 2846 break; 2847 2848 case AT_no_undeclared_includes: 2849 Attrs.NoUndeclaredIncludes = true; 2850 break; 2851 } 2852 consumeToken(); 2853 2854 // Consume the ']'. 2855 if (!Tok.is(MMToken::RSquare)) { 2856 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare); 2857 Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match); 2858 skipUntil(MMToken::RSquare); 2859 HadError = true; 2860 } 2861 2862 if (Tok.is(MMToken::RSquare)) 2863 consumeToken(); 2864 } 2865 2866 return HadError; 2867 } 2868 2869 /// Parse a module map file. 2870 /// 2871 /// module-map-file: 2872 /// module-declaration* 2873 bool ModuleMapParser::parseModuleMapFile() { 2874 do { 2875 switch (Tok.Kind) { 2876 case MMToken::EndOfFile: 2877 return HadError; 2878 2879 case MMToken::ExplicitKeyword: 2880 case MMToken::ExternKeyword: 2881 case MMToken::ModuleKeyword: 2882 case MMToken::FrameworkKeyword: 2883 parseModuleDecl(); 2884 break; 2885 2886 case MMToken::Comma: 2887 case MMToken::ConfigMacros: 2888 case MMToken::Conflict: 2889 case MMToken::Exclaim: 2890 case MMToken::ExcludeKeyword: 2891 case MMToken::ExportKeyword: 2892 case MMToken::ExportAsKeyword: 2893 case MMToken::HeaderKeyword: 2894 case MMToken::Identifier: 2895 case MMToken::LBrace: 2896 case MMToken::LinkKeyword: 2897 case MMToken::LSquare: 2898 case MMToken::Period: 2899 case MMToken::PrivateKeyword: 2900 case MMToken::RBrace: 2901 case MMToken::RSquare: 2902 case MMToken::RequiresKeyword: 2903 case MMToken::Star: 2904 case MMToken::StringLiteral: 2905 case MMToken::IntegerLiteral: 2906 case MMToken::TextualKeyword: 2907 case MMToken::UmbrellaKeyword: 2908 case MMToken::UseKeyword: 2909 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 2910 HadError = true; 2911 consumeToken(); 2912 break; 2913 } 2914 } while (true); 2915 } 2916 2917 bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem, 2918 const DirectoryEntry *Dir, FileID ID, 2919 unsigned *Offset, 2920 SourceLocation ExternModuleLoc) { 2921 assert(Target && "Missing target information"); 2922 llvm::DenseMap<const FileEntry *, bool>::iterator Known 2923 = ParsedModuleMap.find(File); 2924 if (Known != ParsedModuleMap.end()) 2925 return Known->second; 2926 2927 // If the module map file wasn't already entered, do so now. 2928 if (ID.isInvalid()) { 2929 auto FileCharacter = 2930 IsSystem ? SrcMgr::C_System_ModuleMap : SrcMgr::C_User_ModuleMap; 2931 ID = SourceMgr.createFileID(File, ExternModuleLoc, FileCharacter); 2932 } 2933 2934 assert(Target && "Missing target information"); 2935 const llvm::MemoryBuffer *Buffer = SourceMgr.getBuffer(ID); 2936 if (!Buffer) 2937 return ParsedModuleMap[File] = true; 2938 assert((!Offset || *Offset <= Buffer->getBufferSize()) && 2939 "invalid buffer offset"); 2940 2941 // Parse this module map file. 2942 Lexer L(SourceMgr.getLocForStartOfFile(ID), MMapLangOpts, 2943 Buffer->getBufferStart(), 2944 Buffer->getBufferStart() + (Offset ? *Offset : 0), 2945 Buffer->getBufferEnd()); 2946 SourceLocation Start = L.getSourceLocation(); 2947 ModuleMapParser Parser(L, SourceMgr, Target, Diags, *this, File, Dir, 2948 IsSystem); 2949 bool Result = Parser.parseModuleMapFile(); 2950 ParsedModuleMap[File] = Result; 2951 2952 if (Offset) { 2953 auto Loc = SourceMgr.getDecomposedLoc(Parser.getLocation()); 2954 assert(Loc.first == ID && "stopped in a different file?"); 2955 *Offset = Loc.second; 2956 } 2957 2958 // Notify callbacks that we parsed it. 2959 for (const auto &Cb : Callbacks) 2960 Cb->moduleMapFileRead(Start, *File, IsSystem); 2961 2962 return Result; 2963 } 2964