ModuleMap.cpp revision 489ad43b77c10a98df80f1395de81e3f52697e76
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 72a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorModuleMap::ModuleMap(FileManager &FileMgr, const DiagnosticConsumer &DC) { 73a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs); 74a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags = llvm::IntrusiveRefCntPtr<DiagnosticsEngine>( 75a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor new DiagnosticsEngine(DiagIDs)); 76a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags->setClient(DC.clone(*Diags), /*ShouldOwnClient=*/true); 77a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceMgr = new SourceManager(*Diags, FileMgr); 78a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 79a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 80a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorModuleMap::~ModuleMap() { 8109fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor for (llvm::StringMap<Module *>::iterator I = Modules.begin(), 8209fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor IEnd = Modules.end(); 8309fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor I != IEnd; ++I) { 8409fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor delete I->getValue(); 8509fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor } 8609fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor 87a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor delete SourceMgr; 88a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 89a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 901a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *ModuleMap::findModuleForHeader(const FileEntry *File) { 9165f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor llvm::DenseMap<const FileEntry *, Module *>::iterator Known 9265f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor = Headers.find(File); 9365f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor if (Known != Headers.end()) 9465f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor return Known->second; 9565f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor 96adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor const DirectoryEntry *Dir = File->getDir(); 97adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor llvm::SmallVector<const DirectoryEntry *, 2> SkippedDirs; 98adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor StringRef DirName = Dir->getName(); 99e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 100e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Keep walking up the directory hierarchy, looking for a directory with 101e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // an umbrella header. 102e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor do { 103e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir 104e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor = UmbrellaDirs.find(Dir); 105adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor if (KnownDir != UmbrellaDirs.end()) { 106adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor Module *Result = KnownDir->second; 1079f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor 1089f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor // Search up the module stack until we find a module with an umbrella 10910694cee2588442bee1e717f5042c58ffee25279Douglas Gregor // directory. 1109f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor Module *UmbrellaModule = Result; 11110694cee2588442bee1e717f5042c58ffee25279Douglas Gregor while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent) 1129f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor UmbrellaModule = UmbrellaModule->Parent; 1139f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor 1149f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor if (UmbrellaModule->InferSubmodules) { 115e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Infer submodules for each of the directories we found between 116e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // the directory of the umbrella header and the directory where 117e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // the actual header is located. 118e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 119e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // For a framework module, the umbrella directory is the framework 120e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // directory, so strip off the "Headers" or "PrivateHeaders". 12123af6d58e392e18ae2946b799264717f480e6596Douglas Gregor bool Explicit = UmbrellaModule->InferExplicitSubmodules; 122e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor unsigned LastSkippedDir = SkippedDirs.size(); 12323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor if (LastSkippedDir && UmbrellaModule->IsFramework) { 12423af6d58e392e18ae2946b799264717f480e6596Douglas Gregor if (llvm::sys::path::filename(SkippedDirs.back()->getName()) 12523af6d58e392e18ae2946b799264717f480e6596Douglas Gregor == "PrivateHeaders") { 12623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor // For private headers, add an explicit "Private" module. 12723af6d58e392e18ae2946b799264717f480e6596Douglas Gregor // FIXME: This feels somewhat hackish. Do we want to introduce 12823af6d58e392e18ae2946b799264717f480e6596Douglas Gregor // some kind of "umbrella directory" here? 12923af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Result = findOrCreateModule("Private", Result, 13023af6d58e392e18ae2946b799264717f480e6596Douglas Gregor /*IsFramework=*/false, 13123af6d58e392e18ae2946b799264717f480e6596Douglas Gregor /*IsExplicit=*/true).first; 13223af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Explicit = true; 13323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor } 13423af6d58e392e18ae2946b799264717f480e6596Douglas Gregor 135e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor --LastSkippedDir; 13623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor } 137e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 138e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor for (unsigned I = LastSkippedDir; I != 0; --I) { 139e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Find or create the module that corresponds to this directory name. 140e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor StringRef Name = llvm::sys::path::stem(SkippedDirs[I-1]->getName()); 141e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result = findOrCreateModule(Name, Result, /*IsFramework=*/false, 14223af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Explicit).first; 143e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 144e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Associate the module and the directory. 145e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor UmbrellaDirs[SkippedDirs[I-1]] = Result; 146e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 147e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // If inferred submodules export everything they import, add a 148e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // wildcard to the set of exports. 1499f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor if (UmbrellaModule->InferExportWildcard && Result->Exports.empty()) 150e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->Exports.push_back(Module::ExportDecl(0, true)); 151e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } 152e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 153e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Infer a submodule with the same name as this header file. 154e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor StringRef Name = llvm::sys::path::stem(File->getName()); 155e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result = findOrCreateModule(Name, Result, /*IsFramework=*/false, 15623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Explicit).first; 157e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 158e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // If inferred submodules export everything they import, add a 159e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // wildcard to the set of exports. 1609f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor if (UmbrellaModule->InferExportWildcard && Result->Exports.empty()) 161e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->Exports.push_back(Module::ExportDecl(0, true)); 162e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } else { 163e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Record each of the directories we stepped through as being part of 164e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // the module we found, since the umbrella header covers them all. 165e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I) 166e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor UmbrellaDirs[SkippedDirs[I]] = Result; 167e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } 168adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor 169e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Headers[File] = Result; 170adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor return Result; 171adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor } 172adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor 173adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor SkippedDirs.push_back(Dir); 174e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 175e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Retrieve our parent path. 176e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor DirName = llvm::sys::path::parent_path(DirName); 177e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor if (DirName.empty()) 178e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor break; 179e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 180e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Resolve the parent path to a directory entry. 181e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Dir = SourceMgr->getFileManager().getDirectory(DirName); 182e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } while (Dir); 183adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor 18465f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor return 0; 18565f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor} 18665f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor 1871a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *ModuleMap::findModule(StringRef Name) { 188484535e45b4d301847a157e943c7823da5d40884Douglas Gregor llvm::StringMap<Module *>::iterator Known = Modules.find(Name); 189484535e45b4d301847a157e943c7823da5d40884Douglas Gregor if (Known != Modules.end()) 190484535e45b4d301847a157e943c7823da5d40884Douglas Gregor return Known->getValue(); 191484535e45b4d301847a157e943c7823da5d40884Douglas Gregor 192484535e45b4d301847a157e943c7823da5d40884Douglas Gregor return 0; 193484535e45b4d301847a157e943c7823da5d40884Douglas Gregor} 194484535e45b4d301847a157e943c7823da5d40884Douglas Gregor 19590db26000aefe9335370013eec64c85232d80227Douglas GregorModule *ModuleMap::lookupModuleUnqualified(StringRef Name, Module *Context) { 19690db26000aefe9335370013eec64c85232d80227Douglas Gregor for(; Context; Context = Context->Parent) { 19790db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Module *Sub = lookupModuleQualified(Name, Context)) 19890db26000aefe9335370013eec64c85232d80227Douglas Gregor return Sub; 19990db26000aefe9335370013eec64c85232d80227Douglas Gregor } 20090db26000aefe9335370013eec64c85232d80227Douglas Gregor 20190db26000aefe9335370013eec64c85232d80227Douglas Gregor return findModule(Name); 20290db26000aefe9335370013eec64c85232d80227Douglas Gregor} 20390db26000aefe9335370013eec64c85232d80227Douglas Gregor 20490db26000aefe9335370013eec64c85232d80227Douglas GregorModule *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) { 20590db26000aefe9335370013eec64c85232d80227Douglas Gregor if (!Context) 20690db26000aefe9335370013eec64c85232d80227Douglas Gregor return findModule(Name); 20790db26000aefe9335370013eec64c85232d80227Douglas Gregor 20890db26000aefe9335370013eec64c85232d80227Douglas Gregor llvm::StringMap<Module *>::iterator Sub = Context->SubModules.find(Name); 20990db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Sub != Context->SubModules.end()) 21090db26000aefe9335370013eec64c85232d80227Douglas Gregor return Sub->getValue(); 21190db26000aefe9335370013eec64c85232d80227Douglas Gregor 21290db26000aefe9335370013eec64c85232d80227Douglas Gregor return 0; 21390db26000aefe9335370013eec64c85232d80227Douglas Gregor} 21490db26000aefe9335370013eec64c85232d80227Douglas Gregor 2151a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorstd::pair<Module *, bool> 216392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework, 217392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor bool IsExplicit) { 218392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Try to find an existing module with this name. 219392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (Module *Found = Parent? Parent->SubModules[Name] : Modules[Name]) 220392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return std::make_pair(Found, false); 221392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 222392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Create a new module with this name. 223392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework, 224392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor IsExplicit); 225392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (Parent) 226392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Parent->SubModules[Name] = Result; 227392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor else 228392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Modules[Name] = Result; 229392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return std::make_pair(Result, true); 230392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor} 231392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 2321a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule * 2332821c7f8870629b56b9c41e1c50c7a091edd544dDouglas GregorModuleMap::inferFrameworkModule(StringRef ModuleName, 234ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor const DirectoryEntry *FrameworkDir, 235ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Module *Parent) { 2362821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // Check whether we've already found this module. 237ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor if (Module *Mod = lookupModuleQualified(ModuleName, Parent)) 238ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor return Mod; 239ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor 240ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor FileManager &FileMgr = SourceMgr->getFileManager(); 2412821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor 2422821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // Look for an umbrella header. 2432821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor llvm::SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName()); 2442821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor llvm::sys::path::append(UmbrellaName, "Headers"); 2452821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor llvm::sys::path::append(UmbrellaName, ModuleName + ".h"); 246ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName); 2472821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor 2482821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // FIXME: If there's no umbrella header, we could probably scan the 2492821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // framework to load *everything*. But, it's not clear that this is a good 2502821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // idea. 2512821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor if (!UmbrellaHeader) 2522821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor return 0; 2532821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor 254ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Module *Result = new Module(ModuleName, SourceLocation(), Parent, 255ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor /*IsFramework=*/true, /*IsExplicit=*/false); 256ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor 257ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor if (Parent) 258ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Parent->SubModules[ModuleName] = Result; 259ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor else 260ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Modules[ModuleName] = Result; 261ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor 262489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor // umbrella header "umbrella-header-name" 26310694cee2588442bee1e717f5042c58ffee25279Douglas Gregor Result->Umbrella = UmbrellaHeader; 2642821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor Headers[UmbrellaHeader] = Result; 2652821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor UmbrellaDirs[FrameworkDir] = Result; 266209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor 267209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor // export * 268209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor Result->Exports.push_back(Module::ExportDecl(0, true)); 269209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor 270e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // module * { export * } 271e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->InferSubmodules = true; 272e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->InferExportWildcard = true; 273e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 274ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor // Look for subframeworks. 275ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor llvm::error_code EC; 27652b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor llvm::SmallString<128> SubframeworksDirName 27752b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor = StringRef(FrameworkDir->getName()); 278ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor llvm::sys::path::append(SubframeworksDirName, "Frameworks"); 27952b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor llvm::SmallString<128> SubframeworksDirNameNative; 28052b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor llvm::sys::path::native(SubframeworksDirName.str(), 28152b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor SubframeworksDirNameNative); 28252b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor for (llvm::sys::fs::directory_iterator 28352b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor Dir(SubframeworksDirNameNative.str(), EC), DirEnd; 284ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Dir != DirEnd && !EC; Dir.increment(EC)) { 285ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor if (!StringRef(Dir->path()).endswith(".framework")) 286ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor continue; 287ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor 288ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor if (const DirectoryEntry *SubframeworkDir 289ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor = FileMgr.getDirectory(Dir->path())) { 290ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor // FIXME: Do we want to warn about subframeworks without umbrella headers? 291ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor inferFrameworkModule(llvm::sys::path::stem(Dir->path()), SubframeworkDir, 292ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Result); 293ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor } 294ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor } 295d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 29623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor // Look for private headers. 29723af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Module *ModulePrivate = 0; 29823af6d58e392e18ae2946b799264717f480e6596Douglas Gregor llvm::SmallString<128> PrivateHeadersDirName(FrameworkDir->getName()); 29923af6d58e392e18ae2946b799264717f480e6596Douglas Gregor llvm::sys::path::append(PrivateHeadersDirName, "PrivateHeaders"); 30052b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor llvm::SmallString<128> PrivateHeadersDirNameNative; 30152b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor llvm::sys::path::native(PrivateHeadersDirName.str(), 30252b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor PrivateHeadersDirNameNative); 30352b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor for (llvm::sys::fs::directory_iterator 30452b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor Dir(PrivateHeadersDirNameNative.str(), EC), DirEnd; 30523af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Dir != DirEnd && !EC; Dir.increment(EC)) { 30623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor // Check whether this entry has an extension typically associated with 30723af6d58e392e18ae2946b799264717f480e6596Douglas Gregor // headers. 30823af6d58e392e18ae2946b799264717f480e6596Douglas Gregor if (!llvm::StringSwitch<bool>(llvm::sys::path::extension(Dir->path())) 30923af6d58e392e18ae2946b799264717f480e6596Douglas Gregor .Cases(".h", ".H", ".hh", ".hpp", true) 31023af6d58e392e18ae2946b799264717f480e6596Douglas Gregor .Default(false)) 31123af6d58e392e18ae2946b799264717f480e6596Douglas Gregor continue; 31223af6d58e392e18ae2946b799264717f480e6596Douglas Gregor 31323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor if (const FileEntry *PrivateHeader = FileMgr.getFile(Dir->path())) { 31423af6d58e392e18ae2946b799264717f480e6596Douglas Gregor // Create the "private" submodule, if we haven't done so already. 31523af6d58e392e18ae2946b799264717f480e6596Douglas Gregor if (!ModulePrivate) { 31623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor ModulePrivate = findOrCreateModule("Private", Result, 31723af6d58e392e18ae2946b799264717f480e6596Douglas Gregor /*IsFramework=*/false, 31823af6d58e392e18ae2946b799264717f480e6596Douglas Gregor /*IsExplicit=*/true).first; 31923af6d58e392e18ae2946b799264717f480e6596Douglas Gregor } 32023af6d58e392e18ae2946b799264717f480e6596Douglas Gregor 32123af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Module *Sub = findOrCreateModule(llvm::sys::path::stem(Dir->path()), 32223af6d58e392e18ae2946b799264717f480e6596Douglas Gregor ModulePrivate, /*IsFramework=*/false, 32323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor /*IsExplicit=*/true).first; 32423af6d58e392e18ae2946b799264717f480e6596Douglas Gregor // header "the private header" 32523af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Sub->Headers.push_back(PrivateHeader); 32623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor 32723af6d58e392e18ae2946b799264717f480e6596Douglas Gregor // export * 32823af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Sub->Exports.push_back(Module::ExportDecl(0, true)); 32923af6d58e392e18ae2946b799264717f480e6596Douglas Gregor 33023af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Headers[PrivateHeader] = Sub; 33123af6d58e392e18ae2946b799264717f480e6596Douglas Gregor } 33223af6d58e392e18ae2946b799264717f480e6596Douglas Gregor } 33323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor 3342821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor return Result; 3352821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor} 3362821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor 337e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregorvoid ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader){ 338e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Headers[UmbrellaHeader] = Mod; 33910694cee2588442bee1e717f5042c58ffee25279Douglas Gregor Mod->Umbrella = UmbrellaHeader; 340e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 341e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor const DirectoryEntry *UmbrellaDir = UmbrellaHeader->getDir(); 342e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor if (Mod->IsFramework) 343e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor UmbrellaDir = SourceMgr->getFileManager().getDirectory( 344e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor llvm::sys::path::parent_path(UmbrellaDir->getName())); 345e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 346e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor UmbrellaDirs[UmbrellaDir] = Mod; 347e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor} 348e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 349e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregorvoid ModuleMap::addHeader(Module *Mod, const FileEntry *Header) { 350e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Mod->Headers.push_back(Header); 351e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Headers[Header] = Mod; 352e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor} 353e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 354f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregorconst FileEntry * 3551a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModuleMap::getContainingModuleMapFile(Module *Module) { 356f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor if (Module->DefinitionLoc.isInvalid() || !SourceMgr) 357f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor return 0; 358f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 359f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor return SourceMgr->getFileEntryForID( 360f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor SourceMgr->getFileID(Module->DefinitionLoc)); 361f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor} 362f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 363a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMap::dump() { 364a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::errs() << "Modules:"; 365a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor for (llvm::StringMap<Module *>::iterator M = Modules.begin(), 366a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor MEnd = Modules.end(); 367a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor M != MEnd; ++M) 368804c3bfee22076f232dddf4839439119cfdee2b6Douglas Gregor M->getValue()->print(llvm::errs(), 2); 369a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 370a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::errs() << "Headers:"; 371a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor for (llvm::DenseMap<const FileEntry *, Module *>::iterator 372a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor H = Headers.begin(), 373a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HEnd = Headers.end(); 374a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor H != HEnd; ++H) { 375a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::errs() << " \"" << H->first->getName() << "\" -> " 376a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor << H->second->getFullModuleName() << "\n"; 377a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 378a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 379a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 38090db26000aefe9335370013eec64c85232d80227Douglas Gregorbool ModuleMap::resolveExports(Module *Mod, bool Complain) { 38190db26000aefe9335370013eec64c85232d80227Douglas Gregor bool HadError = false; 38290db26000aefe9335370013eec64c85232d80227Douglas Gregor for (unsigned I = 0, N = Mod->UnresolvedExports.size(); I != N; ++I) { 38390db26000aefe9335370013eec64c85232d80227Douglas Gregor Module::ExportDecl Export = resolveExport(Mod, Mod->UnresolvedExports[I], 38490db26000aefe9335370013eec64c85232d80227Douglas Gregor Complain); 3850adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor if (Export.getPointer() || Export.getInt()) 38690db26000aefe9335370013eec64c85232d80227Douglas Gregor Mod->Exports.push_back(Export); 38790db26000aefe9335370013eec64c85232d80227Douglas Gregor else 38890db26000aefe9335370013eec64c85232d80227Douglas Gregor HadError = true; 38990db26000aefe9335370013eec64c85232d80227Douglas Gregor } 39090db26000aefe9335370013eec64c85232d80227Douglas Gregor Mod->UnresolvedExports.clear(); 39190db26000aefe9335370013eec64c85232d80227Douglas Gregor return HadError; 39290db26000aefe9335370013eec64c85232d80227Douglas Gregor} 39390db26000aefe9335370013eec64c85232d80227Douglas Gregor 39455988680ece66b8e505ee136b35e74fcb1173aeeDouglas GregorModule *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) { 39555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor if (Loc.isInvalid()) 39655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor return 0; 39755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 39855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor // Use the expansion location to determine which module we're in. 39955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor FullSourceLoc ExpansionLoc = Loc.getExpansionLoc(); 40055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor if (!ExpansionLoc.isFileID()) 40155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor return 0; 40255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 40355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 40455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor const SourceManager &SrcMgr = Loc.getManager(); 40555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor FileID ExpansionFileID = ExpansionLoc.getFileID(); 40655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor const FileEntry *ExpansionFile = SrcMgr.getFileEntryForID(ExpansionFileID); 40755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor if (!ExpansionFile) 40855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor return 0; 40955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 41055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor // Find the module that owns this header. 41155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor return findModuleForHeader(ExpansionFile); 41255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor} 41355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 414a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//----------------------------------------------------------------------------// 415a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// Module map file parser 416a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//----------------------------------------------------------------------------// 417a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 418a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregornamespace clang { 419a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief A token in a module map file. 420a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor struct MMToken { 421a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor enum TokenKind { 422a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor EndOfFile, 423a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HeaderKeyword, 424a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Identifier, 425a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ExplicitKeyword, 42690db26000aefe9335370013eec64c85232d80227Douglas Gregor ExportKeyword, 427a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor FrameworkKeyword, 428a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ModuleKeyword, 42990db26000aefe9335370013eec64c85232d80227Douglas Gregor Period, 430a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor UmbrellaKeyword, 43190db26000aefe9335370013eec64c85232d80227Douglas Gregor Star, 432a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringLiteral, 433a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor LBrace, 434a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor RBrace 435a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } Kind; 436a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 437a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned Location; 438a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned StringLength; 439a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor const char *StringData; 440a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 441a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor void clear() { 442a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Kind = EndOfFile; 443a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Location = 0; 444a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringLength = 0; 445a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringData = 0; 446a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 447a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 448a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool is(TokenKind K) const { return Kind == K; } 449a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 450a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation getLocation() const { 451a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return SourceLocation::getFromRawEncoding(Location); 452a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 453a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 454a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringRef getString() const { 455a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return StringRef(StringData, StringLength); 456a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 457a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor }; 458a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 459a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor class ModuleMapParser { 460a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Lexer &L; 461a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceManager &SourceMgr; 462a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor DiagnosticsEngine &Diags; 463a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ModuleMap ⤅ 464a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 4658b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor /// \brief The directory that this module map resides in. 4668b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor const DirectoryEntry *Directory; 4678b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor 468a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Whether an error occurred. 469a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool HadError; 470a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 471a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Default target information, used only for string literal 472a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// parsing. 473a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor TargetInfo *Target; 474a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 475a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Stores string data for the various string literals referenced 476a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// during parsing. 477a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::BumpPtrAllocator StringData; 478a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 479a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief The current token. 480a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor MMToken Tok; 481a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 482a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief The active module. 4831a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor Module *ActiveModule; 484a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 485a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Consume the current token and return its location. 486a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation consumeToken(); 487a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 488a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Skip tokens until we reach the a token with the given kind 489a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// (or the end of the file). 490a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor void skipUntil(MMToken::TokenKind K); 491587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 492587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor typedef llvm::SmallVector<std::pair<std::string, SourceLocation>, 2> 493587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ModuleId; 494587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor bool parseModuleId(ModuleId &Id); 495a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor void parseModuleDecl(); 496489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor void parseHeaderDecl(SourceLocation UmbrellaLoc); 49790db26000aefe9335370013eec64c85232d80227Douglas Gregor void parseExportDecl(); 4981e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor void parseInferredSubmoduleDecl(bool Explicit); 499a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 500a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor public: 501a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr, 502a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor DiagnosticsEngine &Diags, 5038b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor ModuleMap &Map, 5048b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor const DirectoryEntry *Directory) 5058b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor : L(L), SourceMgr(SourceMgr), Diags(Diags), Map(Map), 5068b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor Directory(Directory), HadError(false), ActiveModule(0) 507a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor { 508a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor TargetOptions TargetOpts; 509a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor TargetOpts.Triple = llvm::sys::getDefaultTargetTriple(); 510a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts); 511a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 512a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.clear(); 513a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 514a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 515a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 516a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool parseModuleMapFile(); 517a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor }; 518a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 519a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 520a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorSourceLocation ModuleMapParser::consumeToken() { 521a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorretry: 522a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation Result = Tok.getLocation(); 523a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.clear(); 524a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 525a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Token LToken; 526a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor L.LexFromRawLexer(LToken); 527a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Location = LToken.getLocation().getRawEncoding(); 528a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (LToken.getKind()) { 529a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::raw_identifier: 530a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringData = LToken.getRawIdentifierData(); 531a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringLength = LToken.getLength(); 532a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(Tok.getString()) 533a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("header", MMToken::HeaderKeyword) 534a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("explicit", MMToken::ExplicitKeyword) 53590db26000aefe9335370013eec64c85232d80227Douglas Gregor .Case("export", MMToken::ExportKeyword) 536a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor .Case("framework", MMToken::FrameworkKeyword) 537a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("module", MMToken::ModuleKeyword) 538a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("umbrella", MMToken::UmbrellaKeyword) 539a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Default(MMToken::Identifier); 540a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 541a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 542a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::eof: 543a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::EndOfFile; 544a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 545a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 546a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::l_brace: 547a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::LBrace; 548a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 549a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 55090db26000aefe9335370013eec64c85232d80227Douglas Gregor case tok::period: 55190db26000aefe9335370013eec64c85232d80227Douglas Gregor Tok.Kind = MMToken::Period; 55290db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 55390db26000aefe9335370013eec64c85232d80227Douglas Gregor 554a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::r_brace: 555a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::RBrace; 556a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 557a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 55890db26000aefe9335370013eec64c85232d80227Douglas Gregor case tok::star: 55990db26000aefe9335370013eec64c85232d80227Douglas Gregor Tok.Kind = MMToken::Star; 56090db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 56190db26000aefe9335370013eec64c85232d80227Douglas Gregor 562a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::string_literal: { 563a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the string literal. 564a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor LangOptions LangOpts; 565a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringLiteralParser StringLiteral(<oken, 1, SourceMgr, LangOpts, *Target); 566a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (StringLiteral.hadError) 567a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor goto retry; 568a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 569a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Copy the string literal into our string data allocator. 570a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned Length = StringLiteral.GetStringLength(); 571a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor char *Saved = StringData.Allocate<char>(Length + 1); 572a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor memcpy(Saved, StringLiteral.GetString().data(), Length); 573a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Saved[Length] = 0; 574a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 575a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Form the token. 576a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::StringLiteral; 577a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringData = Saved; 578a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringLength = Length; 579a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 580a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 581a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 582a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::comment: 583a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor goto retry; 584a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 585a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor default: 586a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token); 587a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 588a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor goto retry; 589a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 590a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 591a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return Result; 592a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 593a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 594a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::skipUntil(MMToken::TokenKind K) { 595a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned braceDepth = 0; 596a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor do { 597a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (Tok.Kind) { 598a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::EndOfFile: 599a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 600a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 601a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::LBrace: 602a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (Tok.is(K) && braceDepth == 0) 603a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 604a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 605a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ++braceDepth; 606a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 607a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 608a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::RBrace: 609a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (braceDepth > 0) 610a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor --braceDepth; 611a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor else if (Tok.is(K)) 612a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 613a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 614a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 615a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor default: 616a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (braceDepth == 0 && Tok.is(K)) 617a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 618a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 619a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 620a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 621a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 622a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } while (true); 623a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 624a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 625587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// \brief Parse a module-id. 626587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// 627587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// module-id: 628587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// identifier 629587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// identifier '.' module-id 630587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// 631587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// \returns true if an error occurred, false otherwise. 632587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregorbool ModuleMapParser::parseModuleId(ModuleId &Id) { 633587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Id.clear(); 634587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor do { 635587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Tok.is(MMToken::Identifier)) { 636587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation())); 637587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor consumeToken(); 638587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 639587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name); 640587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return true; 641587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 642587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 643587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (!Tok.is(MMToken::Period)) 644587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor break; 645587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 646587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor consumeToken(); 647587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } while (true); 648587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 649587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return false; 650587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor} 651587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 652a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a module declaration. 653a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// 654a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-declaration: 655587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// 'explicit'[opt] 'framework'[opt] 'module' module-id { module-member* } 656a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// 657a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-member: 658a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// header-declaration 659587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// submodule-declaration 66090db26000aefe9335370013eec64c85232d80227Douglas Gregor/// export-declaration 6611e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// 6621e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// submodule-declaration: 6631e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// module-declaration 6641e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// inferred-submodule-declaration 665a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::parseModuleDecl() { 666a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) || 667a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor Tok.is(MMToken::FrameworkKeyword)); 668d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Parse 'explicit' or 'framework' keyword, if present. 669587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor SourceLocation ExplicitLoc; 670a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool Explicit = false; 671d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor bool Framework = false; 672a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor 673a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor // Parse 'explicit' keyword, if present. 674d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Tok.is(MMToken::ExplicitKeyword)) { 675587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ExplicitLoc = consumeToken(); 676a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Explicit = true; 677a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 678d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 679d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Parse 'framework' keyword, if present. 680d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Tok.is(MMToken::FrameworkKeyword)) { 681d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor consumeToken(); 682d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor Framework = true; 683d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 684a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 685a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse 'module' keyword. 686a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Tok.is(MMToken::ModuleKeyword)) { 687e6fb9876970e2dc55f091522644efa16caa9ba06Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 688a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 689a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 690a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 691a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 692a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); // 'module' keyword 6931e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 6941e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // If we have a wildcard for the module name, this is an inferred submodule. 6951e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Parse it. 6961e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::Star)) 6971e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor return parseInferredSubmoduleDecl(Explicit); 698a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 699a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the module name. 700587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ModuleId Id; 701587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (parseModuleId(Id)) { 702587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor HadError = true; 703587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return; 704587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 705587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 706587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (ActiveModule) { 707587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Id.size() > 1) { 708587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id) 709587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor << SourceRange(Id.front().second, Id.back().second); 710587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 711587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor HadError = true; 712587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return; 713587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 714587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else if (Id.size() == 1 && Explicit) { 715587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Top-level modules can't be explicit. 716587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level); 717587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Explicit = false; 718587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ExplicitLoc = SourceLocation(); 719a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 720a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 721587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 722587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Module *PreviousActiveModule = ActiveModule; 723587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Id.size() > 1) { 724587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // This module map defines a submodule. Go find the module of which it 725587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // is a submodule. 726587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ActiveModule = 0; 727587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) { 728587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) { 729587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ActiveModule = Next; 730587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor continue; 731587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 732587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 733587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (ActiveModule) { 734587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified) 735587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor << Id[I].first << ActiveModule->getTopLevelModule(); 736587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 737587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Id[I].second, diag::err_mmap_expected_module_name); 738587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 739587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor HadError = true; 740587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return; 741587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 742587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 743587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 744587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor StringRef ModuleName = Id.back().first; 745587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor SourceLocation ModuleNameLoc = Id.back().second; 746a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 747a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the opening brace. 748a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Tok.is(MMToken::LBrace)) { 749a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace) 750a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor << ModuleName; 751a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 752a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 753a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 754a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation LBraceLoc = consumeToken(); 755a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 756a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Determine whether this (sub)module has already been defined. 757a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::StringMap<Module *> &ModuleSpace 758a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor = ActiveModule? ActiveModule->SubModules : Map.Modules; 759a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::StringMap<Module *>::iterator ExistingModule 760a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor = ModuleSpace.find(ModuleName); 761a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (ExistingModule != ModuleSpace.end()) { 762a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition) 763a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor << ModuleName; 764a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(ExistingModule->getValue()->DefinitionLoc, 765a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor diag::note_mmap_prev_definition); 766a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 767a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Skip the module definition. 768a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor skipUntil(MMToken::RBrace); 769a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (Tok.is(MMToken::RBrace)) 770a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 771a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 772a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 773a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 774a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 775a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 776a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Start defining this module. 777a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor ActiveModule = new Module(ModuleName, ModuleNameLoc, ActiveModule, Framework, 778a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor Explicit); 779a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ModuleSpace[ModuleName] = ActiveModule; 780a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 781a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool Done = false; 782a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor do { 783a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (Tok.Kind) { 784a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::EndOfFile: 785a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::RBrace: 786a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Done = true; 787a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 788a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 789a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::ExplicitKeyword: 790d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor case MMToken::FrameworkKeyword: 791a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::ModuleKeyword: 792a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor parseModuleDecl(); 793a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 794a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 79590db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::ExportKeyword: 79690db26000aefe9335370013eec64c85232d80227Douglas Gregor parseExportDecl(); 79790db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 79890db26000aefe9335370013eec64c85232d80227Douglas Gregor 799489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor case MMToken::UmbrellaKeyword: 800489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor parseHeaderDecl(consumeToken()); 801a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 802a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 803489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor case MMToken::HeaderKeyword: 804489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor parseHeaderDecl(SourceLocation()); 805a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 806489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor 807a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor default: 808a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member); 809a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 810a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 811a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 812a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } while (!Done); 813a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 814a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (Tok.is(MMToken::RBrace)) 815a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 816a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor else { 817a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 818a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 819a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 820a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 821a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 822587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // We're done parsing this module. Pop back to the previous module. 823587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ActiveModule = PreviousActiveModule; 824a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 825d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 826d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor/// \brief Append to \p Paths the set of paths needed to get to the 827d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor/// subframework in which the given module lives. 828d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregorvoid appendSubframeworkPaths(Module *Mod, llvm::SmallVectorImpl<char> &Path) { 829d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Collect the framework names from the given module to the top-level module. 830d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor llvm::SmallVector<StringRef, 2> Paths; 831d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor for (; Mod; Mod = Mod->Parent) { 832d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Mod->IsFramework) 833d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor Paths.push_back(Mod->Name); 834d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 835d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 836d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Paths.empty()) 837d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor return; 838d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 839d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Add Frameworks/Name.framework for each subframework. 840d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor for (unsigned I = Paths.size() - 1; I != 0; --I) { 841d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor llvm::sys::path::append(Path, "Frameworks"); 842d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor llvm::sys::path::append(Path, Paths[I-1] + ".framework"); 843d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 844d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor} 845d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 846489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor/// \brief Parse a header declaration. 847a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// 848489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor/// header-declaration: 849489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor/// 'umbrella'[opt] 'header' string-literal 850489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregorvoid ModuleMapParser::parseHeaderDecl(SourceLocation UmbrellaLoc) { 851489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor assert(Tok.is(MMToken::HeaderKeyword)); 852489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor consumeToken(); 853489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor 854489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor bool Umbrella = UmbrellaLoc.isValid(); 855a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 856a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the header name. 857a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Tok.is(MMToken::StringLiteral)) { 858a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 859489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor << "header"; 860a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 861a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 862a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 863587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor std::string FileName = Tok.getString(); 864a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation FileNameLoc = consumeToken(); 865489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor 8668b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor // Check whether we already have an umbrella header. 867489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor if (Umbrella && ActiveModule->getUmbrellaHeader()) { 8688b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor Diags.Report(FileNameLoc, diag::err_mmap_umbrella_header_conflict) 8698b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor << ActiveModule->getFullModuleName() 87010694cee2588442bee1e717f5042c58ffee25279Douglas Gregor << ActiveModule->getUmbrellaHeader()->getName(); 8718b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor HadError = true; 8728b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor return; 8738b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } 874a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor 8758b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor // Look for this file. 876587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor const FileEntry *File = 0; 8778b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor llvm::SmallString<128> PathName; 878587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (llvm::sys::path::is_absolute(FileName)) { 879587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor PathName = FileName; 880587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 881587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 882587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Search for the header file within the search directory. 88318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor PathName += Directory->getName(); 884587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor unsigned PathLength = PathName.size(); 88518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 886d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (ActiveModule->isPartOfFramework()) { 887d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor appendSubframeworkPaths(ActiveModule, PathName); 888587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 889587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Check whether this file is in the public headers. 89018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor llvm::sys::path::append(PathName, "Headers"); 891587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, FileName); 892587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 893587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 894587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (!File) { 895587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Check whether this file is in the private headers. 896587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor PathName.resize(PathLength); 897587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, "PrivateHeaders"); 898587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, FileName); 899587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 900587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 901587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 902587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Lookup for normal headers. 903587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, FileName); 904587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 905d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 90618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor } 907a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor 9088b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor // FIXME: We shouldn't be eagerly stat'ing every file named in a module map. 9098b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor // Come up with a lazy way to do this. 910587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (File) { 9118b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor if (const Module *OwningModule = Map.Headers[File]) { 9128b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor Diags.Report(FileNameLoc, diag::err_mmap_header_conflict) 9138b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor << FileName << OwningModule->getFullModuleName(); 9148b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor HadError = true; 915489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor } else if (Umbrella) { 916489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor const DirectoryEntry *UmbrellaDir = File->getDir(); 917489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor if (ActiveModule->IsFramework) { 918489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor // For framework modules, use the framework directory as the umbrella 919489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor // directory. 920489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor UmbrellaDir = SourceMgr.getFileManager().getDirectory( 921489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor llvm::sys::path::parent_path(UmbrellaDir->getName())); 922489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor } 923489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor 924489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor if ((OwningModule = Map.UmbrellaDirs[UmbrellaDir])) { 925489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash) 926489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor << OwningModule->getFullModuleName(); 927489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor HadError = true; 928489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor } else { 929489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor // Record this umbrella header. 930489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor Map.setUmbrellaHeader(ActiveModule, File); 931489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor } 9328b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } else { 933489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor // Record this header. 934e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Map.addHeader(ActiveModule, File); 9358b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } 9368b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } else { 9378b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor Diags.Report(FileNameLoc, diag::err_mmap_header_not_found) 9388b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor << false << FileName; 9398b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor HadError = true; 9408b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } 941a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 942a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 94390db26000aefe9335370013eec64c85232d80227Douglas Gregor/// \brief Parse a module export declaration. 94490db26000aefe9335370013eec64c85232d80227Douglas Gregor/// 94590db26000aefe9335370013eec64c85232d80227Douglas Gregor/// export-declaration: 94690db26000aefe9335370013eec64c85232d80227Douglas Gregor/// 'export' wildcard-module-id 94790db26000aefe9335370013eec64c85232d80227Douglas Gregor/// 94890db26000aefe9335370013eec64c85232d80227Douglas Gregor/// wildcard-module-id: 94990db26000aefe9335370013eec64c85232d80227Douglas Gregor/// identifier 95090db26000aefe9335370013eec64c85232d80227Douglas Gregor/// '*' 95190db26000aefe9335370013eec64c85232d80227Douglas Gregor/// identifier '.' wildcard-module-id 95290db26000aefe9335370013eec64c85232d80227Douglas Gregorvoid ModuleMapParser::parseExportDecl() { 95390db26000aefe9335370013eec64c85232d80227Douglas Gregor assert(Tok.is(MMToken::ExportKeyword)); 95490db26000aefe9335370013eec64c85232d80227Douglas Gregor SourceLocation ExportLoc = consumeToken(); 95590db26000aefe9335370013eec64c85232d80227Douglas Gregor 95690db26000aefe9335370013eec64c85232d80227Douglas Gregor // Parse the module-id with an optional wildcard at the end. 95790db26000aefe9335370013eec64c85232d80227Douglas Gregor ModuleId ParsedModuleId; 95890db26000aefe9335370013eec64c85232d80227Douglas Gregor bool Wildcard = false; 95990db26000aefe9335370013eec64c85232d80227Douglas Gregor do { 96090db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Tok.is(MMToken::Identifier)) { 96190db26000aefe9335370013eec64c85232d80227Douglas Gregor ParsedModuleId.push_back(std::make_pair(Tok.getString(), 96290db26000aefe9335370013eec64c85232d80227Douglas Gregor Tok.getLocation())); 96390db26000aefe9335370013eec64c85232d80227Douglas Gregor consumeToken(); 96490db26000aefe9335370013eec64c85232d80227Douglas Gregor 96590db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Tok.is(MMToken::Period)) { 96690db26000aefe9335370013eec64c85232d80227Douglas Gregor consumeToken(); 96790db26000aefe9335370013eec64c85232d80227Douglas Gregor continue; 96890db26000aefe9335370013eec64c85232d80227Douglas Gregor } 96990db26000aefe9335370013eec64c85232d80227Douglas Gregor 97090db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 97190db26000aefe9335370013eec64c85232d80227Douglas Gregor } 97290db26000aefe9335370013eec64c85232d80227Douglas Gregor 97390db26000aefe9335370013eec64c85232d80227Douglas Gregor if(Tok.is(MMToken::Star)) { 97490db26000aefe9335370013eec64c85232d80227Douglas Gregor Wildcard = true; 9750adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor consumeToken(); 97690db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 97790db26000aefe9335370013eec64c85232d80227Douglas Gregor } 97890db26000aefe9335370013eec64c85232d80227Douglas Gregor 97990db26000aefe9335370013eec64c85232d80227Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_export_module_id); 98090db26000aefe9335370013eec64c85232d80227Douglas Gregor HadError = true; 98190db26000aefe9335370013eec64c85232d80227Douglas Gregor return; 98290db26000aefe9335370013eec64c85232d80227Douglas Gregor } while (true); 98390db26000aefe9335370013eec64c85232d80227Douglas Gregor 98490db26000aefe9335370013eec64c85232d80227Douglas Gregor Module::UnresolvedExportDecl Unresolved = { 98590db26000aefe9335370013eec64c85232d80227Douglas Gregor ExportLoc, ParsedModuleId, Wildcard 98690db26000aefe9335370013eec64c85232d80227Douglas Gregor }; 98790db26000aefe9335370013eec64c85232d80227Douglas Gregor ActiveModule->UnresolvedExports.push_back(Unresolved); 98890db26000aefe9335370013eec64c85232d80227Douglas Gregor} 98990db26000aefe9335370013eec64c85232d80227Douglas Gregor 9901e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregorvoid ModuleMapParser::parseInferredSubmoduleDecl(bool Explicit) { 9911e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor assert(Tok.is(MMToken::Star)); 9921e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor SourceLocation StarLoc = consumeToken(); 9931e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor bool Failed = false; 9941e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 9951e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Inferred modules must be submodules. 9961e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (!ActiveModule) { 9971e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule); 9981e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Failed = true; 9991e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 10001e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 10011e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Inferred modules must have umbrella headers. 100210694cee2588442bee1e717f5042c58ffee25279Douglas Gregor if (!Failed && !ActiveModule->getUmbrellaHeader()) { 10031e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella); 10041e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Failed = true; 10051e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 10061e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 10071e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Check for redefinition of an inferred module. 1008ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor if (!Failed && ActiveModule->InferSubmodules) { 10091e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(StarLoc, diag::err_mmap_inferred_redef); 1010ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor if (ActiveModule->InferredSubmoduleLoc.isValid()) 1011ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor Diags.Report(ActiveModule->InferredSubmoduleLoc, 10121e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor diag::note_mmap_prev_definition); 10131e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Failed = true; 10141e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 10151e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 10161e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // If there were any problems with this inferred submodule, skip its body. 10171e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Failed) { 10181e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::LBrace)) { 10191e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 10201e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor skipUntil(MMToken::RBrace); 10211e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::RBrace)) 10221e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 10231e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 10241e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor HadError = true; 10251e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor return; 10261e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 10271e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 10281e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Note that we have an inferred submodule. 1029ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor ActiveModule->InferSubmodules = true; 1030ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor ActiveModule->InferredSubmoduleLoc = StarLoc; 1031ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor ActiveModule->InferExplicitSubmodules = Explicit; 10321e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 10331e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Parse the opening brace. 10341e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (!Tok.is(MMToken::LBrace)) { 10351e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard); 10361e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor HadError = true; 10371e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor return; 10381e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 10391e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor SourceLocation LBraceLoc = consumeToken(); 10401e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 10411e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Parse the body of the inferred submodule. 10421e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor bool Done = false; 10431e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor do { 10441e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor switch (Tok.Kind) { 10451e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::EndOfFile: 10461e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::RBrace: 10471e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Done = true; 10481e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor break; 10491e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 10501e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::ExportKeyword: { 10511e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 10521e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::Star)) 1053ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor ActiveModule->InferExportWildcard = true; 10541e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor else 10551e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(Tok.getLocation(), 10561e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor diag::err_mmap_expected_export_wildcard); 10571e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 10581e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor break; 10591e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 10601e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 10611e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::ExplicitKeyword: 10621e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::ModuleKeyword: 10631e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::HeaderKeyword: 10641e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::UmbrellaKeyword: 10651e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor default: 10661e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_wildcard_member); 10671e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 10681e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor break; 10691e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 10701e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } while (!Done); 10711e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 10721e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::RBrace)) 10731e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 10741e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor else { 10751e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 10761e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 10771e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor HadError = true; 10781e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 10791e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor} 10801e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 1081a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a module map file. 1082a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// 1083a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-map-file: 1084a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-declaration* 1085a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorbool ModuleMapParser::parseModuleMapFile() { 1086a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor do { 1087a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (Tok.Kind) { 1088a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::EndOfFile: 1089a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return HadError; 1090a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1091587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor case MMToken::ExplicitKeyword: 1092a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::ModuleKeyword: 1093a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor case MMToken::FrameworkKeyword: 1094a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor parseModuleDecl(); 1095a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1096a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 109790db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::ExportKeyword: 1098a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::HeaderKeyword: 1099a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::Identifier: 1100a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::LBrace: 110190db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::Period: 1102a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::RBrace: 110390db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::Star: 1104a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::StringLiteral: 1105a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::UmbrellaKeyword: 1106a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 1107a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1108a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 1109a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1110a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1111a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } while (true); 1112a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1113a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return HadError; 1114a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 1115a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1116a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorbool ModuleMap::parseModuleMapFile(const FileEntry *File) { 1117a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor FileID ID = SourceMgr->createFileID(File, SourceLocation(), SrcMgr::C_User); 1118a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor const llvm::MemoryBuffer *Buffer = SourceMgr->getBuffer(ID); 1119a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Buffer) 1120a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return true; 1121a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1122a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse this module map file. 1123a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Lexer L(ID, SourceMgr->getBuffer(ID), *SourceMgr, LangOpts); 1124a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags->getClient()->BeginSourceFile(LangOpts); 11258b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor ModuleMapParser Parser(L, *SourceMgr, *Diags, *this, File->getDir()); 1126a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool Result = Parser.parseModuleMapFile(); 1127a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags->getClient()->EndSourceFile(); 1128a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1129a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return Result; 1130a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 1131