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 (llvm::StringMap<Module *>::iterator I = Modules.begin(), 98 IEnd = Modules.end(); 99 I != IEnd; ++I) { 100 delete I->getValue(); 101 } 102 } 103 104 void ModuleMap::setTarget(const TargetInfo &Target) { 105 assert((!this->Target || this->Target == &Target) && 106 "Improper target override"); 107 this->Target = &Target; 108 } 109 110 /// \brief "Sanitize" a filename so that it can be used as an identifier. 111 static StringRef sanitizeFilenameAsIdentifier(StringRef Name, 112 SmallVectorImpl<char> &Buffer) { 113 if (Name.empty()) 114 return Name; 115 116 if (!isValidIdentifier(Name)) { 117 // If we don't already have something with the form of an identifier, 118 // create a buffer with the sanitized name. 119 Buffer.clear(); 120 if (isDigit(Name[0])) 121 Buffer.push_back('_'); 122 Buffer.reserve(Buffer.size() + Name.size()); 123 for (unsigned I = 0, N = Name.size(); I != N; ++I) { 124 if (isIdentifierBody(Name[I])) 125 Buffer.push_back(Name[I]); 126 else 127 Buffer.push_back('_'); 128 } 129 130 Name = StringRef(Buffer.data(), Buffer.size()); 131 } 132 133 while (llvm::StringSwitch<bool>(Name) 134 #define KEYWORD(Keyword,Conditions) .Case(#Keyword, true) 135 #define ALIAS(Keyword, AliasOf, Conditions) .Case(Keyword, true) 136 #include "clang/Basic/TokenKinds.def" 137 .Default(false)) { 138 if (Name.data() != Buffer.data()) 139 Buffer.append(Name.begin(), Name.end()); 140 Buffer.push_back('_'); 141 Name = StringRef(Buffer.data(), Buffer.size()); 142 } 143 144 return Name; 145 } 146 147 /// \brief Determine whether the given file name is the name of a builtin 148 /// header, supplied by Clang to replace, override, or augment existing system 149 /// headers. 150 static bool isBuiltinHeader(StringRef FileName) { 151 return llvm::StringSwitch<bool>(FileName) 152 .Case("float.h", true) 153 .Case("iso646.h", true) 154 .Case("limits.h", true) 155 .Case("stdalign.h", true) 156 .Case("stdarg.h", true) 157 .Case("stdbool.h", true) 158 .Case("stddef.h", true) 159 .Case("stdint.h", true) 160 .Case("tgmath.h", true) 161 .Case("unwind.h", true) 162 .Default(false); 163 } 164 165 ModuleMap::HeadersMap::iterator 166 ModuleMap::findKnownHeader(const FileEntry *File) { 167 HeadersMap::iterator Known = Headers.find(File); 168 if (HeaderInfo.getHeaderSearchOpts().ImplicitModuleMaps && 169 Known == Headers.end() && File->getDir() == BuiltinIncludeDir && 170 isBuiltinHeader(llvm::sys::path::filename(File->getName()))) { 171 HeaderInfo.loadTopLevelSystemModules(); 172 return Headers.find(File); 173 } 174 return Known; 175 } 176 177 ModuleMap::KnownHeader 178 ModuleMap::findHeaderInUmbrellaDirs(const FileEntry *File, 179 SmallVectorImpl<const DirectoryEntry *> &IntermediateDirs) { 180 if (UmbrellaDirs.empty()) 181 return KnownHeader(); 182 183 const DirectoryEntry *Dir = File->getDir(); 184 assert(Dir && "file in no directory"); 185 186 // Note: as an egregious but useful hack we use the real path here, because 187 // frameworks moving from top-level frameworks to embedded frameworks tend 188 // to be symlinked from the top-level location to the embedded location, 189 // and we need to resolve lookups as if we had found the embedded location. 190 StringRef DirName = SourceMgr.getFileManager().getCanonicalName(Dir); 191 192 // Keep walking up the directory hierarchy, looking for a directory with 193 // an umbrella header. 194 do { 195 auto KnownDir = UmbrellaDirs.find(Dir); 196 if (KnownDir != UmbrellaDirs.end()) 197 return KnownHeader(KnownDir->second, NormalHeader); 198 199 IntermediateDirs.push_back(Dir); 200 201 // Retrieve our parent path. 202 DirName = llvm::sys::path::parent_path(DirName); 203 if (DirName.empty()) 204 break; 205 206 // Resolve the parent path to a directory entry. 207 Dir = SourceMgr.getFileManager().getDirectory(DirName); 208 } while (Dir); 209 return KnownHeader(); 210 } 211 212 static bool violatesPrivateInclude(Module *RequestingModule, 213 const FileEntry *IncFileEnt, 214 ModuleMap::ModuleHeaderRole Role, 215 Module *RequestedModule) { 216 bool IsPrivateRole = Role & ModuleMap::PrivateHeader; 217 #ifndef NDEBUG 218 if (IsPrivateRole) { 219 // Check for consistency between the module header role 220 // as obtained from the lookup and as obtained from the module. 221 // This check is not cheap, so enable it only for debugging. 222 bool IsPrivate = false; 223 SmallVectorImpl<Module::Header> *HeaderList[] = { 224 &RequestedModule->Headers[Module::HK_Private], 225 &RequestedModule->Headers[Module::HK_PrivateTextual]}; 226 for (auto *Hs : HeaderList) 227 IsPrivate |= 228 std::find_if(Hs->begin(), Hs->end(), [&](const Module::Header &H) { 229 return H.Entry == IncFileEnt; 230 }) != Hs->end(); 231 assert((!IsPrivateRole || IsPrivate) && "inconsistent headers and roles"); 232 } 233 #endif 234 return IsPrivateRole && (!RequestingModule || 235 RequestedModule->getTopLevelModule() != 236 RequestingModule->getTopLevelModule()); 237 } 238 239 static Module *getTopLevelOrNull(Module *M) { 240 return M ? M->getTopLevelModule() : nullptr; 241 } 242 243 void ModuleMap::diagnoseHeaderInclusion(Module *RequestingModule, 244 SourceLocation FilenameLoc, 245 StringRef Filename, 246 const FileEntry *File) { 247 // No errors for indirect modules. This may be a bit of a problem for modules 248 // with no source files. 249 if (getTopLevelOrNull(RequestingModule) != getTopLevelOrNull(SourceModule)) 250 return; 251 252 if (RequestingModule) 253 resolveUses(RequestingModule, /*Complain=*/false); 254 255 bool Excluded = false; 256 Module *Private = nullptr; 257 Module *NotUsed = nullptr; 258 259 HeadersMap::iterator Known = findKnownHeader(File); 260 if (Known != Headers.end()) { 261 for (const KnownHeader &Header : Known->second) { 262 // Remember private headers for later printing of a diagnostic. 263 if (violatesPrivateInclude(RequestingModule, File, Header.getRole(), 264 Header.getModule())) { 265 Private = Header.getModule(); 266 continue; 267 } 268 269 // If uses need to be specified explicitly, we are only allowed to return 270 // modules that are explicitly used by the requesting module. 271 if (RequestingModule && LangOpts.ModulesDeclUse && 272 !RequestingModule->directlyUses(Header.getModule())) { 273 NotUsed = Header.getModule(); 274 continue; 275 } 276 277 // We have found a module that we can happily use. 278 return; 279 } 280 281 Excluded = true; 282 } 283 284 // We have found a header, but it is private. 285 if (Private) { 286 Diags.Report(FilenameLoc, diag::warn_use_of_private_header_outside_module) 287 << Filename; 288 return; 289 } 290 291 // We have found a module, but we don't use it. 292 if (NotUsed) { 293 Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module) 294 << RequestingModule->getFullModuleName() << Filename; 295 return; 296 } 297 298 if (Excluded || isHeaderInUmbrellaDirs(File)) 299 return; 300 301 // At this point, only non-modular includes remain. 302 303 if (LangOpts.ModulesStrictDeclUse) { 304 Diags.Report(FilenameLoc, diag::err_undeclared_use_of_module) 305 << RequestingModule->getFullModuleName() << Filename; 306 } else if (RequestingModule) { 307 diag::kind DiagID = RequestingModule->getTopLevelModule()->IsFramework ? 308 diag::warn_non_modular_include_in_framework_module : 309 diag::warn_non_modular_include_in_module; 310 Diags.Report(FilenameLoc, DiagID) << RequestingModule->getFullModuleName(); 311 } 312 } 313 314 static bool isBetterKnownHeader(const ModuleMap::KnownHeader &New, 315 const ModuleMap::KnownHeader &Old) { 316 // Prefer available modules. 317 if (New.getModule()->isAvailable() && !Old.getModule()->isAvailable()) 318 return true; 319 320 // Prefer a public header over a private header. 321 if ((New.getRole() & ModuleMap::PrivateHeader) != 322 (Old.getRole() & ModuleMap::PrivateHeader)) 323 return !(New.getRole() & ModuleMap::PrivateHeader); 324 325 // Prefer a non-textual header over a textual header. 326 if ((New.getRole() & ModuleMap::TextualHeader) != 327 (Old.getRole() & ModuleMap::TextualHeader)) 328 return !(New.getRole() & ModuleMap::TextualHeader); 329 330 // Don't have a reason to choose between these. Just keep the first one. 331 return false; 332 } 333 334 ModuleMap::KnownHeader ModuleMap::findModuleForHeader(const FileEntry *File) { 335 auto MakeResult = [&](ModuleMap::KnownHeader R) -> ModuleMap::KnownHeader { 336 if (R.getRole() & ModuleMap::TextualHeader) 337 return ModuleMap::KnownHeader(); 338 return R; 339 }; 340 341 HeadersMap::iterator Known = findKnownHeader(File); 342 if (Known != Headers.end()) { 343 ModuleMap::KnownHeader Result; 344 // Iterate over all modules that 'File' is part of to find the best fit. 345 for (KnownHeader &H : Known->second) { 346 // Prefer a header from the source module over all others. 347 if (H.getModule()->getTopLevelModule() == SourceModule) 348 return MakeResult(H); 349 if (!Result || isBetterKnownHeader(H, Result)) 350 Result = H; 351 } 352 return MakeResult(Result); 353 } 354 355 return MakeResult(findOrCreateModuleForHeaderInUmbrellaDir(File)); 356 } 357 358 ModuleMap::KnownHeader 359 ModuleMap::findOrCreateModuleForHeaderInUmbrellaDir(const FileEntry *File) { 360 assert(!Headers.count(File) && "already have a module for this header"); 361 362 SmallVector<const DirectoryEntry *, 2> SkippedDirs; 363 KnownHeader H = findHeaderInUmbrellaDirs(File, SkippedDirs); 364 if (H) { 365 Module *Result = H.getModule(); 366 367 // Search up the module stack until we find a module with an umbrella 368 // directory. 369 Module *UmbrellaModule = Result; 370 while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent) 371 UmbrellaModule = UmbrellaModule->Parent; 372 373 if (UmbrellaModule->InferSubmodules) { 374 const FileEntry *UmbrellaModuleMap = 375 getModuleMapFileForUniquing(UmbrellaModule); 376 377 // Infer submodules for each of the directories we found between 378 // the directory of the umbrella header and the directory where 379 // the actual header is located. 380 bool Explicit = UmbrellaModule->InferExplicitSubmodules; 381 382 for (unsigned I = SkippedDirs.size(); I != 0; --I) { 383 // Find or create the module that corresponds to this directory name. 384 SmallString<32> NameBuf; 385 StringRef Name = sanitizeFilenameAsIdentifier( 386 llvm::sys::path::stem(SkippedDirs[I-1]->getName()), NameBuf); 387 Result = findOrCreateModule(Name, Result, /*IsFramework=*/false, 388 Explicit).first; 389 InferredModuleAllowedBy[Result] = UmbrellaModuleMap; 390 Result->IsInferred = true; 391 392 // Associate the module and the directory. 393 UmbrellaDirs[SkippedDirs[I-1]] = Result; 394 395 // If inferred submodules export everything they import, add a 396 // wildcard to the set of exports. 397 if (UmbrellaModule->InferExportWildcard && Result->Exports.empty()) 398 Result->Exports.push_back(Module::ExportDecl(nullptr, true)); 399 } 400 401 // Infer a submodule with the same name as this header file. 402 SmallString<32> NameBuf; 403 StringRef Name = sanitizeFilenameAsIdentifier( 404 llvm::sys::path::stem(File->getName()), NameBuf); 405 Result = findOrCreateModule(Name, Result, /*IsFramework=*/false, 406 Explicit).first; 407 InferredModuleAllowedBy[Result] = UmbrellaModuleMap; 408 Result->IsInferred = true; 409 Result->addTopHeader(File); 410 411 // If inferred submodules export everything they import, add a 412 // wildcard to the set of exports. 413 if (UmbrellaModule->InferExportWildcard && Result->Exports.empty()) 414 Result->Exports.push_back(Module::ExportDecl(nullptr, true)); 415 } else { 416 // Record each of the directories we stepped through as being part of 417 // the module we found, since the umbrella header covers them all. 418 for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I) 419 UmbrellaDirs[SkippedDirs[I]] = Result; 420 } 421 422 KnownHeader Header(Result, NormalHeader); 423 Headers[File].push_back(Header); 424 return Header; 425 } 426 427 return KnownHeader(); 428 } 429 430 ArrayRef<ModuleMap::KnownHeader> 431 ModuleMap::findAllModulesForHeader(const FileEntry *File) const { 432 auto It = Headers.find(File); 433 if (It == Headers.end()) 434 return None; 435 return It->second; 436 } 437 438 bool ModuleMap::isHeaderInUnavailableModule(const FileEntry *Header) const { 439 return isHeaderUnavailableInModule(Header, nullptr); 440 } 441 442 bool 443 ModuleMap::isHeaderUnavailableInModule(const FileEntry *Header, 444 const Module *RequestingModule) const { 445 HeadersMap::const_iterator Known = Headers.find(Header); 446 if (Known != Headers.end()) { 447 for (SmallVectorImpl<KnownHeader>::const_iterator 448 I = Known->second.begin(), 449 E = Known->second.end(); 450 I != E; ++I) { 451 if (I->isAvailable() && (!RequestingModule || 452 I->getModule()->isSubModuleOf(RequestingModule))) 453 return false; 454 } 455 return true; 456 } 457 458 const DirectoryEntry *Dir = Header->getDir(); 459 SmallVector<const DirectoryEntry *, 2> SkippedDirs; 460 StringRef DirName = Dir->getName(); 461 462 auto IsUnavailable = [&](const Module *M) { 463 return !M->isAvailable() && (!RequestingModule || 464 M->isSubModuleOf(RequestingModule)); 465 }; 466 467 // Keep walking up the directory hierarchy, looking for a directory with 468 // an umbrella header. 469 do { 470 llvm::DenseMap<const DirectoryEntry *, Module *>::const_iterator KnownDir 471 = UmbrellaDirs.find(Dir); 472 if (KnownDir != UmbrellaDirs.end()) { 473 Module *Found = KnownDir->second; 474 if (IsUnavailable(Found)) 475 return true; 476 477 // Search up the module stack until we find a module with an umbrella 478 // directory. 479 Module *UmbrellaModule = Found; 480 while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent) 481 UmbrellaModule = UmbrellaModule->Parent; 482 483 if (UmbrellaModule->InferSubmodules) { 484 for (unsigned I = SkippedDirs.size(); I != 0; --I) { 485 // Find or create the module that corresponds to this directory name. 486 SmallString<32> NameBuf; 487 StringRef Name = sanitizeFilenameAsIdentifier( 488 llvm::sys::path::stem(SkippedDirs[I-1]->getName()), 489 NameBuf); 490 Found = lookupModuleQualified(Name, Found); 491 if (!Found) 492 return false; 493 if (IsUnavailable(Found)) 494 return true; 495 } 496 497 // Infer a submodule with the same name as this header file. 498 SmallString<32> NameBuf; 499 StringRef Name = sanitizeFilenameAsIdentifier( 500 llvm::sys::path::stem(Header->getName()), 501 NameBuf); 502 Found = lookupModuleQualified(Name, Found); 503 if (!Found) 504 return false; 505 } 506 507 return IsUnavailable(Found); 508 } 509 510 SkippedDirs.push_back(Dir); 511 512 // Retrieve our parent path. 513 DirName = llvm::sys::path::parent_path(DirName); 514 if (DirName.empty()) 515 break; 516 517 // Resolve the parent path to a directory entry. 518 Dir = SourceMgr.getFileManager().getDirectory(DirName); 519 } while (Dir); 520 521 return false; 522 } 523 524 Module *ModuleMap::findModule(StringRef Name) const { 525 llvm::StringMap<Module *>::const_iterator Known = Modules.find(Name); 526 if (Known != Modules.end()) 527 return Known->getValue(); 528 529 return nullptr; 530 } 531 532 Module *ModuleMap::lookupModuleUnqualified(StringRef Name, 533 Module *Context) const { 534 for(; Context; Context = Context->Parent) { 535 if (Module *Sub = lookupModuleQualified(Name, Context)) 536 return Sub; 537 } 538 539 return findModule(Name); 540 } 541 542 Module *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) const{ 543 if (!Context) 544 return findModule(Name); 545 546 return Context->findSubmodule(Name); 547 } 548 549 std::pair<Module *, bool> 550 ModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework, 551 bool IsExplicit) { 552 // Try to find an existing module with this name. 553 if (Module *Sub = lookupModuleQualified(Name, Parent)) 554 return std::make_pair(Sub, false); 555 556 // Create a new module with this name. 557 Module *Result = new Module(Name, SourceLocation(), Parent, 558 IsFramework, IsExplicit, NumCreatedModules++); 559 if (!Parent) { 560 if (LangOpts.CurrentModule == Name) 561 SourceModule = Result; 562 Modules[Name] = Result; 563 } 564 return std::make_pair(Result, true); 565 } 566 567 /// \brief For a framework module, infer the framework against which we 568 /// should link. 569 static void inferFrameworkLink(Module *Mod, const DirectoryEntry *FrameworkDir, 570 FileManager &FileMgr) { 571 assert(Mod->IsFramework && "Can only infer linking for framework modules"); 572 assert(!Mod->isSubFramework() && 573 "Can only infer linking for top-level frameworks"); 574 575 SmallString<128> LibName; 576 LibName += FrameworkDir->getName(); 577 llvm::sys::path::append(LibName, Mod->Name); 578 579 // The library name of a framework has more than one possible extension since 580 // the introduction of the text-based dynamic library format. We need to check 581 // for both before we give up. 582 static const char *frameworkExtensions[] = {"", ".tbd"}; 583 for (const auto *extension : frameworkExtensions) { 584 llvm::sys::path::replace_extension(LibName, extension); 585 if (FileMgr.getFile(LibName)) { 586 Mod->LinkLibraries.push_back(Module::LinkLibrary(Mod->Name, 587 /*IsFramework=*/true)); 588 return; 589 } 590 } 591 } 592 593 Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir, 594 bool IsSystem, Module *Parent) { 595 Attributes Attrs; 596 Attrs.IsSystem = IsSystem; 597 return inferFrameworkModule(FrameworkDir, Attrs, Parent); 598 } 599 600 Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir, 601 Attributes Attrs, Module *Parent) { 602 // Note: as an egregious but useful hack we use the real path here, because 603 // we might be looking at an embedded framework that symlinks out to a 604 // top-level framework, and we need to infer as if we were naming the 605 // top-level framework. 606 StringRef FrameworkDirName = 607 SourceMgr.getFileManager().getCanonicalName(FrameworkDir); 608 609 // In case this is a case-insensitive filesystem, use the canonical 610 // directory name as the ModuleName, since modules are case-sensitive. 611 // FIXME: we should be able to give a fix-it hint for the correct spelling. 612 SmallString<32> ModuleNameStorage; 613 StringRef ModuleName = sanitizeFilenameAsIdentifier( 614 llvm::sys::path::stem(FrameworkDirName), ModuleNameStorage); 615 616 // Check whether we've already found this module. 617 if (Module *Mod = lookupModuleQualified(ModuleName, Parent)) 618 return Mod; 619 620 FileManager &FileMgr = SourceMgr.getFileManager(); 621 622 // If the framework has a parent path from which we're allowed to infer 623 // a framework module, do so. 624 const FileEntry *ModuleMapFile = nullptr; 625 if (!Parent) { 626 // Determine whether we're allowed to infer a module map. 627 bool canInfer = false; 628 if (llvm::sys::path::has_parent_path(FrameworkDirName)) { 629 // Figure out the parent path. 630 StringRef Parent = llvm::sys::path::parent_path(FrameworkDirName); 631 if (const DirectoryEntry *ParentDir = FileMgr.getDirectory(Parent)) { 632 // Check whether we have already looked into the parent directory 633 // for a module map. 634 llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator 635 inferred = InferredDirectories.find(ParentDir); 636 if (inferred == InferredDirectories.end()) { 637 // We haven't looked here before. Load a module map, if there is 638 // one. 639 bool IsFrameworkDir = Parent.endswith(".framework"); 640 if (const FileEntry *ModMapFile = 641 HeaderInfo.lookupModuleMapFile(ParentDir, IsFrameworkDir)) { 642 parseModuleMapFile(ModMapFile, Attrs.IsSystem, ParentDir); 643 inferred = InferredDirectories.find(ParentDir); 644 } 645 646 if (inferred == InferredDirectories.end()) 647 inferred = InferredDirectories.insert( 648 std::make_pair(ParentDir, InferredDirectory())).first; 649 } 650 651 if (inferred->second.InferModules) { 652 // We're allowed to infer for this directory, but make sure it's okay 653 // to infer this particular module. 654 StringRef Name = llvm::sys::path::stem(FrameworkDirName); 655 canInfer = std::find(inferred->second.ExcludedModules.begin(), 656 inferred->second.ExcludedModules.end(), 657 Name) == inferred->second.ExcludedModules.end(); 658 659 Attrs.IsSystem |= inferred->second.Attrs.IsSystem; 660 Attrs.IsExternC |= inferred->second.Attrs.IsExternC; 661 Attrs.IsExhaustive |= inferred->second.Attrs.IsExhaustive; 662 ModuleMapFile = inferred->second.ModuleMapFile; 663 } 664 } 665 } 666 667 // If we're not allowed to infer a framework module, don't. 668 if (!canInfer) 669 return nullptr; 670 } else 671 ModuleMapFile = getModuleMapFileForUniquing(Parent); 672 673 674 // Look for an umbrella header. 675 SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName()); 676 llvm::sys::path::append(UmbrellaName, "Headers", ModuleName + ".h"); 677 const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName); 678 679 // FIXME: If there's no umbrella header, we could probably scan the 680 // framework to load *everything*. But, it's not clear that this is a good 681 // idea. 682 if (!UmbrellaHeader) 683 return nullptr; 684 685 Module *Result = new Module(ModuleName, SourceLocation(), Parent, 686 /*IsFramework=*/true, /*IsExplicit=*/false, 687 NumCreatedModules++); 688 InferredModuleAllowedBy[Result] = ModuleMapFile; 689 Result->IsInferred = true; 690 if (!Parent) { 691 if (LangOpts.CurrentModule == ModuleName) 692 SourceModule = Result; 693 Modules[ModuleName] = Result; 694 } 695 696 Result->IsSystem |= Attrs.IsSystem; 697 Result->IsExternC |= Attrs.IsExternC; 698 Result->ConfigMacrosExhaustive |= Attrs.IsExhaustive; 699 Result->Directory = FrameworkDir; 700 701 // umbrella header "umbrella-header-name" 702 // 703 // The "Headers/" component of the name is implied because this is 704 // a framework module. 705 setUmbrellaHeader(Result, UmbrellaHeader, ModuleName + ".h"); 706 707 // export * 708 Result->Exports.push_back(Module::ExportDecl(nullptr, true)); 709 710 // module * { export * } 711 Result->InferSubmodules = true; 712 Result->InferExportWildcard = true; 713 714 // Look for subframeworks. 715 std::error_code EC; 716 SmallString<128> SubframeworksDirName 717 = StringRef(FrameworkDir->getName()); 718 llvm::sys::path::append(SubframeworksDirName, "Frameworks"); 719 llvm::sys::path::native(SubframeworksDirName); 720 for (llvm::sys::fs::directory_iterator Dir(SubframeworksDirName, EC), DirEnd; 721 Dir != DirEnd && !EC; Dir.increment(EC)) { 722 if (!StringRef(Dir->path()).endswith(".framework")) 723 continue; 724 725 if (const DirectoryEntry *SubframeworkDir 726 = FileMgr.getDirectory(Dir->path())) { 727 // Note: as an egregious but useful hack, we use the real path here and 728 // check whether it is actually a subdirectory of the parent directory. 729 // This will not be the case if the 'subframework' is actually a symlink 730 // out to a top-level framework. 731 StringRef SubframeworkDirName = FileMgr.getCanonicalName(SubframeworkDir); 732 bool FoundParent = false; 733 do { 734 // Get the parent directory name. 735 SubframeworkDirName 736 = llvm::sys::path::parent_path(SubframeworkDirName); 737 if (SubframeworkDirName.empty()) 738 break; 739 740 if (FileMgr.getDirectory(SubframeworkDirName) == FrameworkDir) { 741 FoundParent = true; 742 break; 743 } 744 } while (true); 745 746 if (!FoundParent) 747 continue; 748 749 // FIXME: Do we want to warn about subframeworks without umbrella headers? 750 inferFrameworkModule(SubframeworkDir, Attrs, Result); 751 } 752 } 753 754 // If the module is a top-level framework, automatically link against the 755 // framework. 756 if (!Result->isSubFramework()) { 757 inferFrameworkLink(Result, FrameworkDir, FileMgr); 758 } 759 760 return Result; 761 } 762 763 void ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader, 764 Twine NameAsWritten) { 765 Headers[UmbrellaHeader].push_back(KnownHeader(Mod, NormalHeader)); 766 Mod->Umbrella = UmbrellaHeader; 767 Mod->UmbrellaAsWritten = NameAsWritten.str(); 768 UmbrellaDirs[UmbrellaHeader->getDir()] = Mod; 769 } 770 771 void ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir, 772 Twine NameAsWritten) { 773 Mod->Umbrella = UmbrellaDir; 774 Mod->UmbrellaAsWritten = NameAsWritten.str(); 775 UmbrellaDirs[UmbrellaDir] = Mod; 776 } 777 778 static Module::HeaderKind headerRoleToKind(ModuleMap::ModuleHeaderRole Role) { 779 switch ((int)Role) { 780 default: llvm_unreachable("unknown header role"); 781 case ModuleMap::NormalHeader: 782 return Module::HK_Normal; 783 case ModuleMap::PrivateHeader: 784 return Module::HK_Private; 785 case ModuleMap::TextualHeader: 786 return Module::HK_Textual; 787 case ModuleMap::PrivateHeader | ModuleMap::TextualHeader: 788 return Module::HK_PrivateTextual; 789 } 790 } 791 792 void ModuleMap::addHeader(Module *Mod, Module::Header Header, 793 ModuleHeaderRole Role, bool Imported) { 794 KnownHeader KH(Mod, Role); 795 796 // Only add each header to the headers list once. 797 // FIXME: Should we diagnose if a header is listed twice in the 798 // same module definition? 799 auto &HeaderList = Headers[Header.Entry]; 800 for (auto H : HeaderList) 801 if (H == KH) 802 return; 803 804 HeaderList.push_back(KH); 805 Mod->Headers[headerRoleToKind(Role)].push_back(std::move(Header)); 806 807 bool isCompilingModuleHeader = 808 LangOpts.CompilingModule && Mod->getTopLevelModule() == SourceModule; 809 if (!Imported || isCompilingModuleHeader) { 810 // When we import HeaderFileInfo, the external source is expected to 811 // set the isModuleHeader flag itself. 812 HeaderInfo.MarkFileModuleHeader(Header.Entry, Role, 813 isCompilingModuleHeader); 814 } 815 } 816 817 void ModuleMap::excludeHeader(Module *Mod, Module::Header Header) { 818 // Add this as a known header so we won't implicitly add it to any 819 // umbrella directory module. 820 // FIXME: Should we only exclude it from umbrella modules within the 821 // specified module? 822 (void) Headers[Header.Entry]; 823 824 Mod->Headers[Module::HK_Excluded].push_back(std::move(Header)); 825 } 826 827 const FileEntry * 828 ModuleMap::getContainingModuleMapFile(const Module *Module) const { 829 if (Module->DefinitionLoc.isInvalid()) 830 return nullptr; 831 832 return SourceMgr.getFileEntryForID( 833 SourceMgr.getFileID(Module->DefinitionLoc)); 834 } 835 836 const FileEntry *ModuleMap::getModuleMapFileForUniquing(const Module *M) const { 837 if (M->IsInferred) { 838 assert(InferredModuleAllowedBy.count(M) && "missing inferred module map"); 839 return InferredModuleAllowedBy.find(M)->second; 840 } 841 return getContainingModuleMapFile(M); 842 } 843 844 void ModuleMap::setInferredModuleAllowedBy(Module *M, const FileEntry *ModMap) { 845 assert(M->IsInferred && "module not inferred"); 846 InferredModuleAllowedBy[M] = ModMap; 847 } 848 849 LLVM_DUMP_METHOD void ModuleMap::dump() { 850 llvm::errs() << "Modules:"; 851 for (llvm::StringMap<Module *>::iterator M = Modules.begin(), 852 MEnd = Modules.end(); 853 M != MEnd; ++M) 854 M->getValue()->print(llvm::errs(), 2); 855 856 llvm::errs() << "Headers:"; 857 for (HeadersMap::iterator H = Headers.begin(), HEnd = Headers.end(); 858 H != HEnd; ++H) { 859 llvm::errs() << " \"" << H->first->getName() << "\" -> "; 860 for (SmallVectorImpl<KnownHeader>::const_iterator I = H->second.begin(), 861 E = H->second.end(); 862 I != E; ++I) { 863 if (I != H->second.begin()) 864 llvm::errs() << ","; 865 llvm::errs() << I->getModule()->getFullModuleName(); 866 } 867 llvm::errs() << "\n"; 868 } 869 } 870 871 bool ModuleMap::resolveExports(Module *Mod, bool Complain) { 872 auto Unresolved = std::move(Mod->UnresolvedExports); 873 Mod->UnresolvedExports.clear(); 874 for (auto &UE : Unresolved) { 875 Module::ExportDecl Export = resolveExport(Mod, UE, Complain); 876 if (Export.getPointer() || Export.getInt()) 877 Mod->Exports.push_back(Export); 878 else 879 Mod->UnresolvedExports.push_back(UE); 880 } 881 return !Mod->UnresolvedExports.empty(); 882 } 883 884 bool ModuleMap::resolveUses(Module *Mod, bool Complain) { 885 auto Unresolved = std::move(Mod->UnresolvedDirectUses); 886 Mod->UnresolvedDirectUses.clear(); 887 for (auto &UDU : Unresolved) { 888 Module *DirectUse = resolveModuleId(UDU, Mod, Complain); 889 if (DirectUse) 890 Mod->DirectUses.push_back(DirectUse); 891 else 892 Mod->UnresolvedDirectUses.push_back(UDU); 893 } 894 return !Mod->UnresolvedDirectUses.empty(); 895 } 896 897 bool ModuleMap::resolveConflicts(Module *Mod, bool Complain) { 898 auto Unresolved = std::move(Mod->UnresolvedConflicts); 899 Mod->UnresolvedConflicts.clear(); 900 for (auto &UC : Unresolved) { 901 if (Module *OtherMod = resolveModuleId(UC.Id, Mod, Complain)) { 902 Module::Conflict Conflict; 903 Conflict.Other = OtherMod; 904 Conflict.Message = UC.Message; 905 Mod->Conflicts.push_back(Conflict); 906 } else 907 Mod->UnresolvedConflicts.push_back(UC); 908 } 909 return !Mod->UnresolvedConflicts.empty(); 910 } 911 912 Module *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) { 913 if (Loc.isInvalid()) 914 return nullptr; 915 916 // Use the expansion location to determine which module we're in. 917 FullSourceLoc ExpansionLoc = Loc.getExpansionLoc(); 918 if (!ExpansionLoc.isFileID()) 919 return nullptr; 920 921 const SourceManager &SrcMgr = Loc.getManager(); 922 FileID ExpansionFileID = ExpansionLoc.getFileID(); 923 924 while (const FileEntry *ExpansionFile 925 = SrcMgr.getFileEntryForID(ExpansionFileID)) { 926 // Find the module that owns this header (if any). 927 if (Module *Mod = findModuleForHeader(ExpansionFile).getModule()) 928 return Mod; 929 930 // No module owns this header, so look up the inclusion chain to see if 931 // any included header has an associated module. 932 SourceLocation IncludeLoc = SrcMgr.getIncludeLoc(ExpansionFileID); 933 if (IncludeLoc.isInvalid()) 934 return nullptr; 935 936 ExpansionFileID = SrcMgr.getFileID(IncludeLoc); 937 } 938 939 return nullptr; 940 } 941 942 //----------------------------------------------------------------------------// 943 // Module map file parser 944 //----------------------------------------------------------------------------// 945 946 namespace clang { 947 /// \brief A token in a module map file. 948 struct MMToken { 949 enum TokenKind { 950 Comma, 951 ConfigMacros, 952 Conflict, 953 EndOfFile, 954 HeaderKeyword, 955 Identifier, 956 Exclaim, 957 ExcludeKeyword, 958 ExplicitKeyword, 959 ExportKeyword, 960 ExternKeyword, 961 FrameworkKeyword, 962 LinkKeyword, 963 ModuleKeyword, 964 Period, 965 PrivateKeyword, 966 UmbrellaKeyword, 967 UseKeyword, 968 RequiresKeyword, 969 Star, 970 StringLiteral, 971 TextualKeyword, 972 LBrace, 973 RBrace, 974 LSquare, 975 RSquare 976 } Kind; 977 978 unsigned Location; 979 unsigned StringLength; 980 const char *StringData; 981 982 void clear() { 983 Kind = EndOfFile; 984 Location = 0; 985 StringLength = 0; 986 StringData = nullptr; 987 } 988 989 bool is(TokenKind K) const { return Kind == K; } 990 991 SourceLocation getLocation() const { 992 return SourceLocation::getFromRawEncoding(Location); 993 } 994 995 StringRef getString() const { 996 return StringRef(StringData, StringLength); 997 } 998 }; 999 1000 class ModuleMapParser { 1001 Lexer &L; 1002 SourceManager &SourceMgr; 1003 1004 /// \brief Default target information, used only for string literal 1005 /// parsing. 1006 const TargetInfo *Target; 1007 1008 DiagnosticsEngine &Diags; 1009 ModuleMap ⤅ 1010 1011 /// \brief The current module map file. 1012 const FileEntry *ModuleMapFile; 1013 1014 /// \brief The directory that file names in this module map file should 1015 /// be resolved relative to. 1016 const DirectoryEntry *Directory; 1017 1018 /// \brief The directory containing Clang-supplied headers. 1019 const DirectoryEntry *BuiltinIncludeDir; 1020 1021 /// \brief Whether this module map is in a system header directory. 1022 bool IsSystem; 1023 1024 /// \brief Whether an error occurred. 1025 bool HadError; 1026 1027 /// \brief Stores string data for the various string literals referenced 1028 /// during parsing. 1029 llvm::BumpPtrAllocator StringData; 1030 1031 /// \brief The current token. 1032 MMToken Tok; 1033 1034 /// \brief The active module. 1035 Module *ActiveModule; 1036 1037 /// \brief Whether a module uses the 'requires excluded' hack to mark its 1038 /// contents as 'textual'. 1039 /// 1040 /// On older Darwin SDK versions, 'requires excluded' is used to mark the 1041 /// contents of the Darwin.C.excluded (assert.h) and Tcl.Private modules as 1042 /// non-modular headers. For backwards compatibility, we continue to 1043 /// support this idiom for just these modules, and map the headers to 1044 /// 'textual' to match the original intent. 1045 llvm::SmallPtrSet<Module *, 2> UsesRequiresExcludedHack; 1046 1047 /// \brief Consume the current token and return its location. 1048 SourceLocation consumeToken(); 1049 1050 /// \brief Skip tokens until we reach the a token with the given kind 1051 /// (or the end of the file). 1052 void skipUntil(MMToken::TokenKind K); 1053 1054 typedef SmallVector<std::pair<std::string, SourceLocation>, 2> ModuleId; 1055 bool parseModuleId(ModuleId &Id); 1056 void parseModuleDecl(); 1057 void parseExternModuleDecl(); 1058 void parseRequiresDecl(); 1059 void parseHeaderDecl(clang::MMToken::TokenKind, 1060 SourceLocation LeadingLoc); 1061 void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc); 1062 void parseExportDecl(); 1063 void parseUseDecl(); 1064 void parseLinkDecl(); 1065 void parseConfigMacros(); 1066 void parseConflict(); 1067 void parseInferredModuleDecl(bool Framework, bool Explicit); 1068 1069 typedef ModuleMap::Attributes Attributes; 1070 bool parseOptionalAttributes(Attributes &Attrs); 1071 1072 public: 1073 explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr, 1074 const TargetInfo *Target, 1075 DiagnosticsEngine &Diags, 1076 ModuleMap &Map, 1077 const FileEntry *ModuleMapFile, 1078 const DirectoryEntry *Directory, 1079 const DirectoryEntry *BuiltinIncludeDir, 1080 bool IsSystem) 1081 : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map), 1082 ModuleMapFile(ModuleMapFile), Directory(Directory), 1083 BuiltinIncludeDir(BuiltinIncludeDir), IsSystem(IsSystem), 1084 HadError(false), ActiveModule(nullptr) 1085 { 1086 Tok.clear(); 1087 consumeToken(); 1088 } 1089 1090 bool parseModuleMapFile(); 1091 }; 1092 } 1093 1094 SourceLocation ModuleMapParser::consumeToken() { 1095 retry: 1096 SourceLocation Result = Tok.getLocation(); 1097 Tok.clear(); 1098 1099 Token LToken; 1100 L.LexFromRawLexer(LToken); 1101 Tok.Location = LToken.getLocation().getRawEncoding(); 1102 switch (LToken.getKind()) { 1103 case tok::raw_identifier: { 1104 StringRef RI = LToken.getRawIdentifier(); 1105 Tok.StringData = RI.data(); 1106 Tok.StringLength = RI.size(); 1107 Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(RI) 1108 .Case("config_macros", MMToken::ConfigMacros) 1109 .Case("conflict", MMToken::Conflict) 1110 .Case("exclude", MMToken::ExcludeKeyword) 1111 .Case("explicit", MMToken::ExplicitKeyword) 1112 .Case("export", MMToken::ExportKeyword) 1113 .Case("extern", MMToken::ExternKeyword) 1114 .Case("framework", MMToken::FrameworkKeyword) 1115 .Case("header", MMToken::HeaderKeyword) 1116 .Case("link", MMToken::LinkKeyword) 1117 .Case("module", MMToken::ModuleKeyword) 1118 .Case("private", MMToken::PrivateKeyword) 1119 .Case("requires", MMToken::RequiresKeyword) 1120 .Case("textual", MMToken::TextualKeyword) 1121 .Case("umbrella", MMToken::UmbrellaKeyword) 1122 .Case("use", MMToken::UseKeyword) 1123 .Default(MMToken::Identifier); 1124 break; 1125 } 1126 1127 case tok::comma: 1128 Tok.Kind = MMToken::Comma; 1129 break; 1130 1131 case tok::eof: 1132 Tok.Kind = MMToken::EndOfFile; 1133 break; 1134 1135 case tok::l_brace: 1136 Tok.Kind = MMToken::LBrace; 1137 break; 1138 1139 case tok::l_square: 1140 Tok.Kind = MMToken::LSquare; 1141 break; 1142 1143 case tok::period: 1144 Tok.Kind = MMToken::Period; 1145 break; 1146 1147 case tok::r_brace: 1148 Tok.Kind = MMToken::RBrace; 1149 break; 1150 1151 case tok::r_square: 1152 Tok.Kind = MMToken::RSquare; 1153 break; 1154 1155 case tok::star: 1156 Tok.Kind = MMToken::Star; 1157 break; 1158 1159 case tok::exclaim: 1160 Tok.Kind = MMToken::Exclaim; 1161 break; 1162 1163 case tok::string_literal: { 1164 if (LToken.hasUDSuffix()) { 1165 Diags.Report(LToken.getLocation(), diag::err_invalid_string_udl); 1166 HadError = true; 1167 goto retry; 1168 } 1169 1170 // Parse the string literal. 1171 LangOptions LangOpts; 1172 StringLiteralParser StringLiteral(LToken, SourceMgr, LangOpts, *Target); 1173 if (StringLiteral.hadError) 1174 goto retry; 1175 1176 // Copy the string literal into our string data allocator. 1177 unsigned Length = StringLiteral.GetStringLength(); 1178 char *Saved = StringData.Allocate<char>(Length + 1); 1179 memcpy(Saved, StringLiteral.GetString().data(), Length); 1180 Saved[Length] = 0; 1181 1182 // Form the token. 1183 Tok.Kind = MMToken::StringLiteral; 1184 Tok.StringData = Saved; 1185 Tok.StringLength = Length; 1186 break; 1187 } 1188 1189 case tok::comment: 1190 goto retry; 1191 1192 default: 1193 Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token); 1194 HadError = true; 1195 goto retry; 1196 } 1197 1198 return Result; 1199 } 1200 1201 void ModuleMapParser::skipUntil(MMToken::TokenKind K) { 1202 unsigned braceDepth = 0; 1203 unsigned squareDepth = 0; 1204 do { 1205 switch (Tok.Kind) { 1206 case MMToken::EndOfFile: 1207 return; 1208 1209 case MMToken::LBrace: 1210 if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 1211 return; 1212 1213 ++braceDepth; 1214 break; 1215 1216 case MMToken::LSquare: 1217 if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 1218 return; 1219 1220 ++squareDepth; 1221 break; 1222 1223 case MMToken::RBrace: 1224 if (braceDepth > 0) 1225 --braceDepth; 1226 else if (Tok.is(K)) 1227 return; 1228 break; 1229 1230 case MMToken::RSquare: 1231 if (squareDepth > 0) 1232 --squareDepth; 1233 else if (Tok.is(K)) 1234 return; 1235 break; 1236 1237 default: 1238 if (braceDepth == 0 && squareDepth == 0 && Tok.is(K)) 1239 return; 1240 break; 1241 } 1242 1243 consumeToken(); 1244 } while (true); 1245 } 1246 1247 /// \brief Parse a module-id. 1248 /// 1249 /// module-id: 1250 /// identifier 1251 /// identifier '.' module-id 1252 /// 1253 /// \returns true if an error occurred, false otherwise. 1254 bool ModuleMapParser::parseModuleId(ModuleId &Id) { 1255 Id.clear(); 1256 do { 1257 if (Tok.is(MMToken::Identifier) || Tok.is(MMToken::StringLiteral)) { 1258 Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation())); 1259 consumeToken(); 1260 } else { 1261 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name); 1262 return true; 1263 } 1264 1265 if (!Tok.is(MMToken::Period)) 1266 break; 1267 1268 consumeToken(); 1269 } while (true); 1270 1271 return false; 1272 } 1273 1274 namespace { 1275 /// \brief Enumerates the known attributes. 1276 enum AttributeKind { 1277 /// \brief An unknown attribute. 1278 AT_unknown, 1279 /// \brief The 'system' attribute. 1280 AT_system, 1281 /// \brief The 'extern_c' attribute. 1282 AT_extern_c, 1283 /// \brief The 'exhaustive' attribute. 1284 AT_exhaustive 1285 }; 1286 } 1287 1288 /// \brief Parse a module declaration. 1289 /// 1290 /// module-declaration: 1291 /// 'extern' 'module' module-id string-literal 1292 /// 'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt] 1293 /// { module-member* } 1294 /// 1295 /// module-member: 1296 /// requires-declaration 1297 /// header-declaration 1298 /// submodule-declaration 1299 /// export-declaration 1300 /// link-declaration 1301 /// 1302 /// submodule-declaration: 1303 /// module-declaration 1304 /// inferred-submodule-declaration 1305 void ModuleMapParser::parseModuleDecl() { 1306 assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) || 1307 Tok.is(MMToken::FrameworkKeyword) || Tok.is(MMToken::ExternKeyword)); 1308 if (Tok.is(MMToken::ExternKeyword)) { 1309 parseExternModuleDecl(); 1310 return; 1311 } 1312 1313 // Parse 'explicit' or 'framework' keyword, if present. 1314 SourceLocation ExplicitLoc; 1315 bool Explicit = false; 1316 bool Framework = false; 1317 1318 // Parse 'explicit' keyword, if present. 1319 if (Tok.is(MMToken::ExplicitKeyword)) { 1320 ExplicitLoc = consumeToken(); 1321 Explicit = true; 1322 } 1323 1324 // Parse 'framework' keyword, if present. 1325 if (Tok.is(MMToken::FrameworkKeyword)) { 1326 consumeToken(); 1327 Framework = true; 1328 } 1329 1330 // Parse 'module' keyword. 1331 if (!Tok.is(MMToken::ModuleKeyword)) { 1332 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 1333 consumeToken(); 1334 HadError = true; 1335 return; 1336 } 1337 consumeToken(); // 'module' keyword 1338 1339 // If we have a wildcard for the module name, this is an inferred submodule. 1340 // Parse it. 1341 if (Tok.is(MMToken::Star)) 1342 return parseInferredModuleDecl(Framework, Explicit); 1343 1344 // Parse the module name. 1345 ModuleId Id; 1346 if (parseModuleId(Id)) { 1347 HadError = true; 1348 return; 1349 } 1350 1351 if (ActiveModule) { 1352 if (Id.size() > 1) { 1353 Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id) 1354 << SourceRange(Id.front().second, Id.back().second); 1355 1356 HadError = true; 1357 return; 1358 } 1359 } else if (Id.size() == 1 && Explicit) { 1360 // Top-level modules can't be explicit. 1361 Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level); 1362 Explicit = false; 1363 ExplicitLoc = SourceLocation(); 1364 HadError = true; 1365 } 1366 1367 Module *PreviousActiveModule = ActiveModule; 1368 if (Id.size() > 1) { 1369 // This module map defines a submodule. Go find the module of which it 1370 // is a submodule. 1371 ActiveModule = nullptr; 1372 const Module *TopLevelModule = nullptr; 1373 for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) { 1374 if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) { 1375 if (I == 0) 1376 TopLevelModule = Next; 1377 ActiveModule = Next; 1378 continue; 1379 } 1380 1381 if (ActiveModule) { 1382 Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified) 1383 << Id[I].first 1384 << ActiveModule->getTopLevelModule()->getFullModuleName(); 1385 } else { 1386 Diags.Report(Id[I].second, diag::err_mmap_expected_module_name); 1387 } 1388 HadError = true; 1389 return; 1390 } 1391 1392 if (ModuleMapFile != Map.getContainingModuleMapFile(TopLevelModule)) { 1393 assert(ModuleMapFile != Map.getModuleMapFileForUniquing(TopLevelModule) && 1394 "submodule defined in same file as 'module *' that allowed its " 1395 "top-level module"); 1396 Map.addAdditionalModuleMapFile(TopLevelModule, ModuleMapFile); 1397 } 1398 } 1399 1400 StringRef ModuleName = Id.back().first; 1401 SourceLocation ModuleNameLoc = Id.back().second; 1402 1403 // Parse the optional attribute list. 1404 Attributes Attrs; 1405 parseOptionalAttributes(Attrs); 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 parseOptionalAttributes(Attrs); 2071 if (Attrs.IsExhaustive && !ActiveModule->Parent) { 2072 ActiveModule->ConfigMacrosExhaustive = true; 2073 } 2074 2075 // If we don't have an identifier, we're done. 2076 // FIXME: Support macros with the same name as a keyword here. 2077 if (!Tok.is(MMToken::Identifier)) 2078 return; 2079 2080 // Consume the first identifier. 2081 if (!ActiveModule->Parent) { 2082 ActiveModule->ConfigMacros.push_back(Tok.getString().str()); 2083 } 2084 consumeToken(); 2085 2086 do { 2087 // If there's a comma, consume it. 2088 if (!Tok.is(MMToken::Comma)) 2089 break; 2090 consumeToken(); 2091 2092 // We expect to see a macro name here. 2093 // FIXME: Support macros with the same name as a keyword here. 2094 if (!Tok.is(MMToken::Identifier)) { 2095 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_config_macro); 2096 break; 2097 } 2098 2099 // Consume the macro name. 2100 if (!ActiveModule->Parent) { 2101 ActiveModule->ConfigMacros.push_back(Tok.getString().str()); 2102 } 2103 consumeToken(); 2104 } while (true); 2105 } 2106 2107 /// \brief Format a module-id into a string. 2108 static std::string formatModuleId(const ModuleId &Id) { 2109 std::string result; 2110 { 2111 llvm::raw_string_ostream OS(result); 2112 2113 for (unsigned I = 0, N = Id.size(); I != N; ++I) { 2114 if (I) 2115 OS << "."; 2116 OS << Id[I].first; 2117 } 2118 } 2119 2120 return result; 2121 } 2122 2123 /// \brief Parse a conflict declaration. 2124 /// 2125 /// module-declaration: 2126 /// 'conflict' module-id ',' string-literal 2127 void ModuleMapParser::parseConflict() { 2128 assert(Tok.is(MMToken::Conflict)); 2129 SourceLocation ConflictLoc = consumeToken(); 2130 Module::UnresolvedConflict Conflict; 2131 2132 // Parse the module-id. 2133 if (parseModuleId(Conflict.Id)) 2134 return; 2135 2136 // Parse the ','. 2137 if (!Tok.is(MMToken::Comma)) { 2138 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_comma) 2139 << SourceRange(ConflictLoc); 2140 return; 2141 } 2142 consumeToken(); 2143 2144 // Parse the message. 2145 if (!Tok.is(MMToken::StringLiteral)) { 2146 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_message) 2147 << formatModuleId(Conflict.Id); 2148 return; 2149 } 2150 Conflict.Message = Tok.getString().str(); 2151 consumeToken(); 2152 2153 // Add this unresolved conflict. 2154 ActiveModule->UnresolvedConflicts.push_back(Conflict); 2155 } 2156 2157 /// \brief Parse an inferred module declaration (wildcard modules). 2158 /// 2159 /// module-declaration: 2160 /// 'explicit'[opt] 'framework'[opt] 'module' * attributes[opt] 2161 /// { inferred-module-member* } 2162 /// 2163 /// inferred-module-member: 2164 /// 'export' '*' 2165 /// 'exclude' identifier 2166 void ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) { 2167 assert(Tok.is(MMToken::Star)); 2168 SourceLocation StarLoc = consumeToken(); 2169 bool Failed = false; 2170 2171 // Inferred modules must be submodules. 2172 if (!ActiveModule && !Framework) { 2173 Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule); 2174 Failed = true; 2175 } 2176 2177 if (ActiveModule) { 2178 // Inferred modules must have umbrella directories. 2179 if (!Failed && ActiveModule->IsAvailable && 2180 !ActiveModule->getUmbrellaDir()) { 2181 Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella); 2182 Failed = true; 2183 } 2184 2185 // Check for redefinition of an inferred module. 2186 if (!Failed && ActiveModule->InferSubmodules) { 2187 Diags.Report(StarLoc, diag::err_mmap_inferred_redef); 2188 if (ActiveModule->InferredSubmoduleLoc.isValid()) 2189 Diags.Report(ActiveModule->InferredSubmoduleLoc, 2190 diag::note_mmap_prev_definition); 2191 Failed = true; 2192 } 2193 2194 // Check for the 'framework' keyword, which is not permitted here. 2195 if (Framework) { 2196 Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule); 2197 Framework = false; 2198 } 2199 } else if (Explicit) { 2200 Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework); 2201 Explicit = false; 2202 } 2203 2204 // If there were any problems with this inferred submodule, skip its body. 2205 if (Failed) { 2206 if (Tok.is(MMToken::LBrace)) { 2207 consumeToken(); 2208 skipUntil(MMToken::RBrace); 2209 if (Tok.is(MMToken::RBrace)) 2210 consumeToken(); 2211 } 2212 HadError = true; 2213 return; 2214 } 2215 2216 // Parse optional attributes. 2217 Attributes Attrs; 2218 parseOptionalAttributes(Attrs); 2219 2220 if (ActiveModule) { 2221 // Note that we have an inferred submodule. 2222 ActiveModule->InferSubmodules = true; 2223 ActiveModule->InferredSubmoduleLoc = StarLoc; 2224 ActiveModule->InferExplicitSubmodules = Explicit; 2225 } else { 2226 // We'll be inferring framework modules for this directory. 2227 Map.InferredDirectories[Directory].InferModules = true; 2228 Map.InferredDirectories[Directory].Attrs = Attrs; 2229 Map.InferredDirectories[Directory].ModuleMapFile = ModuleMapFile; 2230 // FIXME: Handle the 'framework' keyword. 2231 } 2232 2233 // Parse the opening brace. 2234 if (!Tok.is(MMToken::LBrace)) { 2235 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard); 2236 HadError = true; 2237 return; 2238 } 2239 SourceLocation LBraceLoc = consumeToken(); 2240 2241 // Parse the body of the inferred submodule. 2242 bool Done = false; 2243 do { 2244 switch (Tok.Kind) { 2245 case MMToken::EndOfFile: 2246 case MMToken::RBrace: 2247 Done = true; 2248 break; 2249 2250 case MMToken::ExcludeKeyword: { 2251 if (ActiveModule) { 2252 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 2253 << (ActiveModule != nullptr); 2254 consumeToken(); 2255 break; 2256 } 2257 2258 consumeToken(); 2259 // FIXME: Support string-literal module names here. 2260 if (!Tok.is(MMToken::Identifier)) { 2261 Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name); 2262 break; 2263 } 2264 2265 Map.InferredDirectories[Directory].ExcludedModules 2266 .push_back(Tok.getString()); 2267 consumeToken(); 2268 break; 2269 } 2270 2271 case MMToken::ExportKeyword: 2272 if (!ActiveModule) { 2273 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 2274 << (ActiveModule != nullptr); 2275 consumeToken(); 2276 break; 2277 } 2278 2279 consumeToken(); 2280 if (Tok.is(MMToken::Star)) 2281 ActiveModule->InferExportWildcard = true; 2282 else 2283 Diags.Report(Tok.getLocation(), 2284 diag::err_mmap_expected_export_wildcard); 2285 consumeToken(); 2286 break; 2287 2288 case MMToken::ExplicitKeyword: 2289 case MMToken::ModuleKeyword: 2290 case MMToken::HeaderKeyword: 2291 case MMToken::PrivateKeyword: 2292 case MMToken::UmbrellaKeyword: 2293 default: 2294 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 2295 << (ActiveModule != nullptr); 2296 consumeToken(); 2297 break; 2298 } 2299 } while (!Done); 2300 2301 if (Tok.is(MMToken::RBrace)) 2302 consumeToken(); 2303 else { 2304 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 2305 Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 2306 HadError = true; 2307 } 2308 } 2309 2310 /// \brief Parse optional attributes. 2311 /// 2312 /// attributes: 2313 /// attribute attributes 2314 /// attribute 2315 /// 2316 /// attribute: 2317 /// [ identifier ] 2318 /// 2319 /// \param Attrs Will be filled in with the parsed attributes. 2320 /// 2321 /// \returns true if an error occurred, false otherwise. 2322 bool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) { 2323 bool HadError = false; 2324 2325 while (Tok.is(MMToken::LSquare)) { 2326 // Consume the '['. 2327 SourceLocation LSquareLoc = consumeToken(); 2328 2329 // Check whether we have an attribute name here. 2330 if (!Tok.is(MMToken::Identifier)) { 2331 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute); 2332 skipUntil(MMToken::RSquare); 2333 if (Tok.is(MMToken::RSquare)) 2334 consumeToken(); 2335 HadError = true; 2336 } 2337 2338 // Decode the attribute name. 2339 AttributeKind Attribute 2340 = llvm::StringSwitch<AttributeKind>(Tok.getString()) 2341 .Case("exhaustive", AT_exhaustive) 2342 .Case("extern_c", AT_extern_c) 2343 .Case("system", AT_system) 2344 .Default(AT_unknown); 2345 switch (Attribute) { 2346 case AT_unknown: 2347 Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute) 2348 << Tok.getString(); 2349 break; 2350 2351 case AT_system: 2352 Attrs.IsSystem = true; 2353 break; 2354 2355 case AT_extern_c: 2356 Attrs.IsExternC = true; 2357 break; 2358 2359 case AT_exhaustive: 2360 Attrs.IsExhaustive = true; 2361 break; 2362 } 2363 consumeToken(); 2364 2365 // Consume the ']'. 2366 if (!Tok.is(MMToken::RSquare)) { 2367 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare); 2368 Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match); 2369 skipUntil(MMToken::RSquare); 2370 HadError = true; 2371 } 2372 2373 if (Tok.is(MMToken::RSquare)) 2374 consumeToken(); 2375 } 2376 2377 return HadError; 2378 } 2379 2380 /// \brief Parse a module map file. 2381 /// 2382 /// module-map-file: 2383 /// module-declaration* 2384 bool ModuleMapParser::parseModuleMapFile() { 2385 do { 2386 switch (Tok.Kind) { 2387 case MMToken::EndOfFile: 2388 return HadError; 2389 2390 case MMToken::ExplicitKeyword: 2391 case MMToken::ExternKeyword: 2392 case MMToken::ModuleKeyword: 2393 case MMToken::FrameworkKeyword: 2394 parseModuleDecl(); 2395 break; 2396 2397 case MMToken::Comma: 2398 case MMToken::ConfigMacros: 2399 case MMToken::Conflict: 2400 case MMToken::Exclaim: 2401 case MMToken::ExcludeKeyword: 2402 case MMToken::ExportKeyword: 2403 case MMToken::HeaderKeyword: 2404 case MMToken::Identifier: 2405 case MMToken::LBrace: 2406 case MMToken::LinkKeyword: 2407 case MMToken::LSquare: 2408 case MMToken::Period: 2409 case MMToken::PrivateKeyword: 2410 case MMToken::RBrace: 2411 case MMToken::RSquare: 2412 case MMToken::RequiresKeyword: 2413 case MMToken::Star: 2414 case MMToken::StringLiteral: 2415 case MMToken::TextualKeyword: 2416 case MMToken::UmbrellaKeyword: 2417 case MMToken::UseKeyword: 2418 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 2419 HadError = true; 2420 consumeToken(); 2421 break; 2422 } 2423 } while (true); 2424 } 2425 2426 bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem, 2427 const DirectoryEntry *Dir, 2428 SourceLocation ExternModuleLoc) { 2429 llvm::DenseMap<const FileEntry *, bool>::iterator Known 2430 = ParsedModuleMap.find(File); 2431 if (Known != ParsedModuleMap.end()) 2432 return Known->second; 2433 2434 assert(Target && "Missing target information"); 2435 auto FileCharacter = IsSystem ? SrcMgr::C_System : SrcMgr::C_User; 2436 FileID ID = SourceMgr.createFileID(File, ExternModuleLoc, FileCharacter); 2437 const llvm::MemoryBuffer *Buffer = SourceMgr.getBuffer(ID); 2438 if (!Buffer) 2439 return ParsedModuleMap[File] = true; 2440 2441 // Parse this module map file. 2442 Lexer L(ID, SourceMgr.getBuffer(ID), SourceMgr, MMapLangOpts); 2443 SourceLocation Start = L.getSourceLocation(); 2444 ModuleMapParser Parser(L, SourceMgr, Target, Diags, *this, File, Dir, 2445 BuiltinIncludeDir, IsSystem); 2446 bool Result = Parser.parseModuleMapFile(); 2447 ParsedModuleMap[File] = Result; 2448 2449 // Notify callbacks that we parsed it. 2450 for (const auto &Cb : Callbacks) 2451 Cb->moduleMapFileRead(Start, *File, IsSystem); 2452 return Result; 2453 } 2454