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