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