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