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