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/LexDiagnostic.h" 23 #include "clang/Lex/Lexer.h" 24 #include "clang/Lex/LiteralSupport.h" 25 #include "llvm/ADT/StringRef.h" 26 #include "llvm/ADT/StringSwitch.h" 27 #include "llvm/Support/Allocator.h" 28 #include "llvm/Support/FileSystem.h" 29 #include "llvm/Support/Host.h" 30 #include "llvm/Support/PathV2.h" 31 #include "llvm/Support/raw_ostream.h" 32 #include <stdlib.h> 33 #if defined(LLVM_ON_UNIX) 34 #include <limits.h> 35 #endif 36 using namespace clang; 37 38 Module::ExportDecl 39 ModuleMap::resolveExport(Module *Mod, 40 const Module::UnresolvedExportDecl &Unresolved, 41 bool Complain) const { 42 // We may have just a wildcard. 43 if (Unresolved.Id.empty()) { 44 assert(Unresolved.Wildcard && "Invalid unresolved export"); 45 return Module::ExportDecl(0, true); 46 } 47 48 // Resolve the module-id. 49 Module *Context = resolveModuleId(Unresolved.Id, Mod, Complain); 50 if (!Context) 51 return Module::ExportDecl(); 52 53 return Module::ExportDecl(Context, Unresolved.Wildcard); 54 } 55 56 Module *ModuleMap::resolveModuleId(const ModuleId &Id, Module *Mod, 57 bool Complain) const { 58 // Find the starting module. 59 Module *Context = lookupModuleUnqualified(Id[0].first, Mod); 60 if (!Context) { 61 if (Complain) 62 Diags->Report(Id[0].second, diag::err_mmap_missing_module_unqualified) 63 << Id[0].first << Mod->getFullModuleName(); 64 65 return 0; 66 } 67 68 // Dig into the module path. 69 for (unsigned I = 1, N = Id.size(); I != N; ++I) { 70 Module *Sub = lookupModuleQualified(Id[I].first, Context); 71 if (!Sub) { 72 if (Complain) 73 Diags->Report(Id[I].second, diag::err_mmap_missing_module_qualified) 74 << Id[I].first << Context->getFullModuleName() 75 << SourceRange(Id[0].second, Id[I-1].second); 76 77 return 0; 78 } 79 80 Context = Sub; 81 } 82 83 return Context; 84 } 85 86 ModuleMap::ModuleMap(FileManager &FileMgr, DiagnosticConsumer &DC, 87 const LangOptions &LangOpts, const TargetInfo *Target, 88 HeaderSearch &HeaderInfo) 89 : LangOpts(LangOpts), Target(Target), HeaderInfo(HeaderInfo), 90 BuiltinIncludeDir(0), CompilingModule(0) 91 { 92 IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs); 93 Diags = IntrusiveRefCntPtr<DiagnosticsEngine>( 94 new DiagnosticsEngine(DiagIDs, new DiagnosticOptions)); 95 Diags->setClient(new ForwardingDiagnosticConsumer(DC), 96 /*ShouldOwnClient=*/true); 97 SourceMgr = new SourceManager(*Diags, FileMgr); 98 } 99 100 ModuleMap::~ModuleMap() { 101 for (llvm::StringMap<Module *>::iterator I = Modules.begin(), 102 IEnd = Modules.end(); 103 I != IEnd; ++I) { 104 delete I->getValue(); 105 } 106 107 delete SourceMgr; 108 } 109 110 void ModuleMap::setTarget(const TargetInfo &Target) { 111 assert((!this->Target || this->Target == &Target) && 112 "Improper target override"); 113 this->Target = &Target; 114 } 115 116 /// \brief "Sanitize" a filename so that it can be used as an identifier. 117 static StringRef sanitizeFilenameAsIdentifier(StringRef Name, 118 SmallVectorImpl<char> &Buffer) { 119 if (Name.empty()) 120 return Name; 121 122 if (!isValidIdentifier(Name)) { 123 // If we don't already have something with the form of an identifier, 124 // create a buffer with the sanitized name. 125 Buffer.clear(); 126 if (isDigit(Name[0])) 127 Buffer.push_back('_'); 128 Buffer.reserve(Buffer.size() + Name.size()); 129 for (unsigned I = 0, N = Name.size(); I != N; ++I) { 130 if (isIdentifierBody(Name[I])) 131 Buffer.push_back(Name[I]); 132 else 133 Buffer.push_back('_'); 134 } 135 136 Name = StringRef(Buffer.data(), Buffer.size()); 137 } 138 139 while (llvm::StringSwitch<bool>(Name) 140 #define KEYWORD(Keyword,Conditions) .Case(#Keyword, true) 141 #define ALIAS(Keyword, AliasOf, Conditions) .Case(Keyword, true) 142 #include "clang/Basic/TokenKinds.def" 143 .Default(false)) { 144 if (Name.data() != Buffer.data()) 145 Buffer.append(Name.begin(), Name.end()); 146 Buffer.push_back('_'); 147 Name = StringRef(Buffer.data(), Buffer.size()); 148 } 149 150 return Name; 151 } 152 153 /// \brief Determine whether the given file name is the name of a builtin 154 /// header, supplied by Clang to replace, override, or augment existing system 155 /// headers. 156 static bool isBuiltinHeader(StringRef FileName) { 157 return llvm::StringSwitch<bool>(FileName) 158 .Case("float.h", true) 159 .Case("iso646.h", true) 160 .Case("limits.h", true) 161 .Case("stdalign.h", true) 162 .Case("stdarg.h", true) 163 .Case("stdbool.h", true) 164 .Case("stddef.h", true) 165 .Case("stdint.h", true) 166 .Case("tgmath.h", true) 167 .Case("unwind.h", true) 168 .Default(false); 169 } 170 171 Module *ModuleMap::findModuleForHeader(const FileEntry *File) { 172 HeadersMap::iterator Known = Headers.find(File); 173 if (Known != Headers.end()) { 174 // If a header is not available, don't report that it maps to anything. 175 if (!Known->second.isAvailable()) 176 return 0; 177 178 return Known->second.getModule(); 179 } 180 181 // If we've found a builtin header within Clang's builtin include directory, 182 // load all of the module maps to see if it will get associated with a 183 // specific module (e.g., in /usr/include). 184 if (File->getDir() == BuiltinIncludeDir && 185 isBuiltinHeader(llvm::sys::path::filename(File->getName()))) { 186 SmallVector<Module *, 4> AllModules; 187 HeaderInfo.collectAllModules(AllModules); 188 189 // Check again. 190 Known = Headers.find(File); 191 if (Known != Headers.end()) { 192 // If a header is not available, don't report that it maps to anything. 193 if (!Known->second.isAvailable()) 194 return 0; 195 196 return Known->second.getModule(); 197 } 198 } 199 200 const DirectoryEntry *Dir = File->getDir(); 201 SmallVector<const DirectoryEntry *, 2> SkippedDirs; 202 203 // Note: as an egregious but useful hack we use the real path here, because 204 // frameworks moving from top-level frameworks to embedded frameworks tend 205 // to be symlinked from the top-level location to the embedded location, 206 // and we need to resolve lookups as if we had found the embedded location. 207 StringRef DirName = SourceMgr->getFileManager().getCanonicalName(Dir); 208 209 // Keep walking up the directory hierarchy, looking for a directory with 210 // an umbrella header. 211 do { 212 llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir 213 = UmbrellaDirs.find(Dir); 214 if (KnownDir != UmbrellaDirs.end()) { 215 Module *Result = KnownDir->second; 216 217 // Search up the module stack until we find a module with an umbrella 218 // directory. 219 Module *UmbrellaModule = Result; 220 while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent) 221 UmbrellaModule = UmbrellaModule->Parent; 222 223 if (UmbrellaModule->InferSubmodules) { 224 // Infer submodules for each of the directories we found between 225 // the directory of the umbrella header and the directory where 226 // the actual header is located. 227 bool Explicit = UmbrellaModule->InferExplicitSubmodules; 228 229 for (unsigned I = SkippedDirs.size(); I != 0; --I) { 230 // Find or create the module that corresponds to this directory name. 231 SmallString<32> NameBuf; 232 StringRef Name = sanitizeFilenameAsIdentifier( 233 llvm::sys::path::stem(SkippedDirs[I-1]->getName()), 234 NameBuf); 235 Result = findOrCreateModule(Name, Result, /*IsFramework=*/false, 236 Explicit).first; 237 238 // Associate the module and the directory. 239 UmbrellaDirs[SkippedDirs[I-1]] = Result; 240 241 // If inferred submodules export everything they import, add a 242 // wildcard to the set of exports. 243 if (UmbrellaModule->InferExportWildcard && Result->Exports.empty()) 244 Result->Exports.push_back(Module::ExportDecl(0, true)); 245 } 246 247 // Infer a submodule with the same name as this header file. 248 SmallString<32> NameBuf; 249 StringRef Name = sanitizeFilenameAsIdentifier( 250 llvm::sys::path::stem(File->getName()), NameBuf); 251 Result = findOrCreateModule(Name, Result, /*IsFramework=*/false, 252 Explicit).first; 253 Result->addTopHeader(File); 254 255 // If inferred submodules export everything they import, add a 256 // wildcard to the set of exports. 257 if (UmbrellaModule->InferExportWildcard && Result->Exports.empty()) 258 Result->Exports.push_back(Module::ExportDecl(0, true)); 259 } else { 260 // Record each of the directories we stepped through as being part of 261 // the module we found, since the umbrella header covers them all. 262 for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I) 263 UmbrellaDirs[SkippedDirs[I]] = Result; 264 } 265 266 Headers[File] = KnownHeader(Result, /*Excluded=*/false); 267 268 // If a header corresponds to an unavailable module, don't report 269 // that it maps to anything. 270 if (!Result->isAvailable()) 271 return 0; 272 273 return Result; 274 } 275 276 SkippedDirs.push_back(Dir); 277 278 // Retrieve our parent path. 279 DirName = llvm::sys::path::parent_path(DirName); 280 if (DirName.empty()) 281 break; 282 283 // Resolve the parent path to a directory entry. 284 Dir = SourceMgr->getFileManager().getDirectory(DirName); 285 } while (Dir); 286 287 return 0; 288 } 289 290 bool ModuleMap::isHeaderInUnavailableModule(const FileEntry *Header) const { 291 HeadersMap::const_iterator Known = Headers.find(Header); 292 if (Known != Headers.end()) 293 return !Known->second.isAvailable(); 294 295 const DirectoryEntry *Dir = Header->getDir(); 296 SmallVector<const DirectoryEntry *, 2> SkippedDirs; 297 StringRef DirName = Dir->getName(); 298 299 // Keep walking up the directory hierarchy, looking for a directory with 300 // an umbrella header. 301 do { 302 llvm::DenseMap<const DirectoryEntry *, Module *>::const_iterator KnownDir 303 = UmbrellaDirs.find(Dir); 304 if (KnownDir != UmbrellaDirs.end()) { 305 Module *Found = KnownDir->second; 306 if (!Found->isAvailable()) 307 return true; 308 309 // Search up the module stack until we find a module with an umbrella 310 // directory. 311 Module *UmbrellaModule = Found; 312 while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent) 313 UmbrellaModule = UmbrellaModule->Parent; 314 315 if (UmbrellaModule->InferSubmodules) { 316 for (unsigned I = SkippedDirs.size(); I != 0; --I) { 317 // Find or create the module that corresponds to this directory name. 318 SmallString<32> NameBuf; 319 StringRef Name = sanitizeFilenameAsIdentifier( 320 llvm::sys::path::stem(SkippedDirs[I-1]->getName()), 321 NameBuf); 322 Found = lookupModuleQualified(Name, Found); 323 if (!Found) 324 return false; 325 if (!Found->isAvailable()) 326 return true; 327 } 328 329 // Infer a submodule with the same name as this header file. 330 SmallString<32> NameBuf; 331 StringRef Name = sanitizeFilenameAsIdentifier( 332 llvm::sys::path::stem(Header->getName()), 333 NameBuf); 334 Found = lookupModuleQualified(Name, Found); 335 if (!Found) 336 return false; 337 } 338 339 return !Found->isAvailable(); 340 } 341 342 SkippedDirs.push_back(Dir); 343 344 // Retrieve our parent path. 345 DirName = llvm::sys::path::parent_path(DirName); 346 if (DirName.empty()) 347 break; 348 349 // Resolve the parent path to a directory entry. 350 Dir = SourceMgr->getFileManager().getDirectory(DirName); 351 } while (Dir); 352 353 return false; 354 } 355 356 Module *ModuleMap::findModule(StringRef Name) const { 357 llvm::StringMap<Module *>::const_iterator Known = Modules.find(Name); 358 if (Known != Modules.end()) 359 return Known->getValue(); 360 361 return 0; 362 } 363 364 Module *ModuleMap::lookupModuleUnqualified(StringRef Name, 365 Module *Context) const { 366 for(; Context; Context = Context->Parent) { 367 if (Module *Sub = lookupModuleQualified(Name, Context)) 368 return Sub; 369 } 370 371 return findModule(Name); 372 } 373 374 Module *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) const{ 375 if (!Context) 376 return findModule(Name); 377 378 return Context->findSubmodule(Name); 379 } 380 381 std::pair<Module *, bool> 382 ModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework, 383 bool IsExplicit) { 384 // Try to find an existing module with this name. 385 if (Module *Sub = lookupModuleQualified(Name, Parent)) 386 return std::make_pair(Sub, false); 387 388 // Create a new module with this name. 389 Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework, 390 IsExplicit); 391 if (!Parent) { 392 Modules[Name] = Result; 393 if (!LangOpts.CurrentModule.empty() && !CompilingModule && 394 Name == LangOpts.CurrentModule) { 395 CompilingModule = Result; 396 } 397 } 398 return std::make_pair(Result, true); 399 } 400 401 bool ModuleMap::canInferFrameworkModule(const DirectoryEntry *ParentDir, 402 StringRef Name, bool &IsSystem) const { 403 // Check whether we have already looked into the parent directory 404 // for a module map. 405 llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator 406 inferred = InferredDirectories.find(ParentDir); 407 if (inferred == InferredDirectories.end()) 408 return false; 409 410 if (!inferred->second.InferModules) 411 return false; 412 413 // We're allowed to infer for this directory, but make sure it's okay 414 // to infer this particular module. 415 bool canInfer = std::find(inferred->second.ExcludedModules.begin(), 416 inferred->second.ExcludedModules.end(), 417 Name) == inferred->second.ExcludedModules.end(); 418 419 if (canInfer && inferred->second.InferSystemModules) 420 IsSystem = true; 421 422 return canInfer; 423 } 424 425 /// \brief For a framework module, infer the framework against which we 426 /// should link. 427 static void inferFrameworkLink(Module *Mod, const DirectoryEntry *FrameworkDir, 428 FileManager &FileMgr) { 429 assert(Mod->IsFramework && "Can only infer linking for framework modules"); 430 assert(!Mod->isSubFramework() && 431 "Can only infer linking for top-level frameworks"); 432 433 SmallString<128> LibName; 434 LibName += FrameworkDir->getName(); 435 llvm::sys::path::append(LibName, Mod->Name); 436 if (FileMgr.getFile(LibName)) { 437 Mod->LinkLibraries.push_back(Module::LinkLibrary(Mod->Name, 438 /*IsFramework=*/true)); 439 } 440 } 441 442 Module * 443 ModuleMap::inferFrameworkModule(StringRef ModuleName, 444 const DirectoryEntry *FrameworkDir, 445 bool IsSystem, 446 Module *Parent) { 447 // Check whether we've already found this module. 448 if (Module *Mod = lookupModuleQualified(ModuleName, Parent)) 449 return Mod; 450 451 FileManager &FileMgr = SourceMgr->getFileManager(); 452 453 // If the framework has a parent path from which we're allowed to infer 454 // a framework module, do so. 455 if (!Parent) { 456 // Determine whether we're allowed to infer a module map. 457 458 // Note: as an egregious but useful hack we use the real path here, because 459 // we might be looking at an embedded framework that symlinks out to a 460 // top-level framework, and we need to infer as if we were naming the 461 // top-level framework. 462 StringRef FrameworkDirName 463 = SourceMgr->getFileManager().getCanonicalName(FrameworkDir); 464 465 bool canInfer = false; 466 if (llvm::sys::path::has_parent_path(FrameworkDirName)) { 467 // Figure out the parent path. 468 StringRef Parent = llvm::sys::path::parent_path(FrameworkDirName); 469 if (const DirectoryEntry *ParentDir = FileMgr.getDirectory(Parent)) { 470 // Check whether we have already looked into the parent directory 471 // for a module map. 472 llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator 473 inferred = InferredDirectories.find(ParentDir); 474 if (inferred == InferredDirectories.end()) { 475 // We haven't looked here before. Load a module map, if there is 476 // one. 477 SmallString<128> ModMapPath = Parent; 478 llvm::sys::path::append(ModMapPath, "module.map"); 479 if (const FileEntry *ModMapFile = FileMgr.getFile(ModMapPath)) { 480 parseModuleMapFile(ModMapFile); 481 inferred = InferredDirectories.find(ParentDir); 482 } 483 484 if (inferred == InferredDirectories.end()) 485 inferred = InferredDirectories.insert( 486 std::make_pair(ParentDir, InferredDirectory())).first; 487 } 488 489 if (inferred->second.InferModules) { 490 // We're allowed to infer for this directory, but make sure it's okay 491 // to infer this particular module. 492 StringRef Name = llvm::sys::path::stem(FrameworkDirName); 493 canInfer = std::find(inferred->second.ExcludedModules.begin(), 494 inferred->second.ExcludedModules.end(), 495 Name) == inferred->second.ExcludedModules.end(); 496 497 if (inferred->second.InferSystemModules) 498 IsSystem = true; 499 } 500 } 501 } 502 503 // If we're not allowed to infer a framework module, don't. 504 if (!canInfer) 505 return 0; 506 } 507 508 509 // Look for an umbrella header. 510 SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName()); 511 llvm::sys::path::append(UmbrellaName, "Headers"); 512 llvm::sys::path::append(UmbrellaName, ModuleName + ".h"); 513 const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName); 514 515 // FIXME: If there's no umbrella header, we could probably scan the 516 // framework to load *everything*. But, it's not clear that this is a good 517 // idea. 518 if (!UmbrellaHeader) 519 return 0; 520 521 Module *Result = new Module(ModuleName, SourceLocation(), Parent, 522 /*IsFramework=*/true, /*IsExplicit=*/false); 523 if (IsSystem) 524 Result->IsSystem = IsSystem; 525 526 if (!Parent) 527 Modules[ModuleName] = Result; 528 529 // umbrella header "umbrella-header-name" 530 Result->Umbrella = UmbrellaHeader; 531 Headers[UmbrellaHeader] = KnownHeader(Result, /*Excluded=*/false); 532 UmbrellaDirs[UmbrellaHeader->getDir()] = Result; 533 534 // export * 535 Result->Exports.push_back(Module::ExportDecl(0, true)); 536 537 // module * { export * } 538 Result->InferSubmodules = true; 539 Result->InferExportWildcard = true; 540 541 // Look for subframeworks. 542 llvm::error_code EC; 543 SmallString<128> SubframeworksDirName 544 = StringRef(FrameworkDir->getName()); 545 llvm::sys::path::append(SubframeworksDirName, "Frameworks"); 546 SmallString<128> SubframeworksDirNameNative; 547 llvm::sys::path::native(SubframeworksDirName.str(), 548 SubframeworksDirNameNative); 549 for (llvm::sys::fs::directory_iterator 550 Dir(SubframeworksDirNameNative.str(), EC), DirEnd; 551 Dir != DirEnd && !EC; Dir.increment(EC)) { 552 if (!StringRef(Dir->path()).endswith(".framework")) 553 continue; 554 555 if (const DirectoryEntry *SubframeworkDir 556 = FileMgr.getDirectory(Dir->path())) { 557 // Note: as an egregious but useful hack, we use the real path here and 558 // check whether it is actually a subdirectory of the parent directory. 559 // This will not be the case if the 'subframework' is actually a symlink 560 // out to a top-level framework. 561 StringRef SubframeworkDirName = FileMgr.getCanonicalName(SubframeworkDir); 562 bool FoundParent = false; 563 do { 564 // Get the parent directory name. 565 SubframeworkDirName 566 = llvm::sys::path::parent_path(SubframeworkDirName); 567 if (SubframeworkDirName.empty()) 568 break; 569 570 if (FileMgr.getDirectory(SubframeworkDirName) == FrameworkDir) { 571 FoundParent = true; 572 break; 573 } 574 } while (true); 575 576 if (!FoundParent) 577 continue; 578 579 // FIXME: Do we want to warn about subframeworks without umbrella headers? 580 SmallString<32> NameBuf; 581 inferFrameworkModule(sanitizeFilenameAsIdentifier( 582 llvm::sys::path::stem(Dir->path()), NameBuf), 583 SubframeworkDir, IsSystem, Result); 584 } 585 } 586 587 // If the module is a top-level framework, automatically link against the 588 // framework. 589 if (!Result->isSubFramework()) { 590 inferFrameworkLink(Result, FrameworkDir, FileMgr); 591 } 592 593 return Result; 594 } 595 596 void ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader){ 597 Headers[UmbrellaHeader] = KnownHeader(Mod, /*Excluded=*/false); 598 Mod->Umbrella = UmbrellaHeader; 599 UmbrellaDirs[UmbrellaHeader->getDir()] = Mod; 600 } 601 602 void ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir) { 603 Mod->Umbrella = UmbrellaDir; 604 UmbrellaDirs[UmbrellaDir] = Mod; 605 } 606 607 void ModuleMap::addHeader(Module *Mod, const FileEntry *Header, 608 bool Excluded) { 609 if (Excluded) { 610 Mod->ExcludedHeaders.push_back(Header); 611 } else { 612 Mod->Headers.push_back(Header); 613 bool isCompilingModuleHeader = Mod->getTopLevelModule() == CompilingModule; 614 HeaderInfo.MarkFileModuleHeader(Header, isCompilingModuleHeader); 615 } 616 Headers[Header] = KnownHeader(Mod, Excluded); 617 } 618 619 const FileEntry * 620 ModuleMap::getContainingModuleMapFile(Module *Module) const { 621 if (Module->DefinitionLoc.isInvalid() || !SourceMgr) 622 return 0; 623 624 return SourceMgr->getFileEntryForID( 625 SourceMgr->getFileID(Module->DefinitionLoc)); 626 } 627 628 void ModuleMap::dump() { 629 llvm::errs() << "Modules:"; 630 for (llvm::StringMap<Module *>::iterator M = Modules.begin(), 631 MEnd = Modules.end(); 632 M != MEnd; ++M) 633 M->getValue()->print(llvm::errs(), 2); 634 635 llvm::errs() << "Headers:"; 636 for (HeadersMap::iterator H = Headers.begin(), HEnd = Headers.end(); 637 H != HEnd; ++H) { 638 llvm::errs() << " \"" << H->first->getName() << "\" -> " 639 << H->second.getModule()->getFullModuleName() << "\n"; 640 } 641 } 642 643 bool ModuleMap::resolveExports(Module *Mod, bool Complain) { 644 bool HadError = false; 645 for (unsigned I = 0, N = Mod->UnresolvedExports.size(); I != N; ++I) { 646 Module::ExportDecl Export = resolveExport(Mod, Mod->UnresolvedExports[I], 647 Complain); 648 if (Export.getPointer() || Export.getInt()) 649 Mod->Exports.push_back(Export); 650 else 651 HadError = true; 652 } 653 Mod->UnresolvedExports.clear(); 654 return HadError; 655 } 656 657 bool ModuleMap::resolveConflicts(Module *Mod, bool Complain) { 658 bool HadError = false; 659 for (unsigned I = 0, N = Mod->UnresolvedConflicts.size(); I != N; ++I) { 660 Module *OtherMod = resolveModuleId(Mod->UnresolvedConflicts[I].Id, 661 Mod, Complain); 662 if (!OtherMod) { 663 HadError = true; 664 continue; 665 } 666 667 Module::Conflict Conflict; 668 Conflict.Other = OtherMod; 669 Conflict.Message = Mod->UnresolvedConflicts[I].Message; 670 Mod->Conflicts.push_back(Conflict); 671 } 672 Mod->UnresolvedConflicts.clear(); 673 return HadError; 674 } 675 676 Module *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) { 677 if (Loc.isInvalid()) 678 return 0; 679 680 // Use the expansion location to determine which module we're in. 681 FullSourceLoc ExpansionLoc = Loc.getExpansionLoc(); 682 if (!ExpansionLoc.isFileID()) 683 return 0; 684 685 686 const SourceManager &SrcMgr = Loc.getManager(); 687 FileID ExpansionFileID = ExpansionLoc.getFileID(); 688 689 while (const FileEntry *ExpansionFile 690 = SrcMgr.getFileEntryForID(ExpansionFileID)) { 691 // Find the module that owns this header (if any). 692 if (Module *Mod = findModuleForHeader(ExpansionFile)) 693 return Mod; 694 695 // No module owns this header, so look up the inclusion chain to see if 696 // any included header has an associated module. 697 SourceLocation IncludeLoc = SrcMgr.getIncludeLoc(ExpansionFileID); 698 if (IncludeLoc.isInvalid()) 699 return 0; 700 701 ExpansionFileID = SrcMgr.getFileID(IncludeLoc); 702 } 703 704 return 0; 705 } 706 707 //----------------------------------------------------------------------------// 708 // Module map file parser 709 //----------------------------------------------------------------------------// 710 711 namespace clang { 712 /// \brief A token in a module map file. 713 struct MMToken { 714 enum TokenKind { 715 Comma, 716 ConfigMacros, 717 Conflict, 718 EndOfFile, 719 HeaderKeyword, 720 Identifier, 721 ExcludeKeyword, 722 ExplicitKeyword, 723 ExportKeyword, 724 FrameworkKeyword, 725 LinkKeyword, 726 ModuleKeyword, 727 Period, 728 UmbrellaKeyword, 729 RequiresKeyword, 730 Star, 731 StringLiteral, 732 LBrace, 733 RBrace, 734 LSquare, 735 RSquare 736 } Kind; 737 738 unsigned Location; 739 unsigned StringLength; 740 const char *StringData; 741 742 void clear() { 743 Kind = EndOfFile; 744 Location = 0; 745 StringLength = 0; 746 StringData = 0; 747 } 748 749 bool is(TokenKind K) const { return Kind == K; } 750 751 SourceLocation getLocation() const { 752 return SourceLocation::getFromRawEncoding(Location); 753 } 754 755 StringRef getString() const { 756 return StringRef(StringData, StringLength); 757 } 758 }; 759 760 /// \brief The set of attributes that can be attached to a module. 761 struct Attributes { 762 Attributes() : IsSystem(), IsExhaustive() { } 763 764 /// \brief Whether this is a system module. 765 unsigned IsSystem : 1; 766 767 /// \brief Whether this is an exhaustive set of configuration macros. 768 unsigned IsExhaustive : 1; 769 }; 770 771 772 class ModuleMapParser { 773 Lexer &L; 774 SourceManager &SourceMgr; 775 776 /// \brief Default target information, used only for string literal 777 /// parsing. 778 const TargetInfo *Target; 779 780 DiagnosticsEngine &Diags; 781 ModuleMap ⤅ 782 783 /// \brief The directory that this module map resides in. 784 const DirectoryEntry *Directory; 785 786 /// \brief The directory containing Clang-supplied headers. 787 const DirectoryEntry *BuiltinIncludeDir; 788 789 /// \brief Whether an error occurred. 790 bool HadError; 791 792 /// \brief Stores string data for the various string literals referenced 793 /// during parsing. 794 llvm::BumpPtrAllocator StringData; 795 796 /// \brief The current token. 797 MMToken Tok; 798 799 /// \brief The active module. 800 Module *ActiveModule; 801 802 /// \brief Consume the current token and return its location. 803 SourceLocation consumeToken(); 804 805 /// \brief Skip tokens until we reach the a token with the given kind 806 /// (or the end of the file). 807 void skipUntil(MMToken::TokenKind K); 808 809 typedef SmallVector<std::pair<std::string, SourceLocation>, 2> ModuleId; 810 bool parseModuleId(ModuleId &Id); 811 void parseModuleDecl(); 812 void parseRequiresDecl(); 813 void parseHeaderDecl(SourceLocation UmbrellaLoc, SourceLocation ExcludeLoc); 814 void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc); 815 void parseExportDecl(); 816 void parseLinkDecl(); 817 void parseConfigMacros(); 818 void parseConflict(); 819 void parseInferredModuleDecl(bool Framework, bool Explicit); 820 bool parseOptionalAttributes(Attributes &Attrs); 821 822 const DirectoryEntry *getOverriddenHeaderSearchDir(); 823 824 public: 825 explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr, 826 const TargetInfo *Target, 827 DiagnosticsEngine &Diags, 828 ModuleMap &Map, 829 const DirectoryEntry *Directory, 830 const DirectoryEntry *BuiltinIncludeDir) 831 : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map), 832 Directory(Directory), BuiltinIncludeDir(BuiltinIncludeDir), 833 HadError(false), ActiveModule(0) 834 { 835 Tok.clear(); 836 consumeToken(); 837 } 838 839 bool parseModuleMapFile(); 840 }; 841 } 842 843 SourceLocation ModuleMapParser::consumeToken() { 844 retry: 845 SourceLocation Result = Tok.getLocation(); 846 Tok.clear(); 847 848 Token LToken; 849 L.LexFromRawLexer(LToken); 850 Tok.Location = LToken.getLocation().getRawEncoding(); 851 switch (LToken.getKind()) { 852 case tok::raw_identifier: 853 Tok.StringData = LToken.getRawIdentifierData(); 854 Tok.StringLength = LToken.getLength(); 855 Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(Tok.getString()) 856 .Case("config_macros", MMToken::ConfigMacros) 857 .Case("conflict", MMToken::Conflict) 858 .Case("exclude", MMToken::ExcludeKeyword) 859 .Case("explicit", MMToken::ExplicitKeyword) 860 .Case("export", MMToken::ExportKeyword) 861 .Case("framework", MMToken::FrameworkKeyword) 862 .Case("header", MMToken::HeaderKeyword) 863 .Case("link", MMToken::LinkKeyword) 864 .Case("module", MMToken::ModuleKeyword) 865 .Case("requires", MMToken::RequiresKeyword) 866 .Case("umbrella", MMToken::UmbrellaKeyword) 867 .Default(MMToken::Identifier); 868 break; 869 870 case tok::comma: 871 Tok.Kind = MMToken::Comma; 872 break; 873 874 case tok::eof: 875 Tok.Kind = MMToken::EndOfFile; 876 break; 877 878 case tok::l_brace: 879 Tok.Kind = MMToken::LBrace; 880 break; 881 882 case tok::l_square: 883 Tok.Kind = MMToken::LSquare; 884 break; 885 886 case tok::period: 887 Tok.Kind = MMToken::Period; 888 break; 889 890 case tok::r_brace: 891 Tok.Kind = MMToken::RBrace; 892 break; 893 894 case tok::r_square: 895 Tok.Kind = MMToken::RSquare; 896 break; 897 898 case tok::star: 899 Tok.Kind = MMToken::Star; 900 break; 901 902 case tok::string_literal: { 903 if (LToken.hasUDSuffix()) { 904 Diags.Report(LToken.getLocation(), diag::err_invalid_string_udl); 905 HadError = true; 906 goto retry; 907 } 908 909 // Parse the string literal. 910 LangOptions LangOpts; 911 StringLiteralParser StringLiteral(<oken, 1, SourceMgr, LangOpts, *Target); 912 if (StringLiteral.hadError) 913 goto retry; 914 915 // Copy the string literal into our string data allocator. 916 unsigned Length = StringLiteral.GetStringLength(); 917 char *Saved = StringData.Allocate<char>(Length + 1); 918 memcpy(Saved, StringLiteral.GetString().data(), Length); 919 Saved[Length] = 0; 920 921 // Form the token. 922 Tok.Kind = MMToken::StringLiteral; 923 Tok.StringData = Saved; 924 Tok.StringLength = Length; 925 break; 926 } 927 928 case tok::comment: 929 goto retry; 930 931 default: 932 Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token); 933 HadError = true; 934 goto retry; 935 } 936 937 return Result; 938 } 939 940 void ModuleMapParser::skipUntil(MMToken::TokenKind K) { 941 unsigned braceDepth = 0; 942 unsigned squareDepth = 0; 943 do { 944 switch (Tok.Kind) { 945 case MMToken::EndOfFile: 946 return; 947 948 case MMToken::LBrace: 949 if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 950 return; 951 952 ++braceDepth; 953 break; 954 955 case MMToken::LSquare: 956 if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 957 return; 958 959 ++squareDepth; 960 break; 961 962 case MMToken::RBrace: 963 if (braceDepth > 0) 964 --braceDepth; 965 else if (Tok.is(K)) 966 return; 967 break; 968 969 case MMToken::RSquare: 970 if (squareDepth > 0) 971 --squareDepth; 972 else if (Tok.is(K)) 973 return; 974 break; 975 976 default: 977 if (braceDepth == 0 && squareDepth == 0 && Tok.is(K)) 978 return; 979 break; 980 } 981 982 consumeToken(); 983 } while (true); 984 } 985 986 /// \brief Parse a module-id. 987 /// 988 /// module-id: 989 /// identifier 990 /// identifier '.' module-id 991 /// 992 /// \returns true if an error occurred, false otherwise. 993 bool ModuleMapParser::parseModuleId(ModuleId &Id) { 994 Id.clear(); 995 do { 996 if (Tok.is(MMToken::Identifier)) { 997 Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation())); 998 consumeToken(); 999 } else { 1000 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name); 1001 return true; 1002 } 1003 1004 if (!Tok.is(MMToken::Period)) 1005 break; 1006 1007 consumeToken(); 1008 } while (true); 1009 1010 return false; 1011 } 1012 1013 namespace { 1014 /// \brief Enumerates the known attributes. 1015 enum AttributeKind { 1016 /// \brief An unknown attribute. 1017 AT_unknown, 1018 /// \brief The 'system' attribute. 1019 AT_system, 1020 /// \brief The 'exhaustive' attribute. 1021 AT_exhaustive 1022 }; 1023 } 1024 1025 /// \brief Parse a module declaration. 1026 /// 1027 /// module-declaration: 1028 /// 'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt] 1029 /// { module-member* } 1030 /// 1031 /// module-member: 1032 /// requires-declaration 1033 /// header-declaration 1034 /// submodule-declaration 1035 /// export-declaration 1036 /// link-declaration 1037 /// 1038 /// submodule-declaration: 1039 /// module-declaration 1040 /// inferred-submodule-declaration 1041 void ModuleMapParser::parseModuleDecl() { 1042 assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) || 1043 Tok.is(MMToken::FrameworkKeyword)); 1044 // Parse 'explicit' or 'framework' keyword, if present. 1045 SourceLocation ExplicitLoc; 1046 bool Explicit = false; 1047 bool Framework = false; 1048 1049 // Parse 'explicit' keyword, if present. 1050 if (Tok.is(MMToken::ExplicitKeyword)) { 1051 ExplicitLoc = consumeToken(); 1052 Explicit = true; 1053 } 1054 1055 // Parse 'framework' keyword, if present. 1056 if (Tok.is(MMToken::FrameworkKeyword)) { 1057 consumeToken(); 1058 Framework = true; 1059 } 1060 1061 // Parse 'module' keyword. 1062 if (!Tok.is(MMToken::ModuleKeyword)) { 1063 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 1064 consumeToken(); 1065 HadError = true; 1066 return; 1067 } 1068 consumeToken(); // 'module' keyword 1069 1070 // If we have a wildcard for the module name, this is an inferred submodule. 1071 // Parse it. 1072 if (Tok.is(MMToken::Star)) 1073 return parseInferredModuleDecl(Framework, Explicit); 1074 1075 // Parse the module name. 1076 ModuleId Id; 1077 if (parseModuleId(Id)) { 1078 HadError = true; 1079 return; 1080 } 1081 1082 if (ActiveModule) { 1083 if (Id.size() > 1) { 1084 Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id) 1085 << SourceRange(Id.front().second, Id.back().second); 1086 1087 HadError = true; 1088 return; 1089 } 1090 } else if (Id.size() == 1 && Explicit) { 1091 // Top-level modules can't be explicit. 1092 Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level); 1093 Explicit = false; 1094 ExplicitLoc = SourceLocation(); 1095 HadError = true; 1096 } 1097 1098 Module *PreviousActiveModule = ActiveModule; 1099 if (Id.size() > 1) { 1100 // This module map defines a submodule. Go find the module of which it 1101 // is a submodule. 1102 ActiveModule = 0; 1103 for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) { 1104 if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) { 1105 ActiveModule = Next; 1106 continue; 1107 } 1108 1109 if (ActiveModule) { 1110 Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified) 1111 << Id[I].first << ActiveModule->getTopLevelModule(); 1112 } else { 1113 Diags.Report(Id[I].second, diag::err_mmap_expected_module_name); 1114 } 1115 HadError = true; 1116 return; 1117 } 1118 } 1119 1120 StringRef ModuleName = Id.back().first; 1121 SourceLocation ModuleNameLoc = Id.back().second; 1122 1123 // Parse the optional attribute list. 1124 Attributes Attrs; 1125 parseOptionalAttributes(Attrs); 1126 1127 // Parse the opening brace. 1128 if (!Tok.is(MMToken::LBrace)) { 1129 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace) 1130 << ModuleName; 1131 HadError = true; 1132 return; 1133 } 1134 SourceLocation LBraceLoc = consumeToken(); 1135 1136 // Determine whether this (sub)module has already been defined. 1137 if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) { 1138 if (Existing->DefinitionLoc.isInvalid() && !ActiveModule) { 1139 // Skip the module definition. 1140 skipUntil(MMToken::RBrace); 1141 if (Tok.is(MMToken::RBrace)) 1142 consumeToken(); 1143 else { 1144 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 1145 Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 1146 HadError = true; 1147 } 1148 return; 1149 } 1150 1151 Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition) 1152 << ModuleName; 1153 Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition); 1154 1155 // Skip the module definition. 1156 skipUntil(MMToken::RBrace); 1157 if (Tok.is(MMToken::RBrace)) 1158 consumeToken(); 1159 1160 HadError = true; 1161 return; 1162 } 1163 1164 // Start defining this module. 1165 ActiveModule = Map.findOrCreateModule(ModuleName, ActiveModule, Framework, 1166 Explicit).first; 1167 ActiveModule->DefinitionLoc = ModuleNameLoc; 1168 if (Attrs.IsSystem) 1169 ActiveModule->IsSystem = true; 1170 1171 bool Done = false; 1172 do { 1173 switch (Tok.Kind) { 1174 case MMToken::EndOfFile: 1175 case MMToken::RBrace: 1176 Done = true; 1177 break; 1178 1179 case MMToken::ConfigMacros: 1180 parseConfigMacros(); 1181 break; 1182 1183 case MMToken::Conflict: 1184 parseConflict(); 1185 break; 1186 1187 case MMToken::ExplicitKeyword: 1188 case MMToken::FrameworkKeyword: 1189 case MMToken::ModuleKeyword: 1190 parseModuleDecl(); 1191 break; 1192 1193 case MMToken::ExportKeyword: 1194 parseExportDecl(); 1195 break; 1196 1197 case MMToken::RequiresKeyword: 1198 parseRequiresDecl(); 1199 break; 1200 1201 case MMToken::UmbrellaKeyword: { 1202 SourceLocation UmbrellaLoc = consumeToken(); 1203 if (Tok.is(MMToken::HeaderKeyword)) 1204 parseHeaderDecl(UmbrellaLoc, SourceLocation()); 1205 else 1206 parseUmbrellaDirDecl(UmbrellaLoc); 1207 break; 1208 } 1209 1210 case MMToken::ExcludeKeyword: { 1211 SourceLocation ExcludeLoc = consumeToken(); 1212 if (Tok.is(MMToken::HeaderKeyword)) { 1213 parseHeaderDecl(SourceLocation(), ExcludeLoc); 1214 } else { 1215 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 1216 << "exclude"; 1217 } 1218 break; 1219 } 1220 1221 case MMToken::HeaderKeyword: 1222 parseHeaderDecl(SourceLocation(), SourceLocation()); 1223 break; 1224 1225 case MMToken::LinkKeyword: 1226 parseLinkDecl(); 1227 break; 1228 1229 default: 1230 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member); 1231 consumeToken(); 1232 break; 1233 } 1234 } while (!Done); 1235 1236 if (Tok.is(MMToken::RBrace)) 1237 consumeToken(); 1238 else { 1239 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 1240 Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 1241 HadError = true; 1242 } 1243 1244 // If the active module is a top-level framework, and there are no link 1245 // libraries, automatically link against the framework. 1246 if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() && 1247 ActiveModule->LinkLibraries.empty()) { 1248 inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager()); 1249 } 1250 1251 // We're done parsing this module. Pop back to the previous module. 1252 ActiveModule = PreviousActiveModule; 1253 } 1254 1255 /// \brief Parse a requires declaration. 1256 /// 1257 /// requires-declaration: 1258 /// 'requires' feature-list 1259 /// 1260 /// feature-list: 1261 /// identifier ',' feature-list 1262 /// identifier 1263 void ModuleMapParser::parseRequiresDecl() { 1264 assert(Tok.is(MMToken::RequiresKeyword)); 1265 1266 // Parse 'requires' keyword. 1267 consumeToken(); 1268 1269 // Parse the feature-list. 1270 do { 1271 if (!Tok.is(MMToken::Identifier)) { 1272 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature); 1273 HadError = true; 1274 return; 1275 } 1276 1277 // Consume the feature name. 1278 std::string Feature = Tok.getString(); 1279 consumeToken(); 1280 1281 // Add this feature. 1282 ActiveModule->addRequirement(Feature, Map.LangOpts, *Map.Target); 1283 1284 if (!Tok.is(MMToken::Comma)) 1285 break; 1286 1287 // Consume the comma. 1288 consumeToken(); 1289 } while (true); 1290 } 1291 1292 /// \brief Append to \p Paths the set of paths needed to get to the 1293 /// subframework in which the given module lives. 1294 static void appendSubframeworkPaths(Module *Mod, 1295 SmallVectorImpl<char> &Path) { 1296 // Collect the framework names from the given module to the top-level module. 1297 SmallVector<StringRef, 2> Paths; 1298 for (; Mod; Mod = Mod->Parent) { 1299 if (Mod->IsFramework) 1300 Paths.push_back(Mod->Name); 1301 } 1302 1303 if (Paths.empty()) 1304 return; 1305 1306 // Add Frameworks/Name.framework for each subframework. 1307 for (unsigned I = Paths.size() - 1; I != 0; --I) { 1308 llvm::sys::path::append(Path, "Frameworks"); 1309 llvm::sys::path::append(Path, Paths[I-1] + ".framework"); 1310 } 1311 } 1312 1313 /// \brief Parse a header declaration. 1314 /// 1315 /// header-declaration: 1316 /// 'umbrella'[opt] 'header' string-literal 1317 /// 'exclude'[opt] 'header' string-literal 1318 void ModuleMapParser::parseHeaderDecl(SourceLocation UmbrellaLoc, 1319 SourceLocation ExcludeLoc) { 1320 assert(Tok.is(MMToken::HeaderKeyword)); 1321 consumeToken(); 1322 1323 bool Umbrella = UmbrellaLoc.isValid(); 1324 bool Exclude = ExcludeLoc.isValid(); 1325 assert(!(Umbrella && Exclude) && "Cannot have both 'umbrella' and 'exclude'"); 1326 // Parse the header name. 1327 if (!Tok.is(MMToken::StringLiteral)) { 1328 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 1329 << "header"; 1330 HadError = true; 1331 return; 1332 } 1333 std::string FileName = Tok.getString(); 1334 SourceLocation FileNameLoc = consumeToken(); 1335 1336 // Check whether we already have an umbrella. 1337 if (Umbrella && ActiveModule->Umbrella) { 1338 Diags.Report(FileNameLoc, diag::err_mmap_umbrella_clash) 1339 << ActiveModule->getFullModuleName(); 1340 HadError = true; 1341 return; 1342 } 1343 1344 // Look for this file. 1345 const FileEntry *File = 0; 1346 const FileEntry *BuiltinFile = 0; 1347 SmallString<128> PathName; 1348 if (llvm::sys::path::is_absolute(FileName)) { 1349 PathName = FileName; 1350 File = SourceMgr.getFileManager().getFile(PathName); 1351 } else if (const DirectoryEntry *Dir = getOverriddenHeaderSearchDir()) { 1352 PathName = Dir->getName(); 1353 llvm::sys::path::append(PathName, FileName); 1354 File = SourceMgr.getFileManager().getFile(PathName); 1355 } else { 1356 // Search for the header file within the search directory. 1357 PathName = Directory->getName(); 1358 unsigned PathLength = PathName.size(); 1359 1360 if (ActiveModule->isPartOfFramework()) { 1361 appendSubframeworkPaths(ActiveModule, PathName); 1362 1363 // Check whether this file is in the public headers. 1364 llvm::sys::path::append(PathName, "Headers"); 1365 llvm::sys::path::append(PathName, FileName); 1366 File = SourceMgr.getFileManager().getFile(PathName); 1367 1368 if (!File) { 1369 // Check whether this file is in the private headers. 1370 PathName.resize(PathLength); 1371 llvm::sys::path::append(PathName, "PrivateHeaders"); 1372 llvm::sys::path::append(PathName, FileName); 1373 File = SourceMgr.getFileManager().getFile(PathName); 1374 } 1375 } else { 1376 // Lookup for normal headers. 1377 llvm::sys::path::append(PathName, FileName); 1378 File = SourceMgr.getFileManager().getFile(PathName); 1379 1380 // If this is a system module with a top-level header, this header 1381 // may have a counterpart (or replacement) in the set of headers 1382 // supplied by Clang. Find that builtin header. 1383 if (ActiveModule->IsSystem && !Umbrella && BuiltinIncludeDir && 1384 BuiltinIncludeDir != Directory && isBuiltinHeader(FileName)) { 1385 SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName()); 1386 llvm::sys::path::append(BuiltinPathName, FileName); 1387 BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName); 1388 1389 // If Clang supplies this header but the underlying system does not, 1390 // just silently swap in our builtin version. Otherwise, we'll end 1391 // up adding both (later). 1392 if (!File && BuiltinFile) { 1393 File = BuiltinFile; 1394 BuiltinFile = 0; 1395 } 1396 } 1397 } 1398 } 1399 1400 // FIXME: We shouldn't be eagerly stat'ing every file named in a module map. 1401 // Come up with a lazy way to do this. 1402 if (File) { 1403 if (ModuleMap::KnownHeader OwningModule = Map.Headers[File]) { 1404 Diags.Report(FileNameLoc, diag::err_mmap_header_conflict) 1405 << FileName << OwningModule.getModule()->getFullModuleName(); 1406 HadError = true; 1407 } else if (Umbrella) { 1408 const DirectoryEntry *UmbrellaDir = File->getDir(); 1409 if (Module *UmbrellaModule = Map.UmbrellaDirs[UmbrellaDir]) { 1410 Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash) 1411 << UmbrellaModule->getFullModuleName(); 1412 HadError = true; 1413 } else { 1414 // Record this umbrella header. 1415 Map.setUmbrellaHeader(ActiveModule, File); 1416 } 1417 } else { 1418 // Record this header. 1419 Map.addHeader(ActiveModule, File, Exclude); 1420 1421 // If there is a builtin counterpart to this file, add it now. 1422 if (BuiltinFile) 1423 Map.addHeader(ActiveModule, BuiltinFile, Exclude); 1424 } 1425 } else if (!Exclude) { 1426 // Ignore excluded header files. They're optional anyway. 1427 1428 Diags.Report(FileNameLoc, diag::err_mmap_header_not_found) 1429 << Umbrella << FileName; 1430 HadError = true; 1431 } 1432 } 1433 1434 /// \brief Parse an umbrella directory declaration. 1435 /// 1436 /// umbrella-dir-declaration: 1437 /// umbrella string-literal 1438 void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) { 1439 // Parse the directory name. 1440 if (!Tok.is(MMToken::StringLiteral)) { 1441 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 1442 << "umbrella"; 1443 HadError = true; 1444 return; 1445 } 1446 1447 std::string DirName = Tok.getString(); 1448 SourceLocation DirNameLoc = consumeToken(); 1449 1450 // Check whether we already have an umbrella. 1451 if (ActiveModule->Umbrella) { 1452 Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash) 1453 << ActiveModule->getFullModuleName(); 1454 HadError = true; 1455 return; 1456 } 1457 1458 // Look for this file. 1459 const DirectoryEntry *Dir = 0; 1460 if (llvm::sys::path::is_absolute(DirName)) 1461 Dir = SourceMgr.getFileManager().getDirectory(DirName); 1462 else { 1463 SmallString<128> PathName; 1464 PathName = Directory->getName(); 1465 llvm::sys::path::append(PathName, DirName); 1466 Dir = SourceMgr.getFileManager().getDirectory(PathName); 1467 } 1468 1469 if (!Dir) { 1470 Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found) 1471 << DirName; 1472 HadError = true; 1473 return; 1474 } 1475 1476 if (Module *OwningModule = Map.UmbrellaDirs[Dir]) { 1477 Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash) 1478 << OwningModule->getFullModuleName(); 1479 HadError = true; 1480 return; 1481 } 1482 1483 // Record this umbrella directory. 1484 Map.setUmbrellaDir(ActiveModule, Dir); 1485 } 1486 1487 /// \brief Parse a module export declaration. 1488 /// 1489 /// export-declaration: 1490 /// 'export' wildcard-module-id 1491 /// 1492 /// wildcard-module-id: 1493 /// identifier 1494 /// '*' 1495 /// identifier '.' wildcard-module-id 1496 void ModuleMapParser::parseExportDecl() { 1497 assert(Tok.is(MMToken::ExportKeyword)); 1498 SourceLocation ExportLoc = consumeToken(); 1499 1500 // Parse the module-id with an optional wildcard at the end. 1501 ModuleId ParsedModuleId; 1502 bool Wildcard = false; 1503 do { 1504 if (Tok.is(MMToken::Identifier)) { 1505 ParsedModuleId.push_back(std::make_pair(Tok.getString(), 1506 Tok.getLocation())); 1507 consumeToken(); 1508 1509 if (Tok.is(MMToken::Period)) { 1510 consumeToken(); 1511 continue; 1512 } 1513 1514 break; 1515 } 1516 1517 if(Tok.is(MMToken::Star)) { 1518 Wildcard = true; 1519 consumeToken(); 1520 break; 1521 } 1522 1523 Diags.Report(Tok.getLocation(), diag::err_mmap_export_module_id); 1524 HadError = true; 1525 return; 1526 } while (true); 1527 1528 Module::UnresolvedExportDecl Unresolved = { 1529 ExportLoc, ParsedModuleId, Wildcard 1530 }; 1531 ActiveModule->UnresolvedExports.push_back(Unresolved); 1532 } 1533 1534 /// \brief Parse a link declaration. 1535 /// 1536 /// module-declaration: 1537 /// 'link' 'framework'[opt] string-literal 1538 void ModuleMapParser::parseLinkDecl() { 1539 assert(Tok.is(MMToken::LinkKeyword)); 1540 SourceLocation LinkLoc = consumeToken(); 1541 1542 // Parse the optional 'framework' keyword. 1543 bool IsFramework = false; 1544 if (Tok.is(MMToken::FrameworkKeyword)) { 1545 consumeToken(); 1546 IsFramework = true; 1547 } 1548 1549 // Parse the library name 1550 if (!Tok.is(MMToken::StringLiteral)) { 1551 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_library_name) 1552 << IsFramework << SourceRange(LinkLoc); 1553 HadError = true; 1554 return; 1555 } 1556 1557 std::string LibraryName = Tok.getString(); 1558 consumeToken(); 1559 ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName, 1560 IsFramework)); 1561 } 1562 1563 /// \brief Parse a configuration macro declaration. 1564 /// 1565 /// module-declaration: 1566 /// 'config_macros' attributes[opt] config-macro-list? 1567 /// 1568 /// config-macro-list: 1569 /// identifier (',' identifier)? 1570 void ModuleMapParser::parseConfigMacros() { 1571 assert(Tok.is(MMToken::ConfigMacros)); 1572 SourceLocation ConfigMacrosLoc = consumeToken(); 1573 1574 // Only top-level modules can have configuration macros. 1575 if (ActiveModule->Parent) { 1576 Diags.Report(ConfigMacrosLoc, diag::err_mmap_config_macro_submodule); 1577 } 1578 1579 // Parse the optional attributes. 1580 Attributes Attrs; 1581 parseOptionalAttributes(Attrs); 1582 if (Attrs.IsExhaustive && !ActiveModule->Parent) { 1583 ActiveModule->ConfigMacrosExhaustive = true; 1584 } 1585 1586 // If we don't have an identifier, we're done. 1587 if (!Tok.is(MMToken::Identifier)) 1588 return; 1589 1590 // Consume the first identifier. 1591 if (!ActiveModule->Parent) { 1592 ActiveModule->ConfigMacros.push_back(Tok.getString().str()); 1593 } 1594 consumeToken(); 1595 1596 do { 1597 // If there's a comma, consume it. 1598 if (!Tok.is(MMToken::Comma)) 1599 break; 1600 consumeToken(); 1601 1602 // We expect to see a macro name here. 1603 if (!Tok.is(MMToken::Identifier)) { 1604 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_config_macro); 1605 break; 1606 } 1607 1608 // Consume the macro name. 1609 if (!ActiveModule->Parent) { 1610 ActiveModule->ConfigMacros.push_back(Tok.getString().str()); 1611 } 1612 consumeToken(); 1613 } while (true); 1614 } 1615 1616 /// \brief Format a module-id into a string. 1617 static std::string formatModuleId(const ModuleId &Id) { 1618 std::string result; 1619 { 1620 llvm::raw_string_ostream OS(result); 1621 1622 for (unsigned I = 0, N = Id.size(); I != N; ++I) { 1623 if (I) 1624 OS << "."; 1625 OS << Id[I].first; 1626 } 1627 } 1628 1629 return result; 1630 } 1631 1632 /// \brief Parse a conflict declaration. 1633 /// 1634 /// module-declaration: 1635 /// 'conflict' module-id ',' string-literal 1636 void ModuleMapParser::parseConflict() { 1637 assert(Tok.is(MMToken::Conflict)); 1638 SourceLocation ConflictLoc = consumeToken(); 1639 Module::UnresolvedConflict Conflict; 1640 1641 // Parse the module-id. 1642 if (parseModuleId(Conflict.Id)) 1643 return; 1644 1645 // Parse the ','. 1646 if (!Tok.is(MMToken::Comma)) { 1647 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_comma) 1648 << SourceRange(ConflictLoc); 1649 return; 1650 } 1651 consumeToken(); 1652 1653 // Parse the message. 1654 if (!Tok.is(MMToken::StringLiteral)) { 1655 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_message) 1656 << formatModuleId(Conflict.Id); 1657 return; 1658 } 1659 Conflict.Message = Tok.getString().str(); 1660 consumeToken(); 1661 1662 // Add this unresolved conflict. 1663 ActiveModule->UnresolvedConflicts.push_back(Conflict); 1664 } 1665 1666 /// \brief Parse an inferred module declaration (wildcard modules). 1667 /// 1668 /// module-declaration: 1669 /// 'explicit'[opt] 'framework'[opt] 'module' * attributes[opt] 1670 /// { inferred-module-member* } 1671 /// 1672 /// inferred-module-member: 1673 /// 'export' '*' 1674 /// 'exclude' identifier 1675 void ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) { 1676 assert(Tok.is(MMToken::Star)); 1677 SourceLocation StarLoc = consumeToken(); 1678 bool Failed = false; 1679 1680 // Inferred modules must be submodules. 1681 if (!ActiveModule && !Framework) { 1682 Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule); 1683 Failed = true; 1684 } 1685 1686 if (ActiveModule) { 1687 // Inferred modules must have umbrella directories. 1688 if (!Failed && !ActiveModule->getUmbrellaDir()) { 1689 Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella); 1690 Failed = true; 1691 } 1692 1693 // Check for redefinition of an inferred module. 1694 if (!Failed && ActiveModule->InferSubmodules) { 1695 Diags.Report(StarLoc, diag::err_mmap_inferred_redef); 1696 if (ActiveModule->InferredSubmoduleLoc.isValid()) 1697 Diags.Report(ActiveModule->InferredSubmoduleLoc, 1698 diag::note_mmap_prev_definition); 1699 Failed = true; 1700 } 1701 1702 // Check for the 'framework' keyword, which is not permitted here. 1703 if (Framework) { 1704 Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule); 1705 Framework = false; 1706 } 1707 } else if (Explicit) { 1708 Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework); 1709 Explicit = false; 1710 } 1711 1712 // If there were any problems with this inferred submodule, skip its body. 1713 if (Failed) { 1714 if (Tok.is(MMToken::LBrace)) { 1715 consumeToken(); 1716 skipUntil(MMToken::RBrace); 1717 if (Tok.is(MMToken::RBrace)) 1718 consumeToken(); 1719 } 1720 HadError = true; 1721 return; 1722 } 1723 1724 // Parse optional attributes. 1725 Attributes Attrs; 1726 parseOptionalAttributes(Attrs); 1727 1728 if (ActiveModule) { 1729 // Note that we have an inferred submodule. 1730 ActiveModule->InferSubmodules = true; 1731 ActiveModule->InferredSubmoduleLoc = StarLoc; 1732 ActiveModule->InferExplicitSubmodules = Explicit; 1733 } else { 1734 // We'll be inferring framework modules for this directory. 1735 Map.InferredDirectories[Directory].InferModules = true; 1736 Map.InferredDirectories[Directory].InferSystemModules = Attrs.IsSystem; 1737 } 1738 1739 // Parse the opening brace. 1740 if (!Tok.is(MMToken::LBrace)) { 1741 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard); 1742 HadError = true; 1743 return; 1744 } 1745 SourceLocation LBraceLoc = consumeToken(); 1746 1747 // Parse the body of the inferred submodule. 1748 bool Done = false; 1749 do { 1750 switch (Tok.Kind) { 1751 case MMToken::EndOfFile: 1752 case MMToken::RBrace: 1753 Done = true; 1754 break; 1755 1756 case MMToken::ExcludeKeyword: { 1757 if (ActiveModule) { 1758 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 1759 << (ActiveModule != 0); 1760 consumeToken(); 1761 break; 1762 } 1763 1764 consumeToken(); 1765 if (!Tok.is(MMToken::Identifier)) { 1766 Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name); 1767 break; 1768 } 1769 1770 Map.InferredDirectories[Directory].ExcludedModules 1771 .push_back(Tok.getString()); 1772 consumeToken(); 1773 break; 1774 } 1775 1776 case MMToken::ExportKeyword: 1777 if (!ActiveModule) { 1778 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 1779 << (ActiveModule != 0); 1780 consumeToken(); 1781 break; 1782 } 1783 1784 consumeToken(); 1785 if (Tok.is(MMToken::Star)) 1786 ActiveModule->InferExportWildcard = true; 1787 else 1788 Diags.Report(Tok.getLocation(), 1789 diag::err_mmap_expected_export_wildcard); 1790 consumeToken(); 1791 break; 1792 1793 case MMToken::ExplicitKeyword: 1794 case MMToken::ModuleKeyword: 1795 case MMToken::HeaderKeyword: 1796 case MMToken::UmbrellaKeyword: 1797 default: 1798 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 1799 << (ActiveModule != 0); 1800 consumeToken(); 1801 break; 1802 } 1803 } while (!Done); 1804 1805 if (Tok.is(MMToken::RBrace)) 1806 consumeToken(); 1807 else { 1808 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 1809 Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 1810 HadError = true; 1811 } 1812 } 1813 1814 /// \brief Parse optional attributes. 1815 /// 1816 /// attributes: 1817 /// attribute attributes 1818 /// attribute 1819 /// 1820 /// attribute: 1821 /// [ identifier ] 1822 /// 1823 /// \param Attrs Will be filled in with the parsed attributes. 1824 /// 1825 /// \returns true if an error occurred, false otherwise. 1826 bool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) { 1827 bool HadError = false; 1828 1829 while (Tok.is(MMToken::LSquare)) { 1830 // Consume the '['. 1831 SourceLocation LSquareLoc = consumeToken(); 1832 1833 // Check whether we have an attribute name here. 1834 if (!Tok.is(MMToken::Identifier)) { 1835 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute); 1836 skipUntil(MMToken::RSquare); 1837 if (Tok.is(MMToken::RSquare)) 1838 consumeToken(); 1839 HadError = true; 1840 } 1841 1842 // Decode the attribute name. 1843 AttributeKind Attribute 1844 = llvm::StringSwitch<AttributeKind>(Tok.getString()) 1845 .Case("exhaustive", AT_exhaustive) 1846 .Case("system", AT_system) 1847 .Default(AT_unknown); 1848 switch (Attribute) { 1849 case AT_unknown: 1850 Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute) 1851 << Tok.getString(); 1852 break; 1853 1854 case AT_system: 1855 Attrs.IsSystem = true; 1856 break; 1857 1858 case AT_exhaustive: 1859 Attrs.IsExhaustive = true; 1860 break; 1861 } 1862 consumeToken(); 1863 1864 // Consume the ']'. 1865 if (!Tok.is(MMToken::RSquare)) { 1866 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare); 1867 Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match); 1868 skipUntil(MMToken::RSquare); 1869 HadError = true; 1870 } 1871 1872 if (Tok.is(MMToken::RSquare)) 1873 consumeToken(); 1874 } 1875 1876 return HadError; 1877 } 1878 1879 /// \brief If there is a specific header search directory due the presence 1880 /// of an umbrella directory, retrieve that directory. Otherwise, returns null. 1881 const DirectoryEntry *ModuleMapParser::getOverriddenHeaderSearchDir() { 1882 for (Module *Mod = ActiveModule; Mod; Mod = Mod->Parent) { 1883 // If we have an umbrella directory, use that. 1884 if (Mod->hasUmbrellaDir()) 1885 return Mod->getUmbrellaDir(); 1886 1887 // If we have a framework directory, stop looking. 1888 if (Mod->IsFramework) 1889 return 0; 1890 } 1891 1892 return 0; 1893 } 1894 1895 /// \brief Parse a module map file. 1896 /// 1897 /// module-map-file: 1898 /// module-declaration* 1899 bool ModuleMapParser::parseModuleMapFile() { 1900 do { 1901 switch (Tok.Kind) { 1902 case MMToken::EndOfFile: 1903 return HadError; 1904 1905 case MMToken::ExplicitKeyword: 1906 case MMToken::ModuleKeyword: 1907 case MMToken::FrameworkKeyword: 1908 parseModuleDecl(); 1909 break; 1910 1911 case MMToken::Comma: 1912 case MMToken::ConfigMacros: 1913 case MMToken::Conflict: 1914 case MMToken::ExcludeKeyword: 1915 case MMToken::ExportKeyword: 1916 case MMToken::HeaderKeyword: 1917 case MMToken::Identifier: 1918 case MMToken::LBrace: 1919 case MMToken::LinkKeyword: 1920 case MMToken::LSquare: 1921 case MMToken::Period: 1922 case MMToken::RBrace: 1923 case MMToken::RSquare: 1924 case MMToken::RequiresKeyword: 1925 case MMToken::Star: 1926 case MMToken::StringLiteral: 1927 case MMToken::UmbrellaKeyword: 1928 Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 1929 HadError = true; 1930 consumeToken(); 1931 break; 1932 } 1933 } while (true); 1934 } 1935 1936 bool ModuleMap::parseModuleMapFile(const FileEntry *File) { 1937 llvm::DenseMap<const FileEntry *, bool>::iterator Known 1938 = ParsedModuleMap.find(File); 1939 if (Known != ParsedModuleMap.end()) 1940 return Known->second; 1941 1942 assert(Target != 0 && "Missing target information"); 1943 FileID ID = SourceMgr->createFileID(File, SourceLocation(), SrcMgr::C_User); 1944 const llvm::MemoryBuffer *Buffer = SourceMgr->getBuffer(ID); 1945 if (!Buffer) 1946 return ParsedModuleMap[File] = true; 1947 1948 // Parse this module map file. 1949 Lexer L(ID, SourceMgr->getBuffer(ID), *SourceMgr, MMapLangOpts); 1950 Diags->getClient()->BeginSourceFile(MMapLangOpts); 1951 ModuleMapParser Parser(L, *SourceMgr, Target, *Diags, *this, File->getDir(), 1952 BuiltinIncludeDir); 1953 bool Result = Parser.parseModuleMapFile(); 1954 Diags->getClient()->EndSourceFile(); 1955 ParsedModuleMap[File] = Result; 1956 return Result; 1957 } 1958