ModuleMap.cpp revision f7ccbad5d9949e7ddd1cbef43d482553b811e026
1a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//===--- ModuleMap.cpp - Describe the layout of modules ---------*- C++ -*-===// 2a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// 3a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// The LLVM Compiler Infrastructure 4a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// 5a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// This file is distributed under the University of Illinois Open Source 6a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// License. See LICENSE.TXT for details. 7a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// 8a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//===----------------------------------------------------------------------===// 9a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// 10a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// This file defines the ModuleMap implementation, which describes the layout 11a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// of a module as it relates to headers. 12a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// 13a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//===----------------------------------------------------------------------===// 14a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Lex/ModuleMap.h" 15a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Lex/Lexer.h" 16a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Lex/LiteralSupport.h" 17a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Lex/LexDiagnostic.h" 18a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/Diagnostic.h" 19a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/FileManager.h" 20a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/TargetInfo.h" 21a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/TargetOptions.h" 22a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/Allocator.h" 23ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor#include "llvm/Support/FileSystem.h" 24a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/Host.h" 258b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor#include "llvm/Support/PathV2.h" 26a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/raw_ostream.h" 27a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/ADT/StringRef.h" 28a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/ADT/StringSwitch.h" 29a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorusing namespace clang; 30a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 3190db26000aefe9335370013eec64c85232d80227Douglas GregorModule::ExportDecl 3290db26000aefe9335370013eec64c85232d80227Douglas GregorModuleMap::resolveExport(Module *Mod, 3390db26000aefe9335370013eec64c85232d80227Douglas Gregor const Module::UnresolvedExportDecl &Unresolved, 3490db26000aefe9335370013eec64c85232d80227Douglas Gregor bool Complain) { 350adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor // We may have just a wildcard. 360adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor if (Unresolved.Id.empty()) { 370adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor assert(Unresolved.Wildcard && "Invalid unresolved export"); 380adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor return Module::ExportDecl(0, true); 390adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor } 400adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor 4190db26000aefe9335370013eec64c85232d80227Douglas Gregor // Find the starting module. 4290db26000aefe9335370013eec64c85232d80227Douglas Gregor Module *Context = lookupModuleUnqualified(Unresolved.Id[0].first, Mod); 4390db26000aefe9335370013eec64c85232d80227Douglas Gregor if (!Context) { 4490db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Complain) 4590db26000aefe9335370013eec64c85232d80227Douglas Gregor Diags->Report(Unresolved.Id[0].second, 4690db26000aefe9335370013eec64c85232d80227Douglas Gregor diag::err_mmap_missing_module_unqualified) 4790db26000aefe9335370013eec64c85232d80227Douglas Gregor << Unresolved.Id[0].first << Mod->getFullModuleName(); 4890db26000aefe9335370013eec64c85232d80227Douglas Gregor 4990db26000aefe9335370013eec64c85232d80227Douglas Gregor return Module::ExportDecl(); 5090db26000aefe9335370013eec64c85232d80227Douglas Gregor } 5190db26000aefe9335370013eec64c85232d80227Douglas Gregor 5290db26000aefe9335370013eec64c85232d80227Douglas Gregor // Dig into the module path. 5390db26000aefe9335370013eec64c85232d80227Douglas Gregor for (unsigned I = 1, N = Unresolved.Id.size(); I != N; ++I) { 5490db26000aefe9335370013eec64c85232d80227Douglas Gregor Module *Sub = lookupModuleQualified(Unresolved.Id[I].first, 5590db26000aefe9335370013eec64c85232d80227Douglas Gregor Context); 5690db26000aefe9335370013eec64c85232d80227Douglas Gregor if (!Sub) { 5790db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Complain) 5890db26000aefe9335370013eec64c85232d80227Douglas Gregor Diags->Report(Unresolved.Id[I].second, 5990db26000aefe9335370013eec64c85232d80227Douglas Gregor diag::err_mmap_missing_module_qualified) 6090db26000aefe9335370013eec64c85232d80227Douglas Gregor << Unresolved.Id[I].first << Context->getFullModuleName() 6190db26000aefe9335370013eec64c85232d80227Douglas Gregor << SourceRange(Unresolved.Id[0].second, Unresolved.Id[I-1].second); 6290db26000aefe9335370013eec64c85232d80227Douglas Gregor 6390db26000aefe9335370013eec64c85232d80227Douglas Gregor return Module::ExportDecl(); 6490db26000aefe9335370013eec64c85232d80227Douglas Gregor } 6590db26000aefe9335370013eec64c85232d80227Douglas Gregor 6690db26000aefe9335370013eec64c85232d80227Douglas Gregor Context = Sub; 6790db26000aefe9335370013eec64c85232d80227Douglas Gregor } 6890db26000aefe9335370013eec64c85232d80227Douglas Gregor 6990db26000aefe9335370013eec64c85232d80227Douglas Gregor return Module::ExportDecl(Context, Unresolved.Wildcard); 7090db26000aefe9335370013eec64c85232d80227Douglas Gregor} 7190db26000aefe9335370013eec64c85232d80227Douglas Gregor 7251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas GregorModuleMap::ModuleMap(FileManager &FileMgr, const DiagnosticConsumer &DC, 73dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor const LangOptions &LangOpts, const TargetInfo *Target) 742f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor : LangOpts(LangOpts), Target(Target), BuiltinIncludeDir(0) 7551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor{ 76a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs); 77a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags = llvm::IntrusiveRefCntPtr<DiagnosticsEngine>( 78a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor new DiagnosticsEngine(DiagIDs)); 79a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags->setClient(DC.clone(*Diags), /*ShouldOwnClient=*/true); 80a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceMgr = new SourceManager(*Diags, FileMgr); 81a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 82a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 83a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorModuleMap::~ModuleMap() { 8409fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor for (llvm::StringMap<Module *>::iterator I = Modules.begin(), 8509fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor IEnd = Modules.end(); 8609fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor I != IEnd; ++I) { 8709fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor delete I->getValue(); 8809fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor } 8909fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor 90a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor delete SourceMgr; 91a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 92a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 93dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregorvoid ModuleMap::setTarget(const TargetInfo &Target) { 94dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor assert((!this->Target || this->Target == &Target) && 95dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor "Improper target override"); 96dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor this->Target = &Target; 97dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor} 98dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor 991a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *ModuleMap::findModuleForHeader(const FileEntry *File) { 10065f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor llvm::DenseMap<const FileEntry *, Module *>::iterator Known 10165f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor = Headers.find(File); 10251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (Known != Headers.end()) { 10351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // If a header corresponds to an unavailable module, don't report 10451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // that it maps to anything. 10551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Known->second->isAvailable()) 10651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return 0; 10751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 10865f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor return Known->second; 10951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 11065f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor 111adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor const DirectoryEntry *Dir = File->getDir(); 112adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor llvm::SmallVector<const DirectoryEntry *, 2> SkippedDirs; 113adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor StringRef DirName = Dir->getName(); 114e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 115e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Keep walking up the directory hierarchy, looking for a directory with 116e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // an umbrella header. 117e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor do { 118e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir 119e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor = UmbrellaDirs.find(Dir); 120adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor if (KnownDir != UmbrellaDirs.end()) { 121adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor Module *Result = KnownDir->second; 1229f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor 1239f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor // Search up the module stack until we find a module with an umbrella 12410694cee2588442bee1e717f5042c58ffee25279Douglas Gregor // directory. 1259f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor Module *UmbrellaModule = Result; 12610694cee2588442bee1e717f5042c58ffee25279Douglas Gregor while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent) 1279f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor UmbrellaModule = UmbrellaModule->Parent; 12851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 1299f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor if (UmbrellaModule->InferSubmodules) { 130e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Infer submodules for each of the directories we found between 131e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // the directory of the umbrella header and the directory where 132e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // the actual header is located. 13323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor bool Explicit = UmbrellaModule->InferExplicitSubmodules; 134e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 1356a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor for (unsigned I = SkippedDirs.size(); I != 0; --I) { 136e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Find or create the module that corresponds to this directory name. 137e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor StringRef Name = llvm::sys::path::stem(SkippedDirs[I-1]->getName()); 138e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result = findOrCreateModule(Name, Result, /*IsFramework=*/false, 13923af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Explicit).first; 140e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 141e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Associate the module and the directory. 142e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor UmbrellaDirs[SkippedDirs[I-1]] = Result; 143e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 144e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // If inferred submodules export everything they import, add a 145e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // wildcard to the set of exports. 1469f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor if (UmbrellaModule->InferExportWildcard && Result->Exports.empty()) 147e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->Exports.push_back(Module::ExportDecl(0, true)); 148e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } 149e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 150e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Infer a submodule with the same name as this header file. 151e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor StringRef Name = llvm::sys::path::stem(File->getName()); 152e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result = findOrCreateModule(Name, Result, /*IsFramework=*/false, 15323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Explicit).first; 154e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 155e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // If inferred submodules export everything they import, add a 156e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // wildcard to the set of exports. 1579f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor if (UmbrellaModule->InferExportWildcard && Result->Exports.empty()) 158e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->Exports.push_back(Module::ExportDecl(0, true)); 159e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } else { 160e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Record each of the directories we stepped through as being part of 161e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // the module we found, since the umbrella header covers them all. 162e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I) 163e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor UmbrellaDirs[SkippedDirs[I]] = Result; 164e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } 165adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor 166e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Headers[File] = Result; 16751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 16851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // If a header corresponds to an unavailable module, don't report 16951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // that it maps to anything. 17051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Result->isAvailable()) 17151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return 0; 17251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 173adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor return Result; 174adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor } 175adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor 176adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor SkippedDirs.push_back(Dir); 177e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 178e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Retrieve our parent path. 179e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor DirName = llvm::sys::path::parent_path(DirName); 180e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor if (DirName.empty()) 181e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor break; 182e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 183e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Resolve the parent path to a directory entry. 184e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Dir = SourceMgr->getFileManager().getDirectory(DirName); 185e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } while (Dir); 186adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor 18765f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor return 0; 18865f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor} 18965f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor 19051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregorbool ModuleMap::isHeaderInUnavailableModule(const FileEntry *Header) { 19151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor llvm::DenseMap<const FileEntry *, Module *>::iterator Known 19251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor = Headers.find(Header); 19351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (Known != Headers.end()) 19451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return !Known->second->isAvailable(); 19551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 19651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor const DirectoryEntry *Dir = Header->getDir(); 19751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor llvm::SmallVector<const DirectoryEntry *, 2> SkippedDirs; 19851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor StringRef DirName = Dir->getName(); 19951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 20051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Keep walking up the directory hierarchy, looking for a directory with 20151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // an umbrella header. 20251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor do { 20351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir 20451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor = UmbrellaDirs.find(Dir); 20551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (KnownDir != UmbrellaDirs.end()) { 20651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Module *Found = KnownDir->second; 20751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Found->isAvailable()) 20851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return true; 20951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 21051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Search up the module stack until we find a module with an umbrella 21151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // directory. 21251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Module *UmbrellaModule = Found; 21351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent) 21451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor UmbrellaModule = UmbrellaModule->Parent; 21551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 21651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (UmbrellaModule->InferSubmodules) { 21751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor for (unsigned I = SkippedDirs.size(); I != 0; --I) { 21851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Find or create the module that corresponds to this directory name. 21951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor StringRef Name = llvm::sys::path::stem(SkippedDirs[I-1]->getName()); 22051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Found = lookupModuleQualified(Name, Found); 22151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Found) 22251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return false; 22351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Found->isAvailable()) 22451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return true; 22551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 22651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 22751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Infer a submodule with the same name as this header file. 22851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor StringRef Name = llvm::sys::path::stem(Header->getName()); 22951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Found = lookupModuleQualified(Name, Found); 23051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Found) 23151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return false; 23251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 23351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 23451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return !Found->isAvailable(); 23551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 23651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 23751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor SkippedDirs.push_back(Dir); 23851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 23951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Retrieve our parent path. 24051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor DirName = llvm::sys::path::parent_path(DirName); 24151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (DirName.empty()) 24251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor break; 24351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 24451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Resolve the parent path to a directory entry. 24551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Dir = SourceMgr->getFileManager().getDirectory(DirName); 24651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } while (Dir); 24751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 24851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return false; 24951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor} 25051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 2511a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *ModuleMap::findModule(StringRef Name) { 252484535e45b4d301847a157e943c7823da5d40884Douglas Gregor llvm::StringMap<Module *>::iterator Known = Modules.find(Name); 253484535e45b4d301847a157e943c7823da5d40884Douglas Gregor if (Known != Modules.end()) 254484535e45b4d301847a157e943c7823da5d40884Douglas Gregor return Known->getValue(); 255484535e45b4d301847a157e943c7823da5d40884Douglas Gregor 256484535e45b4d301847a157e943c7823da5d40884Douglas Gregor return 0; 257484535e45b4d301847a157e943c7823da5d40884Douglas Gregor} 258484535e45b4d301847a157e943c7823da5d40884Douglas Gregor 25990db26000aefe9335370013eec64c85232d80227Douglas GregorModule *ModuleMap::lookupModuleUnqualified(StringRef Name, Module *Context) { 26090db26000aefe9335370013eec64c85232d80227Douglas Gregor for(; Context; Context = Context->Parent) { 26190db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Module *Sub = lookupModuleQualified(Name, Context)) 26290db26000aefe9335370013eec64c85232d80227Douglas Gregor return Sub; 26390db26000aefe9335370013eec64c85232d80227Douglas Gregor } 26490db26000aefe9335370013eec64c85232d80227Douglas Gregor 26590db26000aefe9335370013eec64c85232d80227Douglas Gregor return findModule(Name); 26690db26000aefe9335370013eec64c85232d80227Douglas Gregor} 26790db26000aefe9335370013eec64c85232d80227Douglas Gregor 26890db26000aefe9335370013eec64c85232d80227Douglas GregorModule *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) { 26990db26000aefe9335370013eec64c85232d80227Douglas Gregor if (!Context) 27090db26000aefe9335370013eec64c85232d80227Douglas Gregor return findModule(Name); 27190db26000aefe9335370013eec64c85232d80227Douglas Gregor 272b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor return Context->findSubmodule(Name); 27390db26000aefe9335370013eec64c85232d80227Douglas Gregor} 27490db26000aefe9335370013eec64c85232d80227Douglas Gregor 2751a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorstd::pair<Module *, bool> 276392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework, 277392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor bool IsExplicit) { 278392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Try to find an existing module with this name. 279b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (Module *Sub = lookupModuleQualified(Name, Parent)) 280b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor return std::make_pair(Sub, false); 281392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 282392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Create a new module with this name. 283392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework, 284392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor IsExplicit); 285b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (!Parent) 286392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Modules[Name] = Result; 287392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return std::make_pair(Result, true); 288392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor} 289392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 2901a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule * 2912821c7f8870629b56b9c41e1c50c7a091edd544dDouglas GregorModuleMap::inferFrameworkModule(StringRef ModuleName, 292ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor const DirectoryEntry *FrameworkDir, 293a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor bool IsSystem, 294ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Module *Parent) { 2952821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // Check whether we've already found this module. 296ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor if (Module *Mod = lookupModuleQualified(ModuleName, Parent)) 297ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor return Mod; 298ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor 299ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor FileManager &FileMgr = SourceMgr->getFileManager(); 3002821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor 3012821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // Look for an umbrella header. 302f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName()); 3032821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor llvm::sys::path::append(UmbrellaName, "Headers"); 3042821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor llvm::sys::path::append(UmbrellaName, ModuleName + ".h"); 305ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName); 3062821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor 3072821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // FIXME: If there's no umbrella header, we could probably scan the 3082821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // framework to load *everything*. But, it's not clear that this is a good 3092821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // idea. 3102821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor if (!UmbrellaHeader) 3112821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor return 0; 3122821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor 313ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Module *Result = new Module(ModuleName, SourceLocation(), Parent, 314ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor /*IsFramework=*/true, /*IsExplicit=*/false); 315a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (IsSystem) 316a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor Result->IsSystem = IsSystem; 317a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 318b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (!Parent) 319ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Modules[ModuleName] = Result; 320b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor 321489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor // umbrella header "umbrella-header-name" 32210694cee2588442bee1e717f5042c58ffee25279Douglas Gregor Result->Umbrella = UmbrellaHeader; 3232821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor Headers[UmbrellaHeader] = Result; 3243cee31e4d7c23d3d5d0b8927998577b9f75087d7Douglas Gregor UmbrellaDirs[UmbrellaHeader->getDir()] = Result; 325209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor 326209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor // export * 327209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor Result->Exports.push_back(Module::ExportDecl(0, true)); 328209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor 329e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // module * { export * } 330e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->InferSubmodules = true; 331e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->InferExportWildcard = true; 332e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 333ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor // Look for subframeworks. 334ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor llvm::error_code EC; 335f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> SubframeworksDirName 33652b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor = StringRef(FrameworkDir->getName()); 337ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor llvm::sys::path::append(SubframeworksDirName, "Frameworks"); 338f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> SubframeworksDirNameNative; 33952b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor llvm::sys::path::native(SubframeworksDirName.str(), 34052b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor SubframeworksDirNameNative); 34152b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor for (llvm::sys::fs::directory_iterator 34252b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor Dir(SubframeworksDirNameNative.str(), EC), DirEnd; 343ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Dir != DirEnd && !EC; Dir.increment(EC)) { 344ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor if (!StringRef(Dir->path()).endswith(".framework")) 345ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor continue; 346ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor 347ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor if (const DirectoryEntry *SubframeworkDir 348ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor = FileMgr.getDirectory(Dir->path())) { 349ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor // FIXME: Do we want to warn about subframeworks without umbrella headers? 350ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor inferFrameworkModule(llvm::sys::path::stem(Dir->path()), SubframeworkDir, 351a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor IsSystem, Result); 352ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor } 353ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor } 3543a110f75acafc992cb664200cebec90520986715Douglas Gregor 3552821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor return Result; 3562821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor} 3572821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor 358e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregorvoid ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader){ 359e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Headers[UmbrellaHeader] = Mod; 36010694cee2588442bee1e717f5042c58ffee25279Douglas Gregor Mod->Umbrella = UmbrellaHeader; 3616a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor UmbrellaDirs[UmbrellaHeader->getDir()] = Mod; 362e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor} 363e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 36477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregorvoid ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir) { 36577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Mod->Umbrella = UmbrellaDir; 36677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor UmbrellaDirs[UmbrellaDir] = Mod; 36777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor} 36877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 369e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregorvoid ModuleMap::addHeader(Module *Mod, const FileEntry *Header) { 370e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Mod->Headers.push_back(Header); 371e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Headers[Header] = Mod; 372e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor} 373e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 374f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregorconst FileEntry * 3751a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModuleMap::getContainingModuleMapFile(Module *Module) { 376f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor if (Module->DefinitionLoc.isInvalid() || !SourceMgr) 377f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor return 0; 378f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 379f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor return SourceMgr->getFileEntryForID( 380f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor SourceMgr->getFileID(Module->DefinitionLoc)); 381f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor} 382f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 383a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMap::dump() { 384a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::errs() << "Modules:"; 385a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor for (llvm::StringMap<Module *>::iterator M = Modules.begin(), 386a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor MEnd = Modules.end(); 387a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor M != MEnd; ++M) 388804c3bfee22076f232dddf4839439119cfdee2b6Douglas Gregor M->getValue()->print(llvm::errs(), 2); 389a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 390a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::errs() << "Headers:"; 391a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor for (llvm::DenseMap<const FileEntry *, Module *>::iterator 392a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor H = Headers.begin(), 393a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HEnd = Headers.end(); 394a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor H != HEnd; ++H) { 395a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::errs() << " \"" << H->first->getName() << "\" -> " 396a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor << H->second->getFullModuleName() << "\n"; 397a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 398a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 399a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 40090db26000aefe9335370013eec64c85232d80227Douglas Gregorbool ModuleMap::resolveExports(Module *Mod, bool Complain) { 40190db26000aefe9335370013eec64c85232d80227Douglas Gregor bool HadError = false; 40290db26000aefe9335370013eec64c85232d80227Douglas Gregor for (unsigned I = 0, N = Mod->UnresolvedExports.size(); I != N; ++I) { 40390db26000aefe9335370013eec64c85232d80227Douglas Gregor Module::ExportDecl Export = resolveExport(Mod, Mod->UnresolvedExports[I], 40490db26000aefe9335370013eec64c85232d80227Douglas Gregor Complain); 4050adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor if (Export.getPointer() || Export.getInt()) 40690db26000aefe9335370013eec64c85232d80227Douglas Gregor Mod->Exports.push_back(Export); 40790db26000aefe9335370013eec64c85232d80227Douglas Gregor else 40890db26000aefe9335370013eec64c85232d80227Douglas Gregor HadError = true; 40990db26000aefe9335370013eec64c85232d80227Douglas Gregor } 41090db26000aefe9335370013eec64c85232d80227Douglas Gregor Mod->UnresolvedExports.clear(); 41190db26000aefe9335370013eec64c85232d80227Douglas Gregor return HadError; 41290db26000aefe9335370013eec64c85232d80227Douglas Gregor} 41390db26000aefe9335370013eec64c85232d80227Douglas Gregor 41455988680ece66b8e505ee136b35e74fcb1173aeeDouglas GregorModule *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) { 41555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor if (Loc.isInvalid()) 41655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor return 0; 41755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 41855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor // Use the expansion location to determine which module we're in. 41955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor FullSourceLoc ExpansionLoc = Loc.getExpansionLoc(); 42055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor if (!ExpansionLoc.isFileID()) 42155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor return 0; 42255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 42355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 42455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor const SourceManager &SrcMgr = Loc.getManager(); 42555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor FileID ExpansionFileID = ExpansionLoc.getFileID(); 42655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 427303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor while (const FileEntry *ExpansionFile 428303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor = SrcMgr.getFileEntryForID(ExpansionFileID)) { 429303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor // Find the module that owns this header (if any). 430303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor if (Module *Mod = findModuleForHeader(ExpansionFile)) 431303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor return Mod; 432303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor 433303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor // No module owns this header, so look up the inclusion chain to see if 434303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor // any included header has an associated module. 435303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor SourceLocation IncludeLoc = SrcMgr.getIncludeLoc(ExpansionFileID); 436303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor if (IncludeLoc.isInvalid()) 437303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor return 0; 438303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor 439303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor ExpansionFileID = SrcMgr.getFileID(IncludeLoc); 440303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor } 441303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor 442303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor return 0; 44355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor} 44455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 445a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//----------------------------------------------------------------------------// 446a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// Module map file parser 447a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//----------------------------------------------------------------------------// 448a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 449a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregornamespace clang { 450a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief A token in a module map file. 451a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor struct MMToken { 452a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor enum TokenKind { 45351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Comma, 454a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor EndOfFile, 455a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HeaderKeyword, 456a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Identifier, 457a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ExplicitKeyword, 45890db26000aefe9335370013eec64c85232d80227Douglas Gregor ExportKeyword, 459a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor FrameworkKeyword, 460a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ModuleKeyword, 46190db26000aefe9335370013eec64c85232d80227Douglas Gregor Period, 462a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor UmbrellaKeyword, 46351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor RequiresKeyword, 46490db26000aefe9335370013eec64c85232d80227Douglas Gregor Star, 465a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringLiteral, 466a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor LBrace, 467a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor RBrace, 468a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor LSquare, 469a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor RSquare 470a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } Kind; 471a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 472a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned Location; 473a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned StringLength; 474a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor const char *StringData; 475a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 476a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor void clear() { 477a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Kind = EndOfFile; 478a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Location = 0; 479a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringLength = 0; 480a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringData = 0; 481a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 482a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 483a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool is(TokenKind K) const { return Kind == K; } 484a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 485a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation getLocation() const { 486a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return SourceLocation::getFromRawEncoding(Location); 487a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 488a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 489a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringRef getString() const { 490a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return StringRef(StringData, StringLength); 491a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 492a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor }; 493a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 494a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor class ModuleMapParser { 495a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Lexer &L; 496a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceManager &SourceMgr; 497a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor DiagnosticsEngine &Diags; 498a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ModuleMap ⤅ 499a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 5008b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor /// \brief The directory that this module map resides in. 5018b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor const DirectoryEntry *Directory; 5022f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 5032f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor /// \brief The directory containing Clang-supplied headers. 5042f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor const DirectoryEntry *BuiltinIncludeDir; 5052f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 506a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Whether an error occurred. 507a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool HadError; 508a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 509a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Default target information, used only for string literal 510a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// parsing. 511a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor TargetInfo *Target; 512a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 513a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Stores string data for the various string literals referenced 514a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// during parsing. 515a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::BumpPtrAllocator StringData; 516a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 517a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief The current token. 518a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor MMToken Tok; 519a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 520a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief The active module. 5211a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor Module *ActiveModule; 522a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 523a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Consume the current token and return its location. 524a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation consumeToken(); 525a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 526a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Skip tokens until we reach the a token with the given kind 527a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// (or the end of the file). 528a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor void skipUntil(MMToken::TokenKind K); 529587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 530587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor typedef llvm::SmallVector<std::pair<std::string, SourceLocation>, 2> 531587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ModuleId; 532587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor bool parseModuleId(ModuleId &Id); 533a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor void parseModuleDecl(); 53451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor void parseRequiresDecl(); 535489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor void parseHeaderDecl(SourceLocation UmbrellaLoc); 53677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc); 53790db26000aefe9335370013eec64c85232d80227Douglas Gregor void parseExportDecl(); 5381e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor void parseInferredSubmoduleDecl(bool Explicit); 539a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 5406a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor const DirectoryEntry *getOverriddenHeaderSearchDir(); 5416a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor 542a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor public: 543a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr, 544a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor DiagnosticsEngine &Diags, 5458b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor ModuleMap &Map, 5462f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor const DirectoryEntry *Directory, 5472f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor const DirectoryEntry *BuiltinIncludeDir) 5488b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor : L(L), SourceMgr(SourceMgr), Diags(Diags), Map(Map), 5492f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor Directory(Directory), BuiltinIncludeDir(BuiltinIncludeDir), 5502f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor HadError(false), ActiveModule(0) 551a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor { 552a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor TargetOptions TargetOpts; 553a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor TargetOpts.Triple = llvm::sys::getDefaultTargetTriple(); 554a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts); 555a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 556a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.clear(); 557a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 558a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 559a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 560a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool parseModuleMapFile(); 561a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor }; 562a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 563a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 564a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorSourceLocation ModuleMapParser::consumeToken() { 565a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorretry: 566a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation Result = Tok.getLocation(); 567a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.clear(); 568a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 569a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Token LToken; 570a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor L.LexFromRawLexer(LToken); 571a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Location = LToken.getLocation().getRawEncoding(); 572a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (LToken.getKind()) { 573a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::raw_identifier: 574a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringData = LToken.getRawIdentifierData(); 575a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringLength = LToken.getLength(); 576a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(Tok.getString()) 577a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("header", MMToken::HeaderKeyword) 578a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("explicit", MMToken::ExplicitKeyword) 57990db26000aefe9335370013eec64c85232d80227Douglas Gregor .Case("export", MMToken::ExportKeyword) 580a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor .Case("framework", MMToken::FrameworkKeyword) 581a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("module", MMToken::ModuleKeyword) 58251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor .Case("requires", MMToken::RequiresKeyword) 583a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("umbrella", MMToken::UmbrellaKeyword) 584a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Default(MMToken::Identifier); 585a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 58651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 58751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor case tok::comma: 58851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Tok.Kind = MMToken::Comma; 58951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor break; 59051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 591a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::eof: 592a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::EndOfFile; 593a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 594a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 595a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::l_brace: 596a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::LBrace; 597a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 598a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 599a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case tok::l_square: 600a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor Tok.Kind = MMToken::LSquare; 601a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor break; 602a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 60390db26000aefe9335370013eec64c85232d80227Douglas Gregor case tok::period: 60490db26000aefe9335370013eec64c85232d80227Douglas Gregor Tok.Kind = MMToken::Period; 60590db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 60690db26000aefe9335370013eec64c85232d80227Douglas Gregor 607a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::r_brace: 608a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::RBrace; 609a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 610a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 611a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case tok::r_square: 612a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor Tok.Kind = MMToken::RSquare; 613a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor break; 614a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 61590db26000aefe9335370013eec64c85232d80227Douglas Gregor case tok::star: 61690db26000aefe9335370013eec64c85232d80227Douglas Gregor Tok.Kind = MMToken::Star; 61790db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 61890db26000aefe9335370013eec64c85232d80227Douglas Gregor 619a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::string_literal: { 620a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the string literal. 621a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor LangOptions LangOpts; 622a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringLiteralParser StringLiteral(<oken, 1, SourceMgr, LangOpts, *Target); 623a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (StringLiteral.hadError) 624a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor goto retry; 625a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 626a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Copy the string literal into our string data allocator. 627a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned Length = StringLiteral.GetStringLength(); 628a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor char *Saved = StringData.Allocate<char>(Length + 1); 629a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor memcpy(Saved, StringLiteral.GetString().data(), Length); 630a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Saved[Length] = 0; 631a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 632a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Form the token. 633a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::StringLiteral; 634a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringData = Saved; 635a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringLength = Length; 636a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 637a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 638a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 639a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::comment: 640a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor goto retry; 641a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 642a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor default: 643a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token); 644a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 645a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor goto retry; 646a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 647a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 648a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return Result; 649a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 650a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 651a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::skipUntil(MMToken::TokenKind K) { 652a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned braceDepth = 0; 653a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor unsigned squareDepth = 0; 654a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor do { 655a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (Tok.Kind) { 656a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::EndOfFile: 657a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 658a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 659a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::LBrace: 660a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 661a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 662a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 663a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ++braceDepth; 664a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 665a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 666a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case MMToken::LSquare: 667a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 668a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor return; 669a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 670a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor ++squareDepth; 671a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor break; 672a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 673a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::RBrace: 674a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (braceDepth > 0) 675a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor --braceDepth; 676a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor else if (Tok.is(K)) 677a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 678a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 679a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 680a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case MMToken::RSquare: 681a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (squareDepth > 0) 682a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor --squareDepth; 683a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor else if (Tok.is(K)) 684a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor return; 685a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor break; 686a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 687a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor default: 688a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (braceDepth == 0 && squareDepth == 0 && Tok.is(K)) 689a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 690a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 691a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 692a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 693a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 694a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } while (true); 695a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 696a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 697587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// \brief Parse a module-id. 698587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// 699587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// module-id: 700587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// identifier 701587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// identifier '.' module-id 702587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// 703587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// \returns true if an error occurred, false otherwise. 704587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregorbool ModuleMapParser::parseModuleId(ModuleId &Id) { 705587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Id.clear(); 706587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor do { 707587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Tok.is(MMToken::Identifier)) { 708587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation())); 709587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor consumeToken(); 710587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 711587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name); 712587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return true; 713587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 714587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 715587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (!Tok.is(MMToken::Period)) 716587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor break; 717587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 718587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor consumeToken(); 719587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } while (true); 720587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 721587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return false; 722587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor} 723587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 724a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregornamespace { 725a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor /// \brief Enumerates the known attributes. 726a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor enum AttributeKind { 727a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor /// \brief An unknown attribute. 728a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor AT_unknown, 729a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor /// \brief The 'system' attribute. 730a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor AT_system 731a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor }; 732a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor} 733a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 734a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a module declaration. 735a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// 736a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-declaration: 737a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// 'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt] 738a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// { module-member* } 739a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// 740a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// attributes: 741a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// attribute attributes 742a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// attribute 743a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// 744a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// attribute: 745a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// [ identifier ] 746a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// 747a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-member: 74851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// requires-declaration 749a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// header-declaration 750587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// submodule-declaration 75190db26000aefe9335370013eec64c85232d80227Douglas Gregor/// export-declaration 7521e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// 7531e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// submodule-declaration: 7541e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// module-declaration 7551e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// inferred-submodule-declaration 756a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::parseModuleDecl() { 757a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) || 758a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor Tok.is(MMToken::FrameworkKeyword)); 759d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Parse 'explicit' or 'framework' keyword, if present. 760587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor SourceLocation ExplicitLoc; 761a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool Explicit = false; 762d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor bool Framework = false; 763a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor 764a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor // Parse 'explicit' keyword, if present. 765d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Tok.is(MMToken::ExplicitKeyword)) { 766587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ExplicitLoc = consumeToken(); 767a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Explicit = true; 768a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 769d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 770d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Parse 'framework' keyword, if present. 771d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Tok.is(MMToken::FrameworkKeyword)) { 772d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor consumeToken(); 773d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor Framework = true; 774d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 775a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 776a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse 'module' keyword. 777a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Tok.is(MMToken::ModuleKeyword)) { 778e6fb9876970e2dc55f091522644efa16caa9ba06Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 779a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 780a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 781a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 782a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 783a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); // 'module' keyword 7841e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 7851e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // If we have a wildcard for the module name, this is an inferred submodule. 7861e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Parse it. 7871e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::Star)) 7881e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor return parseInferredSubmoduleDecl(Explicit); 789a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 790a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the module name. 791587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ModuleId Id; 792587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (parseModuleId(Id)) { 793587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor HadError = true; 794587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return; 795587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 796587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 797587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (ActiveModule) { 798587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Id.size() > 1) { 799587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id) 800587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor << SourceRange(Id.front().second, Id.back().second); 801587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 802587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor HadError = true; 803587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return; 804587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 805587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else if (Id.size() == 1 && Explicit) { 806587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Top-level modules can't be explicit. 807587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level); 808587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Explicit = false; 809587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ExplicitLoc = SourceLocation(); 810a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 811a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 812587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 813587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Module *PreviousActiveModule = ActiveModule; 814587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Id.size() > 1) { 815587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // This module map defines a submodule. Go find the module of which it 816587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // is a submodule. 817587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ActiveModule = 0; 818587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) { 819587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) { 820587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ActiveModule = Next; 821587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor continue; 822587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 823587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 824587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (ActiveModule) { 825587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified) 826587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor << Id[I].first << ActiveModule->getTopLevelModule(); 827587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 828587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Id[I].second, diag::err_mmap_expected_module_name); 829587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 830587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor HadError = true; 831587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return; 832587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 833587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 834587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 835587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor StringRef ModuleName = Id.back().first; 836587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor SourceLocation ModuleNameLoc = Id.back().second; 837a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 838a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor // Parse the optional attribute list. 839a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor bool IsSystem = false; 840a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor while (Tok.is(MMToken::LSquare)) { 841a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor // Consume the '['. 842a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor SourceLocation LSquareLoc = consumeToken(); 843a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 844a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor // Check whether we have an attribute name here. 845a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (!Tok.is(MMToken::Identifier)) { 846a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute); 847a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor skipUntil(MMToken::RSquare); 848a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (Tok.is(MMToken::RSquare)) 849a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor consumeToken(); 850a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor continue; 851a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor } 852a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 853a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor // Decode the attribute name. 854a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor AttributeKind Attribute 855a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor = llvm::StringSwitch<AttributeKind>(Tok.getString()) 856a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor .Case("system", AT_system) 857a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor .Default(AT_unknown); 858a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor switch (Attribute) { 859a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case AT_unknown: 860a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute) 861a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor << Tok.getString(); 862a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor break; 863a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 864a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case AT_system: 865a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor IsSystem = true; 866a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor break; 867a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor } 868a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor consumeToken(); 869a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 870a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor // Consume the ']'. 871a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (!Tok.is(MMToken::RSquare)) { 872a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare); 873a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match); 874a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor skipUntil(MMToken::RSquare); 875a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor } 876a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 877a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (Tok.is(MMToken::RSquare)) 878a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor consumeToken(); 879a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor } 880a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 881a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the opening brace. 882a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Tok.is(MMToken::LBrace)) { 883a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace) 884a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor << ModuleName; 885a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 886a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 887a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 888a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation LBraceLoc = consumeToken(); 889a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 890a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Determine whether this (sub)module has already been defined. 891b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) { 892c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor if (Existing->DefinitionLoc.isInvalid() && !ActiveModule) { 893c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor // Skip the module definition. 894c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor skipUntil(MMToken::RBrace); 895c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor if (Tok.is(MMToken::RBrace)) 896c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor consumeToken(); 897c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor else { 898c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 899c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 900c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor HadError = true; 901c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor } 902c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor return; 903c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor } 904c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor 905a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition) 906a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor << ModuleName; 907b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition); 908a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 909a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Skip the module definition. 910a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor skipUntil(MMToken::RBrace); 911a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (Tok.is(MMToken::RBrace)) 912a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 913a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 914a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 915a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 916a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 917a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 918a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Start defining this module. 919b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor ActiveModule = Map.findOrCreateModule(ModuleName, ActiveModule, Framework, 920b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Explicit).first; 921b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor ActiveModule->DefinitionLoc = ModuleNameLoc; 922a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (IsSystem) 923a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor ActiveModule->IsSystem = true; 924a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 925a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool Done = false; 926a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor do { 927a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (Tok.Kind) { 928a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::EndOfFile: 929a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::RBrace: 930a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Done = true; 931a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 932a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 933a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::ExplicitKeyword: 934d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor case MMToken::FrameworkKeyword: 935a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::ModuleKeyword: 936a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor parseModuleDecl(); 937a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 938a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 93990db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::ExportKeyword: 94090db26000aefe9335370013eec64c85232d80227Douglas Gregor parseExportDecl(); 94190db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 94290db26000aefe9335370013eec64c85232d80227Douglas Gregor 94351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor case MMToken::RequiresKeyword: 94451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor parseRequiresDecl(); 94551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor break; 94651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 94777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor case MMToken::UmbrellaKeyword: { 94877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor SourceLocation UmbrellaLoc = consumeToken(); 94977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (Tok.is(MMToken::HeaderKeyword)) 95077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor parseHeaderDecl(UmbrellaLoc); 95177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor else 95277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor parseUmbrellaDirDecl(UmbrellaLoc); 953a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 95477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 955a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 956489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor case MMToken::HeaderKeyword: 957489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor parseHeaderDecl(SourceLocation()); 958a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 959489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor 960a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor default: 961a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member); 962a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 963a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 964a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 965a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } while (!Done); 966a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 967a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (Tok.is(MMToken::RBrace)) 968a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 969a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor else { 970a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 971a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 972a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 973a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 974a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 975587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // We're done parsing this module. Pop back to the previous module. 976587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ActiveModule = PreviousActiveModule; 977a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 978d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 97951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// \brief Parse a requires declaration. 98051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// 98151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// requires-declaration: 98251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// 'requires' feature-list 98351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// 98451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// feature-list: 98551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// identifier ',' feature-list 98651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// identifier 98751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregorvoid ModuleMapParser::parseRequiresDecl() { 98851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor assert(Tok.is(MMToken::RequiresKeyword)); 98951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 99051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Parse 'requires' keyword. 99151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor consumeToken(); 99251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 99351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Parse the feature-list. 99451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor do { 99551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Tok.is(MMToken::Identifier)) { 99651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature); 99751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor HadError = true; 99851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return; 99951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 100051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 100151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Consume the feature name. 100251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor std::string Feature = Tok.getString(); 100351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor consumeToken(); 100451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 100551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Add this feature. 1006dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor ActiveModule->addRequirement(Feature, Map.LangOpts, *Map.Target); 100751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 100851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Tok.is(MMToken::Comma)) 100951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor break; 101051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 101151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Consume the comma. 101251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor consumeToken(); 101351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } while (true); 101451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor} 101551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 1016d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor/// \brief Append to \p Paths the set of paths needed to get to the 1017d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor/// subframework in which the given module lives. 1018d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregorvoid appendSubframeworkPaths(Module *Mod, llvm::SmallVectorImpl<char> &Path) { 1019d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Collect the framework names from the given module to the top-level module. 1020d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor llvm::SmallVector<StringRef, 2> Paths; 1021d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor for (; Mod; Mod = Mod->Parent) { 1022d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Mod->IsFramework) 1023d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor Paths.push_back(Mod->Name); 1024d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 1025d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 1026d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Paths.empty()) 1027d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor return; 1028d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 1029d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Add Frameworks/Name.framework for each subframework. 1030d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor for (unsigned I = Paths.size() - 1; I != 0; --I) { 1031d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor llvm::sys::path::append(Path, "Frameworks"); 1032d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor llvm::sys::path::append(Path, Paths[I-1] + ".framework"); 1033d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 1034d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor} 1035d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 10362f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor/// \brief Determine whether the given file name is the name of a builtin 10372f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor/// header, supplied by Clang to replace, override, or augment existing system 10382f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor/// headers. 10392f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregorstatic bool isBuiltinHeader(StringRef FileName) { 10402f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor return llvm::StringSwitch<bool>(FileName) 10412f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("float.h", true) 10422f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("iso646.h", true) 10432f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("limits.h", true) 10442f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("stdalign.h", true) 10452f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("stdarg.h", true) 10462f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("stdbool.h", true) 10472f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("stddef.h", true) 10482f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("stdint.h", true) 10492f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("tgmath.h", true) 10502f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("unwind.h", true) 10512f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Default(false); 10522f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor} 10532f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 1054489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor/// \brief Parse a header declaration. 1055a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// 1056489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor/// header-declaration: 1057489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor/// 'umbrella'[opt] 'header' string-literal 1058489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregorvoid ModuleMapParser::parseHeaderDecl(SourceLocation UmbrellaLoc) { 1059489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor assert(Tok.is(MMToken::HeaderKeyword)); 1060489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor consumeToken(); 1061489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor 1062489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor bool Umbrella = UmbrellaLoc.isValid(); 1063a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1064a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the header name. 1065a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Tok.is(MMToken::StringLiteral)) { 1066a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 1067489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor << "header"; 1068a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1069a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 1070a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1071587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor std::string FileName = Tok.getString(); 1072a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation FileNameLoc = consumeToken(); 1073489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor 107477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Check whether we already have an umbrella. 107577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (Umbrella && ActiveModule->Umbrella) { 107677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(FileNameLoc, diag::err_mmap_umbrella_clash) 107777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << ActiveModule->getFullModuleName(); 10788b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor HadError = true; 10798b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor return; 10808b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } 1081a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor 10828b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor // Look for this file. 1083587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor const FileEntry *File = 0; 10842f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor const FileEntry *BuiltinFile = 0; 1085f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> PathName; 1086587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (llvm::sys::path::is_absolute(FileName)) { 1087587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor PathName = FileName; 1088587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 10896a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor } else if (const DirectoryEntry *Dir = getOverriddenHeaderSearchDir()) { 10906a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor PathName = Dir->getName(); 10916a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor llvm::sys::path::append(PathName, FileName); 10926a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 1093587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 1094587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Search for the header file within the search directory. 10956a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor PathName = Directory->getName(); 1096587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor unsigned PathLength = PathName.size(); 109718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 1098d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (ActiveModule->isPartOfFramework()) { 1099d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor appendSubframeworkPaths(ActiveModule, PathName); 1100587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1101587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Check whether this file is in the public headers. 110218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor llvm::sys::path::append(PathName, "Headers"); 1103587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, FileName); 1104587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 1105587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1106587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (!File) { 1107587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Check whether this file is in the private headers. 1108587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor PathName.resize(PathLength); 1109587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, "PrivateHeaders"); 1110587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, FileName); 1111587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 1112587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 1113587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 1114587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Lookup for normal headers. 1115587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, FileName); 1116587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 11172f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 11182f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // If this is a system module with a top-level header, this header 11192f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // may have a counterpart (or replacement) in the set of headers 11202f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // supplied by Clang. Find that builtin header. 11212f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor if (ActiveModule->IsSystem && !Umbrella && BuiltinIncludeDir && 11222f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor BuiltinIncludeDir != Directory && isBuiltinHeader(FileName)) { 1123f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName()); 11242f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor llvm::sys::path::append(BuiltinPathName, FileName); 11252f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName); 11262f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 11272f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // If Clang supplies this header but the underlying system does not, 11282f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // just silently swap in our builtin version. Otherwise, we'll end 11292f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // up adding both (later). 11302f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor if (!File && BuiltinFile) { 11312f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor File = BuiltinFile; 11322f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor BuiltinFile = 0; 11332f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor } 11342f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor } 1135d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 113618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor } 1137a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor 11388b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor // FIXME: We shouldn't be eagerly stat'ing every file named in a module map. 11398b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor // Come up with a lazy way to do this. 1140587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (File) { 11418b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor if (const Module *OwningModule = Map.Headers[File]) { 11428b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor Diags.Report(FileNameLoc, diag::err_mmap_header_conflict) 11438b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor << FileName << OwningModule->getFullModuleName(); 11448b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor HadError = true; 1145489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor } else if (Umbrella) { 1146489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor const DirectoryEntry *UmbrellaDir = File->getDir(); 1147489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor if ((OwningModule = Map.UmbrellaDirs[UmbrellaDir])) { 1148489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash) 1149489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor << OwningModule->getFullModuleName(); 1150489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor HadError = true; 1151489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor } else { 1152489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor // Record this umbrella header. 1153489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor Map.setUmbrellaHeader(ActiveModule, File); 1154489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor } 11558b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } else { 1156489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor // Record this header. 1157e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Map.addHeader(ActiveModule, File); 11582f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 11592f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // If there is a builtin counterpart to this file, add it now. 11602f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor if (BuiltinFile) 11612f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor Map.addHeader(ActiveModule, BuiltinFile); 11628b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } 11638b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } else { 11648b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor Diags.Report(FileNameLoc, diag::err_mmap_header_not_found) 116577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << Umbrella << FileName; 116677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor HadError = true; 116777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 116877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor} 116977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 117077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor/// \brief Parse an umbrella directory declaration. 117177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor/// 117277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor/// umbrella-dir-declaration: 117377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor/// umbrella string-literal 117477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregorvoid ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) { 117577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Parse the directory name. 117677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (!Tok.is(MMToken::StringLiteral)) { 117777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 117877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << "umbrella"; 117977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor HadError = true; 118077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor return; 118177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 118277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 118377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor std::string DirName = Tok.getString(); 118477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor SourceLocation DirNameLoc = consumeToken(); 118577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 118677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Check whether we already have an umbrella. 118777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (ActiveModule->Umbrella) { 118877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash) 118977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << ActiveModule->getFullModuleName(); 11908b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor HadError = true; 119177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor return; 119277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 119377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 119477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Look for this file. 119577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor const DirectoryEntry *Dir = 0; 119677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (llvm::sys::path::is_absolute(DirName)) 119777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Dir = SourceMgr.getFileManager().getDirectory(DirName); 119877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor else { 1199f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> PathName; 120077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor PathName = Directory->getName(); 120177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor llvm::sys::path::append(PathName, DirName); 120277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Dir = SourceMgr.getFileManager().getDirectory(PathName); 12038b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } 120477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 120577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (!Dir) { 120677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found) 120777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << DirName; 120877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor HadError = true; 120977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor return; 121077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 121177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 121277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (Module *OwningModule = Map.UmbrellaDirs[Dir]) { 121377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash) 121477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << OwningModule->getFullModuleName(); 121577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor HadError = true; 121677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor return; 121777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 121877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 121977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Record this umbrella directory. 122077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Map.setUmbrellaDir(ActiveModule, Dir); 1221a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 1222a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 122390db26000aefe9335370013eec64c85232d80227Douglas Gregor/// \brief Parse a module export declaration. 122490db26000aefe9335370013eec64c85232d80227Douglas Gregor/// 122590db26000aefe9335370013eec64c85232d80227Douglas Gregor/// export-declaration: 122690db26000aefe9335370013eec64c85232d80227Douglas Gregor/// 'export' wildcard-module-id 122790db26000aefe9335370013eec64c85232d80227Douglas Gregor/// 122890db26000aefe9335370013eec64c85232d80227Douglas Gregor/// wildcard-module-id: 122990db26000aefe9335370013eec64c85232d80227Douglas Gregor/// identifier 123090db26000aefe9335370013eec64c85232d80227Douglas Gregor/// '*' 123190db26000aefe9335370013eec64c85232d80227Douglas Gregor/// identifier '.' wildcard-module-id 123290db26000aefe9335370013eec64c85232d80227Douglas Gregorvoid ModuleMapParser::parseExportDecl() { 123390db26000aefe9335370013eec64c85232d80227Douglas Gregor assert(Tok.is(MMToken::ExportKeyword)); 123490db26000aefe9335370013eec64c85232d80227Douglas Gregor SourceLocation ExportLoc = consumeToken(); 123590db26000aefe9335370013eec64c85232d80227Douglas Gregor 123690db26000aefe9335370013eec64c85232d80227Douglas Gregor // Parse the module-id with an optional wildcard at the end. 123790db26000aefe9335370013eec64c85232d80227Douglas Gregor ModuleId ParsedModuleId; 123890db26000aefe9335370013eec64c85232d80227Douglas Gregor bool Wildcard = false; 123990db26000aefe9335370013eec64c85232d80227Douglas Gregor do { 124090db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Tok.is(MMToken::Identifier)) { 124190db26000aefe9335370013eec64c85232d80227Douglas Gregor ParsedModuleId.push_back(std::make_pair(Tok.getString(), 124290db26000aefe9335370013eec64c85232d80227Douglas Gregor Tok.getLocation())); 124390db26000aefe9335370013eec64c85232d80227Douglas Gregor consumeToken(); 124490db26000aefe9335370013eec64c85232d80227Douglas Gregor 124590db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Tok.is(MMToken::Period)) { 124690db26000aefe9335370013eec64c85232d80227Douglas Gregor consumeToken(); 124790db26000aefe9335370013eec64c85232d80227Douglas Gregor continue; 124890db26000aefe9335370013eec64c85232d80227Douglas Gregor } 124990db26000aefe9335370013eec64c85232d80227Douglas Gregor 125090db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 125190db26000aefe9335370013eec64c85232d80227Douglas Gregor } 125290db26000aefe9335370013eec64c85232d80227Douglas Gregor 125390db26000aefe9335370013eec64c85232d80227Douglas Gregor if(Tok.is(MMToken::Star)) { 125490db26000aefe9335370013eec64c85232d80227Douglas Gregor Wildcard = true; 12550adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor consumeToken(); 125690db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 125790db26000aefe9335370013eec64c85232d80227Douglas Gregor } 125890db26000aefe9335370013eec64c85232d80227Douglas Gregor 125990db26000aefe9335370013eec64c85232d80227Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_export_module_id); 126090db26000aefe9335370013eec64c85232d80227Douglas Gregor HadError = true; 126190db26000aefe9335370013eec64c85232d80227Douglas Gregor return; 126290db26000aefe9335370013eec64c85232d80227Douglas Gregor } while (true); 126390db26000aefe9335370013eec64c85232d80227Douglas Gregor 126490db26000aefe9335370013eec64c85232d80227Douglas Gregor Module::UnresolvedExportDecl Unresolved = { 126590db26000aefe9335370013eec64c85232d80227Douglas Gregor ExportLoc, ParsedModuleId, Wildcard 126690db26000aefe9335370013eec64c85232d80227Douglas Gregor }; 126790db26000aefe9335370013eec64c85232d80227Douglas Gregor ActiveModule->UnresolvedExports.push_back(Unresolved); 126890db26000aefe9335370013eec64c85232d80227Douglas Gregor} 126990db26000aefe9335370013eec64c85232d80227Douglas Gregor 12701e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregorvoid ModuleMapParser::parseInferredSubmoduleDecl(bool Explicit) { 12711e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor assert(Tok.is(MMToken::Star)); 12721e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor SourceLocation StarLoc = consumeToken(); 12731e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor bool Failed = false; 12741e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 12751e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Inferred modules must be submodules. 12761e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (!ActiveModule) { 12771e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule); 12781e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Failed = true; 12791e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 12801e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 128177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Inferred modules must have umbrella directories. 128277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (!Failed && !ActiveModule->getUmbrellaDir()) { 12831e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella); 12841e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Failed = true; 12851e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 12861e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 12871e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Check for redefinition of an inferred module. 1288ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor if (!Failed && ActiveModule->InferSubmodules) { 12891e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(StarLoc, diag::err_mmap_inferred_redef); 1290ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor if (ActiveModule->InferredSubmoduleLoc.isValid()) 1291ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor Diags.Report(ActiveModule->InferredSubmoduleLoc, 12921e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor diag::note_mmap_prev_definition); 12931e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Failed = true; 12941e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 12951e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 12961e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // If there were any problems with this inferred submodule, skip its body. 12971e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Failed) { 12981e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::LBrace)) { 12991e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 13001e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor skipUntil(MMToken::RBrace); 13011e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::RBrace)) 13021e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 13031e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 13041e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor HadError = true; 13051e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor return; 13061e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 13071e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 13081e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Note that we have an inferred submodule. 1309ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor ActiveModule->InferSubmodules = true; 1310ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor ActiveModule->InferredSubmoduleLoc = StarLoc; 1311ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor ActiveModule->InferExplicitSubmodules = Explicit; 13121e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 13131e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Parse the opening brace. 13141e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (!Tok.is(MMToken::LBrace)) { 13151e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard); 13161e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor HadError = true; 13171e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor return; 13181e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 13191e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor SourceLocation LBraceLoc = consumeToken(); 13201e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 13211e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Parse the body of the inferred submodule. 13221e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor bool Done = false; 13231e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor do { 13241e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor switch (Tok.Kind) { 13251e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::EndOfFile: 13261e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::RBrace: 13271e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Done = true; 13281e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor break; 13291e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 13301e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::ExportKeyword: { 13311e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 13321e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::Star)) 1333ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor ActiveModule->InferExportWildcard = true; 13341e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor else 13351e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(Tok.getLocation(), 13361e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor diag::err_mmap_expected_export_wildcard); 13371e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 13381e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor break; 13391e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 13401e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 13411e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::ExplicitKeyword: 13421e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::ModuleKeyword: 13431e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::HeaderKeyword: 13441e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::UmbrellaKeyword: 13451e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor default: 13461e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_wildcard_member); 13471e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 13481e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor break; 13491e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 13501e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } while (!Done); 13511e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 13521e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::RBrace)) 13531e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 13541e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor else { 13551e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 13561e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 13571e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor HadError = true; 13581e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 13591e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor} 13601e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 13616a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor/// \brief If there is a specific header search directory due the presence 13626a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor/// of an umbrella directory, retrieve that directory. Otherwise, returns null. 13636a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregorconst DirectoryEntry *ModuleMapParser::getOverriddenHeaderSearchDir() { 13646a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor for (Module *Mod = ActiveModule; Mod; Mod = Mod->Parent) { 13656a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor // If we have an umbrella directory, use that. 13666a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor if (Mod->hasUmbrellaDir()) 13676a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor return Mod->getUmbrellaDir(); 13686a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor 13696a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor // If we have a framework directory, stop looking. 13706a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor if (Mod->IsFramework) 13716a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor return 0; 13726a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor } 13736a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor 13746a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor return 0; 13756a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor} 13766a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor 1377a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a module map file. 1378a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// 1379a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-map-file: 1380a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-declaration* 1381a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorbool ModuleMapParser::parseModuleMapFile() { 1382a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor do { 1383a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (Tok.Kind) { 1384a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::EndOfFile: 1385a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return HadError; 1386a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1387587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor case MMToken::ExplicitKeyword: 1388a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::ModuleKeyword: 1389a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor case MMToken::FrameworkKeyword: 1390a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor parseModuleDecl(); 1391a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1392a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 139351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor case MMToken::Comma: 139490db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::ExportKeyword: 1395a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::HeaderKeyword: 1396a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::Identifier: 1397a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::LBrace: 1398a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case MMToken::LSquare: 139990db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::Period: 1400a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::RBrace: 1401a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case MMToken::RSquare: 140251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor case MMToken::RequiresKeyword: 140390db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::Star: 1404a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::StringLiteral: 1405a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::UmbrellaKeyword: 1406a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 1407a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1408a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 1409a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1410a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1411a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } while (true); 1412a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 1413a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1414a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorbool ModuleMap::parseModuleMapFile(const FileEntry *File) { 1415dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor assert(Target != 0 && "Missing target information"); 1416a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor FileID ID = SourceMgr->createFileID(File, SourceLocation(), SrcMgr::C_User); 1417a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor const llvm::MemoryBuffer *Buffer = SourceMgr->getBuffer(ID); 1418a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Buffer) 1419a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return true; 1420a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1421a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse this module map file. 142251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Lexer L(ID, SourceMgr->getBuffer(ID), *SourceMgr, MMapLangOpts); 142351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Diags->getClient()->BeginSourceFile(MMapLangOpts); 14242f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor ModuleMapParser Parser(L, *SourceMgr, *Diags, *this, File->getDir(), 14252f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor BuiltinIncludeDir); 1426a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool Result = Parser.parseModuleMapFile(); 1427a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags->getClient()->EndSourceFile(); 1428a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1429a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return Result; 1430a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 1431