ModuleMap.cpp revision 8767dc29ec23f96e71658f760333bdf5d87283d5
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/Basic/Diagnostic.h" 1602c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor#include "clang/Basic/DiagnosticOptions.h" 17a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/FileManager.h" 18a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/TargetInfo.h" 19a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/TargetOptions.h" 2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/LexDiagnostic.h" 2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/Lexer.h" 2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/LiteralSupport.h" 2355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/StringRef.h" 2455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/StringSwitch.h" 25a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/Allocator.h" 26ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor#include "llvm/Support/FileSystem.h" 27a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/Host.h" 288b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor#include "llvm/Support/PathV2.h" 29a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/raw_ostream.h" 3098cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor#include <stdlib.h> 31a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorusing namespace clang; 32a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 3390db26000aefe9335370013eec64c85232d80227Douglas GregorModule::ExportDecl 3490db26000aefe9335370013eec64c85232d80227Douglas GregorModuleMap::resolveExport(Module *Mod, 3590db26000aefe9335370013eec64c85232d80227Douglas Gregor const Module::UnresolvedExportDecl &Unresolved, 3690db26000aefe9335370013eec64c85232d80227Douglas Gregor bool Complain) { 370adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor // We may have just a wildcard. 380adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor if (Unresolved.Id.empty()) { 390adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor assert(Unresolved.Wildcard && "Invalid unresolved export"); 400adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor return Module::ExportDecl(0, true); 410adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor } 420adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor 4390db26000aefe9335370013eec64c85232d80227Douglas Gregor // Find the starting module. 4490db26000aefe9335370013eec64c85232d80227Douglas Gregor Module *Context = lookupModuleUnqualified(Unresolved.Id[0].first, Mod); 4590db26000aefe9335370013eec64c85232d80227Douglas Gregor if (!Context) { 4690db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Complain) 4790db26000aefe9335370013eec64c85232d80227Douglas Gregor Diags->Report(Unresolved.Id[0].second, 4890db26000aefe9335370013eec64c85232d80227Douglas Gregor diag::err_mmap_missing_module_unqualified) 4990db26000aefe9335370013eec64c85232d80227Douglas Gregor << Unresolved.Id[0].first << Mod->getFullModuleName(); 5090db26000aefe9335370013eec64c85232d80227Douglas Gregor 5190db26000aefe9335370013eec64c85232d80227Douglas Gregor return Module::ExportDecl(); 5290db26000aefe9335370013eec64c85232d80227Douglas Gregor } 5390db26000aefe9335370013eec64c85232d80227Douglas Gregor 5490db26000aefe9335370013eec64c85232d80227Douglas Gregor // Dig into the module path. 5590db26000aefe9335370013eec64c85232d80227Douglas Gregor for (unsigned I = 1, N = Unresolved.Id.size(); I != N; ++I) { 5690db26000aefe9335370013eec64c85232d80227Douglas Gregor Module *Sub = lookupModuleQualified(Unresolved.Id[I].first, 5790db26000aefe9335370013eec64c85232d80227Douglas Gregor Context); 5890db26000aefe9335370013eec64c85232d80227Douglas Gregor if (!Sub) { 5990db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Complain) 6090db26000aefe9335370013eec64c85232d80227Douglas Gregor Diags->Report(Unresolved.Id[I].second, 6190db26000aefe9335370013eec64c85232d80227Douglas Gregor diag::err_mmap_missing_module_qualified) 6290db26000aefe9335370013eec64c85232d80227Douglas Gregor << Unresolved.Id[I].first << Context->getFullModuleName() 6390db26000aefe9335370013eec64c85232d80227Douglas Gregor << SourceRange(Unresolved.Id[0].second, Unresolved.Id[I-1].second); 6490db26000aefe9335370013eec64c85232d80227Douglas Gregor 6590db26000aefe9335370013eec64c85232d80227Douglas Gregor return Module::ExportDecl(); 6690db26000aefe9335370013eec64c85232d80227Douglas Gregor } 6790db26000aefe9335370013eec64c85232d80227Douglas Gregor 6890db26000aefe9335370013eec64c85232d80227Douglas Gregor Context = Sub; 6990db26000aefe9335370013eec64c85232d80227Douglas Gregor } 7090db26000aefe9335370013eec64c85232d80227Douglas Gregor 7190db26000aefe9335370013eec64c85232d80227Douglas Gregor return Module::ExportDecl(Context, Unresolved.Wildcard); 7290db26000aefe9335370013eec64c85232d80227Douglas Gregor} 7390db26000aefe9335370013eec64c85232d80227Douglas Gregor 7451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas GregorModuleMap::ModuleMap(FileManager &FileMgr, const DiagnosticConsumer &DC, 75dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor const LangOptions &LangOpts, const TargetInfo *Target) 762f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor : LangOpts(LangOpts), Target(Target), BuiltinIncludeDir(0) 7751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor{ 78c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs); 79c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith Diags = IntrusiveRefCntPtr<DiagnosticsEngine>( 8002c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor new DiagnosticsEngine(DiagIDs, new DiagnosticOptions)); 81a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags->setClient(DC.clone(*Diags), /*ShouldOwnClient=*/true); 82a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceMgr = new SourceManager(*Diags, FileMgr); 83a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 84a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 85a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorModuleMap::~ModuleMap() { 8609fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor for (llvm::StringMap<Module *>::iterator I = Modules.begin(), 8709fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor IEnd = Modules.end(); 8809fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor I != IEnd; ++I) { 8909fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor delete I->getValue(); 9009fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor } 9109fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor 92a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor delete SourceMgr; 93a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 94a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 95dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregorvoid ModuleMap::setTarget(const TargetInfo &Target) { 96dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor assert((!this->Target || this->Target == &Target) && 97dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor "Improper target override"); 98dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor this->Target = &Target; 99dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor} 100dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor 1018b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor/// \brief "Sanitize" a filename so that it can be used as an identifier. 1028b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregorstatic StringRef sanitizeFilenameAsIdentifier(StringRef Name, 1038b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor SmallVectorImpl<char> &Buffer) { 1048b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor if (Name.empty()) 1058b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor return Name; 1068b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor 1078b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor // Check whether the filename is already an identifier; this is the common 1088b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor // case. 1098b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor bool isIdentifier = true; 1108b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor for (unsigned I = 0, N = Name.size(); I != N; ++I) { 1118b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor if (isalpha(Name[I]) || Name[I] == '_' || (isdigit(Name[I]) && I > 0)) 1128b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor continue; 1138b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor 1148b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor isIdentifier = false; 1158b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor break; 1168b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor } 1178b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor 1188b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor if (!isIdentifier) { 1198b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor // If we don't already have something with the form of an identifier, 1208b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor // create a buffer with the sanitized name. 1218b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Buffer.clear(); 1228b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor if (isdigit(Name[0])) 1238b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Buffer.push_back('_'); 1248b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Buffer.reserve(Buffer.size() + Name.size()); 1258b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor for (unsigned I = 0, N = Name.size(); I != N; ++I) { 1268b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor if (isalnum(Name[I]) || isspace(Name[I])) 1278b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Buffer.push_back(Name[I]); 1288b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor else 1298b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Buffer.push_back('_'); 1308b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor } 1318b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor 1328b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Name = StringRef(Buffer.data(), Buffer.size()); 1338b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor } 1348b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor 1358b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor while (llvm::StringSwitch<bool>(Name) 1368b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor#define KEYWORD(Keyword,Conditions) .Case(#Keyword, true) 1378b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor#define ALIAS(Keyword, AliasOf, Conditions) .Case(Keyword, true) 1388b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor#include "clang/Basic/TokenKinds.def" 1398b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor .Default(false)) { 1408b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor if (Name.data() != Buffer.data()) 1418b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Buffer.append(Name.begin(), Name.end()); 1428b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Buffer.push_back('_'); 1438b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Name = StringRef(Buffer.data(), Buffer.size()); 1448b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor } 1458b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor 1468b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor return Name; 1478b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor} 1488b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor 1491a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *ModuleMap::findModuleForHeader(const FileEntry *File) { 1502b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor HeadersMap::iterator Known = Headers.find(File); 15151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (Known != Headers.end()) { 1522b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor // If a header is not available, don't report that it maps to anything. 1532b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor if (!Known->second.isAvailable()) 15451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return 0; 15551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 1562b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor return Known->second.getModule(); 15751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 15865f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor 159adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor const DirectoryEntry *Dir = File->getDir(); 160cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<const DirectoryEntry *, 2> SkippedDirs; 161aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor#ifdef LLVM_ON_UNIX 162aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor // Note: as an egregious but useful hack we use the real path here, because 163aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor // frameworks moving from top-level frameworks to embedded frameworks tend 164aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor // to be symlinked from the top-level location to the embedded location, 165aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor // and we need to resolve lookups as if we had found the embedded location. 166aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor char RealDirName[PATH_MAX]; 167aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor StringRef DirName; 168aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor if (realpath(Dir->getName(), RealDirName)) 169aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor DirName = RealDirName; 170aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor else 171aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor DirName = Dir->getName(); 172aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor#else 173adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor StringRef DirName = Dir->getName(); 174aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor#endif 175e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 176e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Keep walking up the directory hierarchy, looking for a directory with 177e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // an umbrella header. 178e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor do { 179e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir 180e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor = UmbrellaDirs.find(Dir); 181adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor if (KnownDir != UmbrellaDirs.end()) { 182adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor Module *Result = KnownDir->second; 1839f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor 1849f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor // Search up the module stack until we find a module with an umbrella 18510694cee2588442bee1e717f5042c58ffee25279Douglas Gregor // directory. 1869f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor Module *UmbrellaModule = Result; 18710694cee2588442bee1e717f5042c58ffee25279Douglas Gregor while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent) 1889f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor UmbrellaModule = UmbrellaModule->Parent; 18951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 1909f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor if (UmbrellaModule->InferSubmodules) { 191e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Infer submodules for each of the directories we found between 192e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // the directory of the umbrella header and the directory where 193e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // the actual header is located. 19423af6d58e392e18ae2946b799264717f480e6596Douglas Gregor bool Explicit = UmbrellaModule->InferExplicitSubmodules; 195e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 1966a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor for (unsigned I = SkippedDirs.size(); I != 0; --I) { 197e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Find or create the module that corresponds to this directory name. 1988b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor SmallString<32> NameBuf; 1998b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor StringRef Name = sanitizeFilenameAsIdentifier( 2008b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor llvm::sys::path::stem(SkippedDirs[I-1]->getName()), 2018b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor NameBuf); 202e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result = findOrCreateModule(Name, Result, /*IsFramework=*/false, 20323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Explicit).first; 204e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 205e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Associate the module and the directory. 206e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor UmbrellaDirs[SkippedDirs[I-1]] = Result; 207e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 208e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // If inferred submodules export everything they import, add a 209e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // wildcard to the set of exports. 2109f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor if (UmbrellaModule->InferExportWildcard && Result->Exports.empty()) 211e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->Exports.push_back(Module::ExportDecl(0, true)); 212e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } 213e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 214e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Infer a submodule with the same name as this header file. 2158b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor SmallString<32> NameBuf; 2168b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor StringRef Name = sanitizeFilenameAsIdentifier( 2178b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor llvm::sys::path::stem(File->getName()), NameBuf); 218e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result = findOrCreateModule(Name, Result, /*IsFramework=*/false, 21923af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Explicit).first; 220c7782d96c657eeb767bfea5117db49dc40e6356cArgyrios Kyrtzidis Result->TopHeaders.insert(File); 221e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 222e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // If inferred submodules export everything they import, add a 223e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // wildcard to the set of exports. 2249f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor if (UmbrellaModule->InferExportWildcard && Result->Exports.empty()) 225e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->Exports.push_back(Module::ExportDecl(0, true)); 226e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } else { 227e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Record each of the directories we stepped through as being part of 228e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // the module we found, since the umbrella header covers them all. 229e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I) 230e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor UmbrellaDirs[SkippedDirs[I]] = Result; 231e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } 232adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor 2332b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Headers[File] = KnownHeader(Result, /*Excluded=*/false); 23451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 23551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // If a header corresponds to an unavailable module, don't report 23651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // that it maps to anything. 23751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Result->isAvailable()) 23851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return 0; 23951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 240adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor return Result; 241adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor } 242adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor 243adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor SkippedDirs.push_back(Dir); 244e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 245e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Retrieve our parent path. 246e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor DirName = llvm::sys::path::parent_path(DirName); 247e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor if (DirName.empty()) 248e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor break; 249e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 250e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Resolve the parent path to a directory entry. 251e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Dir = SourceMgr->getFileManager().getDirectory(DirName); 252e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } while (Dir); 253adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor 25465f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor return 0; 25565f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor} 25665f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor 25751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregorbool ModuleMap::isHeaderInUnavailableModule(const FileEntry *Header) { 2582b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor HeadersMap::iterator Known = Headers.find(Header); 25951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (Known != Headers.end()) 2602b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor return !Known->second.isAvailable(); 26151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 26251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor const DirectoryEntry *Dir = Header->getDir(); 263cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<const DirectoryEntry *, 2> SkippedDirs; 26451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor StringRef DirName = Dir->getName(); 26551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 26651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Keep walking up the directory hierarchy, looking for a directory with 26751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // an umbrella header. 26851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor do { 26951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir 27051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor = UmbrellaDirs.find(Dir); 27151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (KnownDir != UmbrellaDirs.end()) { 27251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Module *Found = KnownDir->second; 27351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Found->isAvailable()) 27451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return true; 27551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 27651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Search up the module stack until we find a module with an umbrella 27751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // directory. 27851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Module *UmbrellaModule = Found; 27951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent) 28051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor UmbrellaModule = UmbrellaModule->Parent; 28151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 28251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (UmbrellaModule->InferSubmodules) { 28351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor for (unsigned I = SkippedDirs.size(); I != 0; --I) { 28451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Find or create the module that corresponds to this directory name. 2858b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor SmallString<32> NameBuf; 2868b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor StringRef Name = sanitizeFilenameAsIdentifier( 2878b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor llvm::sys::path::stem(SkippedDirs[I-1]->getName()), 2888b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor NameBuf); 28951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Found = lookupModuleQualified(Name, Found); 29051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Found) 29151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return false; 29251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Found->isAvailable()) 29351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return true; 29451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 29551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 29651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Infer a submodule with the same name as this header file. 2978b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor SmallString<32> NameBuf; 2988b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor StringRef Name = sanitizeFilenameAsIdentifier( 2998b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor llvm::sys::path::stem(Header->getName()), 3008b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor NameBuf); 30151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Found = lookupModuleQualified(Name, Found); 30251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Found) 30351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return false; 30451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 30551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 30651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return !Found->isAvailable(); 30751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 30851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 30951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor SkippedDirs.push_back(Dir); 31051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 31151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Retrieve our parent path. 31251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor DirName = llvm::sys::path::parent_path(DirName); 31351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (DirName.empty()) 31451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor break; 31551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 31651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Resolve the parent path to a directory entry. 31751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Dir = SourceMgr->getFileManager().getDirectory(DirName); 31851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } while (Dir); 31951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 32051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return false; 32151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor} 32251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 3231a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *ModuleMap::findModule(StringRef Name) { 324484535e45b4d301847a157e943c7823da5d40884Douglas Gregor llvm::StringMap<Module *>::iterator Known = Modules.find(Name); 325484535e45b4d301847a157e943c7823da5d40884Douglas Gregor if (Known != Modules.end()) 326484535e45b4d301847a157e943c7823da5d40884Douglas Gregor return Known->getValue(); 327484535e45b4d301847a157e943c7823da5d40884Douglas Gregor 328484535e45b4d301847a157e943c7823da5d40884Douglas Gregor return 0; 329484535e45b4d301847a157e943c7823da5d40884Douglas Gregor} 330484535e45b4d301847a157e943c7823da5d40884Douglas Gregor 33190db26000aefe9335370013eec64c85232d80227Douglas GregorModule *ModuleMap::lookupModuleUnqualified(StringRef Name, Module *Context) { 33290db26000aefe9335370013eec64c85232d80227Douglas Gregor for(; Context; Context = Context->Parent) { 33390db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Module *Sub = lookupModuleQualified(Name, Context)) 33490db26000aefe9335370013eec64c85232d80227Douglas Gregor return Sub; 33590db26000aefe9335370013eec64c85232d80227Douglas Gregor } 33690db26000aefe9335370013eec64c85232d80227Douglas Gregor 33790db26000aefe9335370013eec64c85232d80227Douglas Gregor return findModule(Name); 33890db26000aefe9335370013eec64c85232d80227Douglas Gregor} 33990db26000aefe9335370013eec64c85232d80227Douglas Gregor 34090db26000aefe9335370013eec64c85232d80227Douglas GregorModule *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) { 34190db26000aefe9335370013eec64c85232d80227Douglas Gregor if (!Context) 34290db26000aefe9335370013eec64c85232d80227Douglas Gregor return findModule(Name); 34390db26000aefe9335370013eec64c85232d80227Douglas Gregor 344b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor return Context->findSubmodule(Name); 34590db26000aefe9335370013eec64c85232d80227Douglas Gregor} 34690db26000aefe9335370013eec64c85232d80227Douglas Gregor 3471a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorstd::pair<Module *, bool> 348392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework, 349392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor bool IsExplicit) { 350392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Try to find an existing module with this name. 351b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (Module *Sub = lookupModuleQualified(Name, Parent)) 352b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor return std::make_pair(Sub, false); 353392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 354392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Create a new module with this name. 355392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework, 356392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor IsExplicit); 357b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (!Parent) 358392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Modules[Name] = Result; 359392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return std::make_pair(Result, true); 360392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor} 361392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 36282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregorbool ModuleMap::canInferFrameworkModule(const DirectoryEntry *ParentDir, 36382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor StringRef Name, bool &IsSystem) { 36482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Check whether we have already looked into the parent directory 36582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // for a module map. 36682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::iterator 36782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor inferred = InferredDirectories.find(ParentDir); 36882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (inferred == InferredDirectories.end()) 36982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor return false; 37082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 37182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!inferred->second.InferModules) 37282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor return false; 37382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 37482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // We're allowed to infer for this directory, but make sure it's okay 37582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // to infer this particular module. 37682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor bool canInfer = std::find(inferred->second.ExcludedModules.begin(), 37782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor inferred->second.ExcludedModules.end(), 37882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Name) == inferred->second.ExcludedModules.end(); 37982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 38082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (canInfer && inferred->second.InferSystemModules) 38182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor IsSystem = true; 38282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 38382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor return canInfer; 38482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor} 38582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 3868767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor/// \brief For a framework module, infer the framework against which we 3878767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor/// should link. 3888767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregorstatic void inferFrameworkLink(Module *Mod, const DirectoryEntry *FrameworkDir, 3898767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor FileManager &FileMgr) { 3908767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor assert(Mod->IsFramework && "Can only infer linking for framework modules"); 3918767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor assert(!Mod->isSubFramework() && 3928767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor "Can only infer linking for top-level frameworks"); 3938767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor 3948767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor SmallString<128> LibName; 3958767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor LibName += FrameworkDir->getName(); 3968767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor llvm::sys::path::append(LibName, Mod->Name); 3978767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor if (FileMgr.getFile(LibName)) { 3988767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor Mod->LinkLibraries.push_back(Module::LinkLibrary(Mod->Name, 3998767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor /*IsFramework=*/true)); 4008767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor } 4018767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor} 4028767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor 4031a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule * 40482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas GregorModuleMap::inferFrameworkModule(StringRef ModuleName, 405ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor const DirectoryEntry *FrameworkDir, 406a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor bool IsSystem, 407ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Module *Parent) { 4082821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // Check whether we've already found this module. 409ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor if (Module *Mod = lookupModuleQualified(ModuleName, Parent)) 410ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor return Mod; 411ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor 412ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor FileManager &FileMgr = SourceMgr->getFileManager(); 41382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 41482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // If the framework has a parent path from which we're allowed to infer 41582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // a framework module, do so. 41682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!Parent) { 4177005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor // Determine whether we're allowed to infer a module map. 4187005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor StringRef FrameworkDirName = FrameworkDir->getName(); 4197005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor#ifdef LLVM_ON_UNIX 4207005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor // Note: as an egregious but useful hack we use the real path here, because 4217005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor // we might be looking at an embedded framework that symlinks out to a 4227005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor // top-level framework, and we need to infer as if we were naming the 4237005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor // top-level framework. 4247005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor char RealFrameworkDirName[PATH_MAX]; 4257005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor if (realpath(FrameworkDir->getName(), RealFrameworkDirName)) 4267005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor FrameworkDirName = RealFrameworkDirName; 4277005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor#endif 4287005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor 42982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor bool canInfer = false; 4307005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor if (llvm::sys::path::has_parent_path(FrameworkDirName)) { 43182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Figure out the parent path. 4327005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor StringRef Parent = llvm::sys::path::parent_path(FrameworkDirName); 43382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (const DirectoryEntry *ParentDir = FileMgr.getDirectory(Parent)) { 43482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Check whether we have already looked into the parent directory 43582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // for a module map. 43682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::iterator 43782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor inferred = InferredDirectories.find(ParentDir); 43882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (inferred == InferredDirectories.end()) { 43982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // We haven't looked here before. Load a module map, if there is 44082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // one. 44182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor SmallString<128> ModMapPath = Parent; 44282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor llvm::sys::path::append(ModMapPath, "module.map"); 44382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (const FileEntry *ModMapFile = FileMgr.getFile(ModMapPath)) { 44482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor parseModuleMapFile(ModMapFile); 44582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor inferred = InferredDirectories.find(ParentDir); 44682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 44782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 44882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (inferred == InferredDirectories.end()) 44982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor inferred = InferredDirectories.insert( 45082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor std::make_pair(ParentDir, InferredDirectory())).first; 45182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 45282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 45382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (inferred->second.InferModules) { 45482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // We're allowed to infer for this directory, but make sure it's okay 45582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // to infer this particular module. 4567005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor StringRef Name = llvm::sys::path::stem(FrameworkDirName); 45782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor canInfer = std::find(inferred->second.ExcludedModules.begin(), 45882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor inferred->second.ExcludedModules.end(), 45982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Name) == inferred->second.ExcludedModules.end(); 46082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 46182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (inferred->second.InferSystemModules) 46282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor IsSystem = true; 46382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 46482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 46582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 46682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 46782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // If we're not allowed to infer a framework module, don't. 46882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!canInfer) 46982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor return 0; 47082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 47182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 47282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 4732821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // Look for an umbrella header. 474f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName()); 4752821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor llvm::sys::path::append(UmbrellaName, "Headers"); 4762821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor llvm::sys::path::append(UmbrellaName, ModuleName + ".h"); 477ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName); 4782821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor 4792821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // FIXME: If there's no umbrella header, we could probably scan the 4802821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // framework to load *everything*. But, it's not clear that this is a good 4812821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // idea. 4822821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor if (!UmbrellaHeader) 4832821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor return 0; 4842821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor 485ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Module *Result = new Module(ModuleName, SourceLocation(), Parent, 486ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor /*IsFramework=*/true, /*IsExplicit=*/false); 487a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (IsSystem) 488a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor Result->IsSystem = IsSystem; 489a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 490b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (!Parent) 491ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Modules[ModuleName] = Result; 492b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor 493489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor // umbrella header "umbrella-header-name" 49410694cee2588442bee1e717f5042c58ffee25279Douglas Gregor Result->Umbrella = UmbrellaHeader; 4952b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Headers[UmbrellaHeader] = KnownHeader(Result, /*Excluded=*/false); 4963cee31e4d7c23d3d5d0b8927998577b9f75087d7Douglas Gregor UmbrellaDirs[UmbrellaHeader->getDir()] = Result; 497209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor 498209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor // export * 499209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor Result->Exports.push_back(Module::ExportDecl(0, true)); 500209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor 501e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // module * { export * } 502e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->InferSubmodules = true; 503e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->InferExportWildcard = true; 504e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 505ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor // Look for subframeworks. 506ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor llvm::error_code EC; 507f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> SubframeworksDirName 50852b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor = StringRef(FrameworkDir->getName()); 509ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor llvm::sys::path::append(SubframeworksDirName, "Frameworks"); 510f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> SubframeworksDirNameNative; 51152b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor llvm::sys::path::native(SubframeworksDirName.str(), 51252b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor SubframeworksDirNameNative); 51352b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor for (llvm::sys::fs::directory_iterator 51452b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor Dir(SubframeworksDirNameNative.str(), EC), DirEnd; 515ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Dir != DirEnd && !EC; Dir.increment(EC)) { 516ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor if (!StringRef(Dir->path()).endswith(".framework")) 517ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor continue; 51898cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor 519ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor if (const DirectoryEntry *SubframeworkDir 520ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor = FileMgr.getDirectory(Dir->path())) { 52198cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor // Note: as an egregious but useful hack, we use the real path here and 52298cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor // check whether it is actually a subdirectory of the parent directory. 52398cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor // This will not be the case if the 'subframework' is actually a symlink 52498cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor // out to a top-level framework. 52598cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor#ifdef LLVM_ON_UNIX 52698cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor char RealSubframeworkDirName[PATH_MAX]; 52798cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor if (realpath(Dir->path().c_str(), RealSubframeworkDirName)) { 52898cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor StringRef SubframeworkDirName = RealSubframeworkDirName; 52998cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor 53098cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor bool FoundParent = false; 53198cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor do { 53298cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor // Get the parent directory name. 53398cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor SubframeworkDirName 53498cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor = llvm::sys::path::parent_path(SubframeworkDirName); 53598cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor if (SubframeworkDirName.empty()) 53698cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor break; 53798cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor 53898cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor if (FileMgr.getDirectory(SubframeworkDirName) == FrameworkDir) { 53998cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor FoundParent = true; 54098cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor break; 54198cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor } 54298cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor } while (true); 54398cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor 54498cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor if (!FoundParent) 54598cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor continue; 54698cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor } 54798cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor#endif 54898cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor 549ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor // FIXME: Do we want to warn about subframeworks without umbrella headers? 5508b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor SmallString<32> NameBuf; 5518b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor inferFrameworkModule(sanitizeFilenameAsIdentifier( 5528b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor llvm::sys::path::stem(Dir->path()), NameBuf), 5538b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor SubframeworkDir, IsSystem, Result); 554ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor } 555ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor } 5563a110f75acafc992cb664200cebec90520986715Douglas Gregor 5578767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor // If the module is a top-level framework, automatically link against the 5588767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor // framework. 5598767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor if (!Result->isSubFramework()) { 5608767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor inferFrameworkLink(Result, FrameworkDir, FileMgr); 5618767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor } 5628767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor 5632821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor return Result; 5642821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor} 5652821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor 566e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregorvoid ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader){ 5672b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Headers[UmbrellaHeader] = KnownHeader(Mod, /*Excluded=*/false); 56810694cee2588442bee1e717f5042c58ffee25279Douglas Gregor Mod->Umbrella = UmbrellaHeader; 5696a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor UmbrellaDirs[UmbrellaHeader->getDir()] = Mod; 570e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor} 571e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 57277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregorvoid ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir) { 57377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Mod->Umbrella = UmbrellaDir; 57477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor UmbrellaDirs[UmbrellaDir] = Mod; 57577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor} 57677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 5772b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregorvoid ModuleMap::addHeader(Module *Mod, const FileEntry *Header, 5782b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor bool Excluded) { 5792b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor if (Excluded) 5802b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Mod->ExcludedHeaders.push_back(Header); 5812b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor else 5822b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Mod->Headers.push_back(Header); 5832b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Headers[Header] = KnownHeader(Mod, Excluded); 584e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor} 585e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 586f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregorconst FileEntry * 5871a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModuleMap::getContainingModuleMapFile(Module *Module) { 588f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor if (Module->DefinitionLoc.isInvalid() || !SourceMgr) 589f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor return 0; 590f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 591f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor return SourceMgr->getFileEntryForID( 592f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor SourceMgr->getFileID(Module->DefinitionLoc)); 593f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor} 594f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 595a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMap::dump() { 596a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::errs() << "Modules:"; 597a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor for (llvm::StringMap<Module *>::iterator M = Modules.begin(), 598a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor MEnd = Modules.end(); 599a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor M != MEnd; ++M) 600804c3bfee22076f232dddf4839439119cfdee2b6Douglas Gregor M->getValue()->print(llvm::errs(), 2); 601a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 602a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::errs() << "Headers:"; 6032b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor for (HeadersMap::iterator H = Headers.begin(), HEnd = Headers.end(); 604a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor H != HEnd; ++H) { 605a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::errs() << " \"" << H->first->getName() << "\" -> " 6062b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor << H->second.getModule()->getFullModuleName() << "\n"; 607a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 608a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 609a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 61090db26000aefe9335370013eec64c85232d80227Douglas Gregorbool ModuleMap::resolveExports(Module *Mod, bool Complain) { 61190db26000aefe9335370013eec64c85232d80227Douglas Gregor bool HadError = false; 61290db26000aefe9335370013eec64c85232d80227Douglas Gregor for (unsigned I = 0, N = Mod->UnresolvedExports.size(); I != N; ++I) { 61390db26000aefe9335370013eec64c85232d80227Douglas Gregor Module::ExportDecl Export = resolveExport(Mod, Mod->UnresolvedExports[I], 61490db26000aefe9335370013eec64c85232d80227Douglas Gregor Complain); 6150adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor if (Export.getPointer() || Export.getInt()) 61690db26000aefe9335370013eec64c85232d80227Douglas Gregor Mod->Exports.push_back(Export); 61790db26000aefe9335370013eec64c85232d80227Douglas Gregor else 61890db26000aefe9335370013eec64c85232d80227Douglas Gregor HadError = true; 61990db26000aefe9335370013eec64c85232d80227Douglas Gregor } 62090db26000aefe9335370013eec64c85232d80227Douglas Gregor Mod->UnresolvedExports.clear(); 62190db26000aefe9335370013eec64c85232d80227Douglas Gregor return HadError; 62290db26000aefe9335370013eec64c85232d80227Douglas Gregor} 62390db26000aefe9335370013eec64c85232d80227Douglas Gregor 62455988680ece66b8e505ee136b35e74fcb1173aeeDouglas GregorModule *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) { 62555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor if (Loc.isInvalid()) 62655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor return 0; 62755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 62855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor // Use the expansion location to determine which module we're in. 62955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor FullSourceLoc ExpansionLoc = Loc.getExpansionLoc(); 63055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor if (!ExpansionLoc.isFileID()) 63155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor return 0; 63255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 63355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 63455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor const SourceManager &SrcMgr = Loc.getManager(); 63555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor FileID ExpansionFileID = ExpansionLoc.getFileID(); 63655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 637303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor while (const FileEntry *ExpansionFile 638303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor = SrcMgr.getFileEntryForID(ExpansionFileID)) { 639303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor // Find the module that owns this header (if any). 640303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor if (Module *Mod = findModuleForHeader(ExpansionFile)) 641303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor return Mod; 642303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor 643303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor // No module owns this header, so look up the inclusion chain to see if 644303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor // any included header has an associated module. 645303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor SourceLocation IncludeLoc = SrcMgr.getIncludeLoc(ExpansionFileID); 646303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor if (IncludeLoc.isInvalid()) 647303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor return 0; 648303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor 649303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor ExpansionFileID = SrcMgr.getFileID(IncludeLoc); 650303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor } 651303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor 652303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor return 0; 65355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor} 65455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 655a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//----------------------------------------------------------------------------// 656a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// Module map file parser 657a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//----------------------------------------------------------------------------// 658a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 659a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregornamespace clang { 660a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief A token in a module map file. 661a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor struct MMToken { 662a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor enum TokenKind { 66351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Comma, 664a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor EndOfFile, 665a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HeaderKeyword, 666a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Identifier, 6672b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor ExcludeKeyword, 668a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ExplicitKeyword, 66990db26000aefe9335370013eec64c85232d80227Douglas Gregor ExportKeyword, 670a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor FrameworkKeyword, 671b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor LinkKeyword, 672a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ModuleKeyword, 67390db26000aefe9335370013eec64c85232d80227Douglas Gregor Period, 674a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor UmbrellaKeyword, 67551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor RequiresKeyword, 67690db26000aefe9335370013eec64c85232d80227Douglas Gregor Star, 677a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringLiteral, 678a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor LBrace, 679a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor RBrace, 680a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor LSquare, 681a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor RSquare 682a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } Kind; 683a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 684a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned Location; 685a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned StringLength; 686a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor const char *StringData; 687a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 688a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor void clear() { 689a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Kind = EndOfFile; 690a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Location = 0; 691a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringLength = 0; 692a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringData = 0; 693a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 694a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 695a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool is(TokenKind K) const { return Kind == K; } 696a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 697a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation getLocation() const { 698a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return SourceLocation::getFromRawEncoding(Location); 699a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 700a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 701a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringRef getString() const { 702a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return StringRef(StringData, StringLength); 703a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 704a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor }; 70582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 70682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor /// \brief The set of attributes that can be attached to a module. 707ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling struct Attributes { 708ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling Attributes() : IsSystem() { } 70982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 71082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor /// \brief Whether this is a system module. 71182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor unsigned IsSystem : 1; 71282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor }; 713a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 71482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 715a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor class ModuleMapParser { 716a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Lexer &L; 717a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceManager &SourceMgr; 7189a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor 7199a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor /// \brief Default target information, used only for string literal 7209a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor /// parsing. 7219a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor const TargetInfo *Target; 7229a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor 723a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor DiagnosticsEngine &Diags; 724a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ModuleMap ⤅ 725a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 7268b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor /// \brief The directory that this module map resides in. 7278b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor const DirectoryEntry *Directory; 7282f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 7292f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor /// \brief The directory containing Clang-supplied headers. 7302f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor const DirectoryEntry *BuiltinIncludeDir; 7312f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 732a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Whether an error occurred. 733a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool HadError; 7349a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor 735a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Stores string data for the various string literals referenced 736a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// during parsing. 737a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::BumpPtrAllocator StringData; 738a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 739a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief The current token. 740a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor MMToken Tok; 741a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 742a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief The active module. 7431a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor Module *ActiveModule; 744a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 745a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Consume the current token and return its location. 746a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation consumeToken(); 747a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 748a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Skip tokens until we reach the a token with the given kind 749a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// (or the end of the file). 750a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor void skipUntil(MMToken::TokenKind K); 751587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 752cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko typedef SmallVector<std::pair<std::string, SourceLocation>, 2> ModuleId; 753587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor bool parseModuleId(ModuleId &Id); 754a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor void parseModuleDecl(); 75551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor void parseRequiresDecl(); 7562b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor void parseHeaderDecl(SourceLocation UmbrellaLoc, SourceLocation ExcludeLoc); 75777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc); 75890db26000aefe9335370013eec64c85232d80227Douglas Gregor void parseExportDecl(); 759b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor void parseLinkDecl(); 76082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor void parseInferredModuleDecl(bool Framework, bool Explicit); 761ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling bool parseOptionalAttributes(Attributes &Attrs); 76282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 7636a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor const DirectoryEntry *getOverriddenHeaderSearchDir(); 7646a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor 765a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor public: 766a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr, 7679a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor const TargetInfo *Target, 768a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor DiagnosticsEngine &Diags, 7698b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor ModuleMap &Map, 7702f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor const DirectoryEntry *Directory, 7712f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor const DirectoryEntry *BuiltinIncludeDir) 7729a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map), 7732f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor Directory(Directory), BuiltinIncludeDir(BuiltinIncludeDir), 7742f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor HadError(false), ActiveModule(0) 775a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor { 776a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.clear(); 777a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 778a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 779a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 780a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool parseModuleMapFile(); 781a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor }; 782a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 783a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 784a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorSourceLocation ModuleMapParser::consumeToken() { 785a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorretry: 786a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation Result = Tok.getLocation(); 787a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.clear(); 788a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 789a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Token LToken; 790a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor L.LexFromRawLexer(LToken); 791a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Location = LToken.getLocation().getRawEncoding(); 792a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (LToken.getKind()) { 793a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::raw_identifier: 794a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringData = LToken.getRawIdentifierData(); 795a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringLength = LToken.getLength(); 796a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(Tok.getString()) 797a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("header", MMToken::HeaderKeyword) 7982b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor .Case("exclude", MMToken::ExcludeKeyword) 799a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("explicit", MMToken::ExplicitKeyword) 80090db26000aefe9335370013eec64c85232d80227Douglas Gregor .Case("export", MMToken::ExportKeyword) 801a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor .Case("framework", MMToken::FrameworkKeyword) 802b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor .Case("link", MMToken::LinkKeyword) 803a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("module", MMToken::ModuleKeyword) 80451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor .Case("requires", MMToken::RequiresKeyword) 805a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("umbrella", MMToken::UmbrellaKeyword) 806a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Default(MMToken::Identifier); 807a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 80851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 80951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor case tok::comma: 81051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Tok.Kind = MMToken::Comma; 81151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor break; 81251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 813a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::eof: 814a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::EndOfFile; 815a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 816a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 817a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::l_brace: 818a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::LBrace; 819a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 820a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 821a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case tok::l_square: 822a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor Tok.Kind = MMToken::LSquare; 823a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor break; 824a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 82590db26000aefe9335370013eec64c85232d80227Douglas Gregor case tok::period: 82690db26000aefe9335370013eec64c85232d80227Douglas Gregor Tok.Kind = MMToken::Period; 82790db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 82890db26000aefe9335370013eec64c85232d80227Douglas Gregor 829a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::r_brace: 830a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::RBrace; 831a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 832a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 833a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case tok::r_square: 834a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor Tok.Kind = MMToken::RSquare; 835a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor break; 836a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 83790db26000aefe9335370013eec64c85232d80227Douglas Gregor case tok::star: 83890db26000aefe9335370013eec64c85232d80227Douglas Gregor Tok.Kind = MMToken::Star; 83990db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 84090db26000aefe9335370013eec64c85232d80227Douglas Gregor 841a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::string_literal: { 84299831e4677a7e2e051af636221694d60ba31fcdbRichard Smith if (LToken.hasUDSuffix()) { 84399831e4677a7e2e051af636221694d60ba31fcdbRichard Smith Diags.Report(LToken.getLocation(), diag::err_invalid_string_udl); 84499831e4677a7e2e051af636221694d60ba31fcdbRichard Smith HadError = true; 84599831e4677a7e2e051af636221694d60ba31fcdbRichard Smith goto retry; 84699831e4677a7e2e051af636221694d60ba31fcdbRichard Smith } 84799831e4677a7e2e051af636221694d60ba31fcdbRichard Smith 848a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the string literal. 849a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor LangOptions LangOpts; 850a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringLiteralParser StringLiteral(<oken, 1, SourceMgr, LangOpts, *Target); 851a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (StringLiteral.hadError) 852a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor goto retry; 853a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 854a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Copy the string literal into our string data allocator. 855a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned Length = StringLiteral.GetStringLength(); 856a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor char *Saved = StringData.Allocate<char>(Length + 1); 857a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor memcpy(Saved, StringLiteral.GetString().data(), Length); 858a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Saved[Length] = 0; 859a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 860a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Form the token. 861a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::StringLiteral; 862a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringData = Saved; 863a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringLength = Length; 864a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 865a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 866a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 867a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::comment: 868a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor goto retry; 869a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 870a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor default: 871a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token); 872a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 873a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor goto retry; 874a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 875a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 876a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return Result; 877a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 878a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 879a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::skipUntil(MMToken::TokenKind K) { 880a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned braceDepth = 0; 881a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor unsigned squareDepth = 0; 882a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor do { 883a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (Tok.Kind) { 884a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::EndOfFile: 885a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 886a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 887a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::LBrace: 888a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 889a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 890a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 891a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ++braceDepth; 892a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 893a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 894a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case MMToken::LSquare: 895a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 896a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor return; 897a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 898a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor ++squareDepth; 899a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor break; 900a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 901a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::RBrace: 902a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (braceDepth > 0) 903a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor --braceDepth; 904a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor else if (Tok.is(K)) 905a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 906a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 907a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 908a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case MMToken::RSquare: 909a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (squareDepth > 0) 910a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor --squareDepth; 911a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor else if (Tok.is(K)) 912a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor return; 913a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor break; 914a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 915a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor default: 916a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (braceDepth == 0 && squareDepth == 0 && Tok.is(K)) 917a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 918a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 919a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 920a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 921a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 922a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } while (true); 923a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 924a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 925587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// \brief Parse a module-id. 926587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// 927587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// module-id: 928587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// identifier 929587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// identifier '.' module-id 930587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// 931587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// \returns true if an error occurred, false otherwise. 932587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregorbool ModuleMapParser::parseModuleId(ModuleId &Id) { 933587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Id.clear(); 934587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor do { 935587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Tok.is(MMToken::Identifier)) { 936587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation())); 937587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor consumeToken(); 938587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 939587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name); 940587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return true; 941587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 942587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 943587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (!Tok.is(MMToken::Period)) 944587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor break; 945587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 946587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor consumeToken(); 947587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } while (true); 948587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 949587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return false; 950587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor} 951587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 952a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregornamespace { 953a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor /// \brief Enumerates the known attributes. 954a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor enum AttributeKind { 955a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor /// \brief An unknown attribute. 956a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor AT_unknown, 957a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor /// \brief The 'system' attribute. 958a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor AT_system 959a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor }; 960a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor} 961a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 962a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a module declaration. 963a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// 964a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-declaration: 965a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// 'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt] 966a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// { module-member* } 967a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// 968a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-member: 96951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// requires-declaration 970a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// header-declaration 971587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// submodule-declaration 97290db26000aefe9335370013eec64c85232d80227Douglas Gregor/// export-declaration 973b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor/// link-declaration 9741e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// 9751e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// submodule-declaration: 9761e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// module-declaration 9771e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// inferred-submodule-declaration 978a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::parseModuleDecl() { 979a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) || 980a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor Tok.is(MMToken::FrameworkKeyword)); 981d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Parse 'explicit' or 'framework' keyword, if present. 982587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor SourceLocation ExplicitLoc; 983a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool Explicit = false; 984d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor bool Framework = false; 985a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor 986a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor // Parse 'explicit' keyword, if present. 987d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Tok.is(MMToken::ExplicitKeyword)) { 988587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ExplicitLoc = consumeToken(); 989a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Explicit = true; 990a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 991d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 992d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Parse 'framework' keyword, if present. 993d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Tok.is(MMToken::FrameworkKeyword)) { 994d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor consumeToken(); 995d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor Framework = true; 996d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 997a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 998a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse 'module' keyword. 999a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Tok.is(MMToken::ModuleKeyword)) { 1000e6fb9876970e2dc55f091522644efa16caa9ba06Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 1001a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 1002a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1003a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 1004a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1005a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); // 'module' keyword 10061e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 10071e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // If we have a wildcard for the module name, this is an inferred submodule. 10081e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Parse it. 10091e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::Star)) 101082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor return parseInferredModuleDecl(Framework, Explicit); 1011a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1012a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the module name. 1013587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ModuleId Id; 1014587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (parseModuleId(Id)) { 1015587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor HadError = true; 1016587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return; 1017587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 101882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 1019587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (ActiveModule) { 1020587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Id.size() > 1) { 1021587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id) 1022587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor << SourceRange(Id.front().second, Id.back().second); 1023587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1024587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor HadError = true; 1025587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return; 1026587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 1027587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else if (Id.size() == 1 && Explicit) { 1028587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Top-level modules can't be explicit. 1029587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level); 1030587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Explicit = false; 1031587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ExplicitLoc = SourceLocation(); 1032a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1033a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1034587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1035587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Module *PreviousActiveModule = ActiveModule; 1036587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Id.size() > 1) { 1037587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // This module map defines a submodule. Go find the module of which it 1038587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // is a submodule. 1039587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ActiveModule = 0; 1040587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) { 1041587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) { 1042587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ActiveModule = Next; 1043587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor continue; 1044587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 1045587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1046587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (ActiveModule) { 1047587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified) 1048587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor << Id[I].first << ActiveModule->getTopLevelModule(); 1049587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 1050587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Id[I].second, diag::err_mmap_expected_module_name); 1051587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 1052587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor HadError = true; 1053587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return; 1054587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 1055587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 1056587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1057587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor StringRef ModuleName = Id.back().first; 1058587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor SourceLocation ModuleNameLoc = Id.back().second; 1059a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1060a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor // Parse the optional attribute list. 1061ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling Attributes Attrs; 106282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor parseOptionalAttributes(Attrs); 1063a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 1064a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the opening brace. 1065a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Tok.is(MMToken::LBrace)) { 1066a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace) 1067a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor << ModuleName; 1068a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1069a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 1070a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1071a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation LBraceLoc = consumeToken(); 1072a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1073a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Determine whether this (sub)module has already been defined. 1074b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) { 1075c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor if (Existing->DefinitionLoc.isInvalid() && !ActiveModule) { 1076c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor // Skip the module definition. 1077c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor skipUntil(MMToken::RBrace); 1078c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor if (Tok.is(MMToken::RBrace)) 1079c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor consumeToken(); 1080c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor else { 1081c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 1082c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 1083c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor HadError = true; 1084c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor } 1085c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor return; 1086c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor } 1087c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor 1088a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition) 1089a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor << ModuleName; 1090b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition); 1091a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1092a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Skip the module definition. 1093a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor skipUntil(MMToken::RBrace); 1094a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (Tok.is(MMToken::RBrace)) 1095a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 1096a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1097a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1098a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 1099a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1100a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1101a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Start defining this module. 1102b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor ActiveModule = Map.findOrCreateModule(ModuleName, ActiveModule, Framework, 1103b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Explicit).first; 1104b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor ActiveModule->DefinitionLoc = ModuleNameLoc; 110582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (Attrs.IsSystem) 1106a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor ActiveModule->IsSystem = true; 1107a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1108a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool Done = false; 1109a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor do { 1110a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (Tok.Kind) { 1111a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::EndOfFile: 1112a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::RBrace: 1113a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Done = true; 1114a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1115a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1116a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::ExplicitKeyword: 1117d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor case MMToken::FrameworkKeyword: 1118a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::ModuleKeyword: 1119a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor parseModuleDecl(); 1120a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1121a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 112290db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::ExportKeyword: 112390db26000aefe9335370013eec64c85232d80227Douglas Gregor parseExportDecl(); 112490db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 112590db26000aefe9335370013eec64c85232d80227Douglas Gregor 112651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor case MMToken::RequiresKeyword: 112751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor parseRequiresDecl(); 112851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor break; 112951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 113077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor case MMToken::UmbrellaKeyword: { 113177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor SourceLocation UmbrellaLoc = consumeToken(); 113277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (Tok.is(MMToken::HeaderKeyword)) 11332b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor parseHeaderDecl(UmbrellaLoc, SourceLocation()); 113477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor else 113577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor parseUmbrellaDirDecl(UmbrellaLoc); 1136a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 113777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 1138a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 11392b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor case MMToken::ExcludeKeyword: { 11402b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor SourceLocation ExcludeLoc = consumeToken(); 11412b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor if (Tok.is(MMToken::HeaderKeyword)) { 11422b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor parseHeaderDecl(SourceLocation(), ExcludeLoc); 11432b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor } else { 11442b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 11452b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor << "exclude"; 11462b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor } 11472b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor break; 11482b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor } 11492b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor 1150489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor case MMToken::HeaderKeyword: 11512b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor parseHeaderDecl(SourceLocation(), SourceLocation()); 1152a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1153b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 1154b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor case MMToken::LinkKeyword: 1155b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor parseLinkDecl(); 1156b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor break; 1157b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 1158a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor default: 1159a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member); 1160a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 1161a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1162a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1163a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } while (!Done); 1164a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1165a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (Tok.is(MMToken::RBrace)) 1166a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 1167a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor else { 1168a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 1169a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 1170a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1171a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1172a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 11738767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor // If the active module is a top-level framework, and there are no link 11748767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor // libraries, automatically link against the framework. 11758767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() && 11768767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor ActiveModule->LinkLibraries.empty()) { 11778767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager()); 11788767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor } 11798767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor 1180587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // We're done parsing this module. Pop back to the previous module. 1181587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ActiveModule = PreviousActiveModule; 1182a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 1183d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 118451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// \brief Parse a requires declaration. 118551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// 118651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// requires-declaration: 118751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// 'requires' feature-list 118851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// 118951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// feature-list: 119051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// identifier ',' feature-list 119151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// identifier 119251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregorvoid ModuleMapParser::parseRequiresDecl() { 119351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor assert(Tok.is(MMToken::RequiresKeyword)); 119451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 119551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Parse 'requires' keyword. 119651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor consumeToken(); 119751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 119851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Parse the feature-list. 119951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor do { 120051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Tok.is(MMToken::Identifier)) { 120151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature); 120251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor HadError = true; 120351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return; 120451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 120551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 120651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Consume the feature name. 120751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor std::string Feature = Tok.getString(); 120851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor consumeToken(); 120951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 121051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Add this feature. 1211dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor ActiveModule->addRequirement(Feature, Map.LangOpts, *Map.Target); 121251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 121351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Tok.is(MMToken::Comma)) 121451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor break; 121551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 121651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Consume the comma. 121751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor consumeToken(); 121851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } while (true); 121951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor} 122051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 1221d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor/// \brief Append to \p Paths the set of paths needed to get to the 1222d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor/// subframework in which the given module lives. 12235bbc385ad2d8e487edfbc2756eaf4fb0b920cfe4Benjamin Kramerstatic void appendSubframeworkPaths(Module *Mod, 1224cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVectorImpl<char> &Path) { 1225d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Collect the framework names from the given module to the top-level module. 1226cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<StringRef, 2> Paths; 1227d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor for (; Mod; Mod = Mod->Parent) { 1228d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Mod->IsFramework) 1229d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor Paths.push_back(Mod->Name); 1230d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 1231d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 1232d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Paths.empty()) 1233d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor return; 1234d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 1235d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Add Frameworks/Name.framework for each subframework. 1236d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor for (unsigned I = Paths.size() - 1; I != 0; --I) { 1237d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor llvm::sys::path::append(Path, "Frameworks"); 1238d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor llvm::sys::path::append(Path, Paths[I-1] + ".framework"); 1239d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 1240d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor} 1241d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 12422f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor/// \brief Determine whether the given file name is the name of a builtin 12432f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor/// header, supplied by Clang to replace, override, or augment existing system 12442f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor/// headers. 12452f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregorstatic bool isBuiltinHeader(StringRef FileName) { 12462f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor return llvm::StringSwitch<bool>(FileName) 12472f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("float.h", true) 12482f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("iso646.h", true) 12492f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("limits.h", true) 12502f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("stdalign.h", true) 12512f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("stdarg.h", true) 12522f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("stdbool.h", true) 12532f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("stddef.h", true) 12542f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("stdint.h", true) 12552f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("tgmath.h", true) 12562f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Case("unwind.h", true) 12572f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor .Default(false); 12582f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor} 12592f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 1260489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor/// \brief Parse a header declaration. 1261a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// 1262489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor/// header-declaration: 1263489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor/// 'umbrella'[opt] 'header' string-literal 12642b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor/// 'exclude'[opt] 'header' string-literal 12652b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregorvoid ModuleMapParser::parseHeaderDecl(SourceLocation UmbrellaLoc, 12662b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor SourceLocation ExcludeLoc) { 1267489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor assert(Tok.is(MMToken::HeaderKeyword)); 1268489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor consumeToken(); 1269489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor 1270489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor bool Umbrella = UmbrellaLoc.isValid(); 12712b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor bool Exclude = ExcludeLoc.isValid(); 12722b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor assert(!(Umbrella && Exclude) && "Cannot have both 'umbrella' and 'exclude'"); 1273a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the header name. 1274a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Tok.is(MMToken::StringLiteral)) { 1275a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 1276489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor << "header"; 1277a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1278a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 1279a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1280587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor std::string FileName = Tok.getString(); 1281a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation FileNameLoc = consumeToken(); 1282489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor 128377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Check whether we already have an umbrella. 128477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (Umbrella && ActiveModule->Umbrella) { 128577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(FileNameLoc, diag::err_mmap_umbrella_clash) 128677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << ActiveModule->getFullModuleName(); 12878b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor HadError = true; 12888b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor return; 12898b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } 1290a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor 12918b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor // Look for this file. 1292587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor const FileEntry *File = 0; 12932f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor const FileEntry *BuiltinFile = 0; 1294f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> PathName; 1295587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (llvm::sys::path::is_absolute(FileName)) { 1296587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor PathName = FileName; 1297587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 12986a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor } else if (const DirectoryEntry *Dir = getOverriddenHeaderSearchDir()) { 12996a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor PathName = Dir->getName(); 13006a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor llvm::sys::path::append(PathName, FileName); 13016a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 1302587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 1303587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Search for the header file within the search directory. 13046a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor PathName = Directory->getName(); 1305587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor unsigned PathLength = PathName.size(); 130618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 1307d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (ActiveModule->isPartOfFramework()) { 1308d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor appendSubframeworkPaths(ActiveModule, PathName); 1309587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1310587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Check whether this file is in the public headers. 131118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor llvm::sys::path::append(PathName, "Headers"); 1312587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, FileName); 1313587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 1314587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1315587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (!File) { 1316587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Check whether this file is in the private headers. 1317587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor PathName.resize(PathLength); 1318587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, "PrivateHeaders"); 1319587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, FileName); 1320587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 1321587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 1322587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 1323587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Lookup for normal headers. 1324587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, FileName); 1325587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 13262f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 13272f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // If this is a system module with a top-level header, this header 13282f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // may have a counterpart (or replacement) in the set of headers 13292f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // supplied by Clang. Find that builtin header. 13302f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor if (ActiveModule->IsSystem && !Umbrella && BuiltinIncludeDir && 13312f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor BuiltinIncludeDir != Directory && isBuiltinHeader(FileName)) { 1332f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName()); 13332f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor llvm::sys::path::append(BuiltinPathName, FileName); 13342f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName); 13352f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 13362f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // If Clang supplies this header but the underlying system does not, 13372f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // just silently swap in our builtin version. Otherwise, we'll end 13382f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // up adding both (later). 13392f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor if (!File && BuiltinFile) { 13402f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor File = BuiltinFile; 13412f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor BuiltinFile = 0; 13422f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor } 13432f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor } 1344d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 134518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor } 1346a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor 13478b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor // FIXME: We shouldn't be eagerly stat'ing every file named in a module map. 13488b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor // Come up with a lazy way to do this. 1349587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (File) { 13502b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor if (ModuleMap::KnownHeader OwningModule = Map.Headers[File]) { 13518b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor Diags.Report(FileNameLoc, diag::err_mmap_header_conflict) 13522b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor << FileName << OwningModule.getModule()->getFullModuleName(); 13538b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor HadError = true; 1354489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor } else if (Umbrella) { 1355489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor const DirectoryEntry *UmbrellaDir = File->getDir(); 13562b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor if (Module *UmbrellaModule = Map.UmbrellaDirs[UmbrellaDir]) { 1357489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash) 13582b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor << UmbrellaModule->getFullModuleName(); 1359489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor HadError = true; 1360489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor } else { 1361489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor // Record this umbrella header. 1362489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor Map.setUmbrellaHeader(ActiveModule, File); 1363489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor } 13648b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } else { 1365489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor // Record this header. 13662b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Map.addHeader(ActiveModule, File, Exclude); 13672f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 13682f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // If there is a builtin counterpart to this file, add it now. 13692f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor if (BuiltinFile) 13702b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Map.addHeader(ActiveModule, BuiltinFile, Exclude); 13718b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } 137271f49f5d8fc3c4980bed4bb7790c8d0e50586d3bDouglas Gregor } else if (!Exclude) { 137371f49f5d8fc3c4980bed4bb7790c8d0e50586d3bDouglas Gregor // Ignore excluded header files. They're optional anyway. 137471f49f5d8fc3c4980bed4bb7790c8d0e50586d3bDouglas Gregor 13758b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor Diags.Report(FileNameLoc, diag::err_mmap_header_not_found) 137677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << Umbrella << FileName; 137777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor HadError = true; 137877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 137977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor} 138077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 138177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor/// \brief Parse an umbrella directory declaration. 138277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor/// 138377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor/// umbrella-dir-declaration: 138477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor/// umbrella string-literal 138577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregorvoid ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) { 138677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Parse the directory name. 138777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (!Tok.is(MMToken::StringLiteral)) { 138877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 138977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << "umbrella"; 139077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor HadError = true; 139177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor return; 139277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 139377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 139477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor std::string DirName = Tok.getString(); 139577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor SourceLocation DirNameLoc = consumeToken(); 139677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 139777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Check whether we already have an umbrella. 139877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (ActiveModule->Umbrella) { 139977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash) 140077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << ActiveModule->getFullModuleName(); 14018b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor HadError = true; 140277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor return; 140377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 140477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 140577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Look for this file. 140677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor const DirectoryEntry *Dir = 0; 140777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (llvm::sys::path::is_absolute(DirName)) 140877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Dir = SourceMgr.getFileManager().getDirectory(DirName); 140977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor else { 1410f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> PathName; 141177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor PathName = Directory->getName(); 141277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor llvm::sys::path::append(PathName, DirName); 141377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Dir = SourceMgr.getFileManager().getDirectory(PathName); 14148b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } 141577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 141677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (!Dir) { 141777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found) 141877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << DirName; 141977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor HadError = true; 142077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor return; 142177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 142277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 142377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (Module *OwningModule = Map.UmbrellaDirs[Dir]) { 142477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash) 142577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << OwningModule->getFullModuleName(); 142677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor HadError = true; 142777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor return; 142877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 142977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 143077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Record this umbrella directory. 143177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Map.setUmbrellaDir(ActiveModule, Dir); 1432a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 1433a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 143490db26000aefe9335370013eec64c85232d80227Douglas Gregor/// \brief Parse a module export declaration. 143590db26000aefe9335370013eec64c85232d80227Douglas Gregor/// 143690db26000aefe9335370013eec64c85232d80227Douglas Gregor/// export-declaration: 143790db26000aefe9335370013eec64c85232d80227Douglas Gregor/// 'export' wildcard-module-id 143890db26000aefe9335370013eec64c85232d80227Douglas Gregor/// 143990db26000aefe9335370013eec64c85232d80227Douglas Gregor/// wildcard-module-id: 144090db26000aefe9335370013eec64c85232d80227Douglas Gregor/// identifier 144190db26000aefe9335370013eec64c85232d80227Douglas Gregor/// '*' 144290db26000aefe9335370013eec64c85232d80227Douglas Gregor/// identifier '.' wildcard-module-id 144390db26000aefe9335370013eec64c85232d80227Douglas Gregorvoid ModuleMapParser::parseExportDecl() { 144490db26000aefe9335370013eec64c85232d80227Douglas Gregor assert(Tok.is(MMToken::ExportKeyword)); 144590db26000aefe9335370013eec64c85232d80227Douglas Gregor SourceLocation ExportLoc = consumeToken(); 144690db26000aefe9335370013eec64c85232d80227Douglas Gregor 144790db26000aefe9335370013eec64c85232d80227Douglas Gregor // Parse the module-id with an optional wildcard at the end. 144890db26000aefe9335370013eec64c85232d80227Douglas Gregor ModuleId ParsedModuleId; 144990db26000aefe9335370013eec64c85232d80227Douglas Gregor bool Wildcard = false; 145090db26000aefe9335370013eec64c85232d80227Douglas Gregor do { 145190db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Tok.is(MMToken::Identifier)) { 145290db26000aefe9335370013eec64c85232d80227Douglas Gregor ParsedModuleId.push_back(std::make_pair(Tok.getString(), 145390db26000aefe9335370013eec64c85232d80227Douglas Gregor Tok.getLocation())); 145490db26000aefe9335370013eec64c85232d80227Douglas Gregor consumeToken(); 145590db26000aefe9335370013eec64c85232d80227Douglas Gregor 145690db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Tok.is(MMToken::Period)) { 145790db26000aefe9335370013eec64c85232d80227Douglas Gregor consumeToken(); 145890db26000aefe9335370013eec64c85232d80227Douglas Gregor continue; 145990db26000aefe9335370013eec64c85232d80227Douglas Gregor } 146090db26000aefe9335370013eec64c85232d80227Douglas Gregor 146190db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 146290db26000aefe9335370013eec64c85232d80227Douglas Gregor } 146390db26000aefe9335370013eec64c85232d80227Douglas Gregor 146490db26000aefe9335370013eec64c85232d80227Douglas Gregor if(Tok.is(MMToken::Star)) { 146590db26000aefe9335370013eec64c85232d80227Douglas Gregor Wildcard = true; 14660adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor consumeToken(); 146790db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 146890db26000aefe9335370013eec64c85232d80227Douglas Gregor } 146990db26000aefe9335370013eec64c85232d80227Douglas Gregor 147090db26000aefe9335370013eec64c85232d80227Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_export_module_id); 147190db26000aefe9335370013eec64c85232d80227Douglas Gregor HadError = true; 147290db26000aefe9335370013eec64c85232d80227Douglas Gregor return; 147390db26000aefe9335370013eec64c85232d80227Douglas Gregor } while (true); 147490db26000aefe9335370013eec64c85232d80227Douglas Gregor 147590db26000aefe9335370013eec64c85232d80227Douglas Gregor Module::UnresolvedExportDecl Unresolved = { 147690db26000aefe9335370013eec64c85232d80227Douglas Gregor ExportLoc, ParsedModuleId, Wildcard 147790db26000aefe9335370013eec64c85232d80227Douglas Gregor }; 147890db26000aefe9335370013eec64c85232d80227Douglas Gregor ActiveModule->UnresolvedExports.push_back(Unresolved); 147990db26000aefe9335370013eec64c85232d80227Douglas Gregor} 148090db26000aefe9335370013eec64c85232d80227Douglas Gregor 1481b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor/// \brief Parse a link declaration. 1482b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor/// 1483b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor/// module-declaration: 1484b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor/// 'link' 'framework'[opt] string-literal 1485b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregorvoid ModuleMapParser::parseLinkDecl() { 1486b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor assert(Tok.is(MMToken::LinkKeyword)); 1487b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor SourceLocation LinkLoc = consumeToken(); 1488b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 1489b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor // Parse the optional 'framework' keyword. 1490b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor bool IsFramework = false; 1491b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor if (Tok.is(MMToken::FrameworkKeyword)) { 1492b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor consumeToken(); 1493b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor IsFramework = true; 1494b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor } 1495b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 1496b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor // Parse the library name 1497b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor if (!Tok.is(MMToken::StringLiteral)) { 1498b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_library_name) 1499b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor << IsFramework << SourceRange(LinkLoc); 1500b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor HadError = true; 1501b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor return; 1502b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor } 1503b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 1504b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor std::string LibraryName = Tok.getString(); 1505b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor consumeToken(); 1506b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName, 1507b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor IsFramework)); 1508b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor} 1509b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 1510b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor/// \brief Parse an inferred module declaration (wildcard modules). 151182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 151282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// module-declaration: 151382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 'explicit'[opt] 'framework'[opt] 'module' * attributes[opt] 151482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// { inferred-module-member* } 151582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 151682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// inferred-module-member: 151782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 'export' '*' 151882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 'exclude' identifier 151982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregorvoid ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) { 15201e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor assert(Tok.is(MMToken::Star)); 15211e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor SourceLocation StarLoc = consumeToken(); 15221e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor bool Failed = false; 152382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 15241e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Inferred modules must be submodules. 152582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!ActiveModule && !Framework) { 15261e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule); 15271e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Failed = true; 15281e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 152982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 153082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (ActiveModule) { 153182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Inferred modules must have umbrella directories. 153282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!Failed && !ActiveModule->getUmbrellaDir()) { 153382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella); 153482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Failed = true; 153582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 153682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 153782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Check for redefinition of an inferred module. 153882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!Failed && ActiveModule->InferSubmodules) { 153982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(StarLoc, diag::err_mmap_inferred_redef); 154082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (ActiveModule->InferredSubmoduleLoc.isValid()) 154182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(ActiveModule->InferredSubmoduleLoc, 154282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor diag::note_mmap_prev_definition); 154382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Failed = true; 154482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 154582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 154682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Check for the 'framework' keyword, which is not permitted here. 154782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (Framework) { 154882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule); 154982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Framework = false; 155082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 155182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } else if (Explicit) { 155282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework); 155382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Explicit = false; 15541e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 155582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 15561e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // If there were any problems with this inferred submodule, skip its body. 15571e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Failed) { 15581e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::LBrace)) { 15591e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 15601e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor skipUntil(MMToken::RBrace); 15611e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::RBrace)) 15621e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 15631e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 15641e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor HadError = true; 15651e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor return; 15661e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 156782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 156882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Parse optional attributes. 1569ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling Attributes Attrs; 157082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor parseOptionalAttributes(Attrs); 157182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 157282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (ActiveModule) { 157382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Note that we have an inferred submodule. 157482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor ActiveModule->InferSubmodules = true; 157582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor ActiveModule->InferredSubmoduleLoc = StarLoc; 157682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor ActiveModule->InferExplicitSubmodules = Explicit; 157782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } else { 157882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // We'll be inferring framework modules for this directory. 157982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Map.InferredDirectories[Directory].InferModules = true; 158082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Map.InferredDirectories[Directory].InferSystemModules = Attrs.IsSystem; 158182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 158282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 15831e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Parse the opening brace. 15841e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (!Tok.is(MMToken::LBrace)) { 15851e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard); 15861e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor HadError = true; 15871e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor return; 15881e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 15891e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor SourceLocation LBraceLoc = consumeToken(); 15901e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 15911e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Parse the body of the inferred submodule. 15921e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor bool Done = false; 15931e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor do { 15941e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor switch (Tok.Kind) { 15951e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::EndOfFile: 15961e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::RBrace: 15971e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Done = true; 15981e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor break; 159982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 160082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor case MMToken::ExcludeKeyword: { 160182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (ActiveModule) { 160282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 1603b7ac5ac3faf70146707683a2ae041e8d53c3562aDouglas Gregor << (ActiveModule != 0); 160482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor consumeToken(); 160582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor break; 160682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 160782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 160882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor consumeToken(); 160982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!Tok.is(MMToken::Identifier)) { 161082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name); 161182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor break; 161282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 161382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 161482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Map.InferredDirectories[Directory].ExcludedModules 161582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor .push_back(Tok.getString()); 161682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor consumeToken(); 161782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor break; 161882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 161982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 162082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor case MMToken::ExportKeyword: 162182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!ActiveModule) { 162282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 1623b7ac5ac3faf70146707683a2ae041e8d53c3562aDouglas Gregor << (ActiveModule != 0); 162482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor consumeToken(); 162582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor break; 162682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 162782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 16281e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 16291e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::Star)) 1630ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor ActiveModule->InferExportWildcard = true; 16311e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor else 16321e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(Tok.getLocation(), 16331e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor diag::err_mmap_expected_export_wildcard); 16341e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 16351e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor break; 163682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 16371e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::ExplicitKeyword: 16381e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::ModuleKeyword: 16391e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::HeaderKeyword: 16401e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::UmbrellaKeyword: 16411e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor default: 164282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 1643b7ac5ac3faf70146707683a2ae041e8d53c3562aDouglas Gregor << (ActiveModule != 0); 16441e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 16451e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor break; 16461e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 16471e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } while (!Done); 16481e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 16491e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::RBrace)) 16501e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 16511e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor else { 16521e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 16531e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 16541e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor HadError = true; 16551e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 16561e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor} 16571e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 165882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// \brief Parse optional attributes. 165982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 166082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// attributes: 166182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// attribute attributes 166282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// attribute 166382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 166482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// attribute: 166582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// [ identifier ] 166682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 166782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// \param Attrs Will be filled in with the parsed attributes. 166882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 166982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// \returns true if an error occurred, false otherwise. 1670ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendlingbool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) { 167182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor bool HadError = false; 167282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 167382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor while (Tok.is(MMToken::LSquare)) { 167482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Consume the '['. 167582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor SourceLocation LSquareLoc = consumeToken(); 167682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 167782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Check whether we have an attribute name here. 167882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!Tok.is(MMToken::Identifier)) { 167982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute); 168082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor skipUntil(MMToken::RSquare); 168182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (Tok.is(MMToken::RSquare)) 168282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor consumeToken(); 168382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor HadError = true; 168482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 168582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 168682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Decode the attribute name. 168782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor AttributeKind Attribute 168882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor = llvm::StringSwitch<AttributeKind>(Tok.getString()) 168982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor .Case("system", AT_system) 169082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor .Default(AT_unknown); 169182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor switch (Attribute) { 169282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor case AT_unknown: 169382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute) 169482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor << Tok.getString(); 169582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor break; 169682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 169782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor case AT_system: 169882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Attrs.IsSystem = true; 169982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor break; 170082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 170182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor consumeToken(); 170282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 170382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Consume the ']'. 170482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!Tok.is(MMToken::RSquare)) { 170582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare); 170682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match); 170782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor skipUntil(MMToken::RSquare); 170882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor HadError = true; 170982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 171082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 171182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (Tok.is(MMToken::RSquare)) 171282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor consumeToken(); 171382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 171482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 171582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor return HadError; 171682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor} 171782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 17186a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor/// \brief If there is a specific header search directory due the presence 17196a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor/// of an umbrella directory, retrieve that directory. Otherwise, returns null. 17206a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregorconst DirectoryEntry *ModuleMapParser::getOverriddenHeaderSearchDir() { 17216a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor for (Module *Mod = ActiveModule; Mod; Mod = Mod->Parent) { 17226a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor // If we have an umbrella directory, use that. 17236a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor if (Mod->hasUmbrellaDir()) 17246a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor return Mod->getUmbrellaDir(); 17256a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor 17266a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor // If we have a framework directory, stop looking. 17276a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor if (Mod->IsFramework) 17286a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor return 0; 17296a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor } 17306a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor 17316a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor return 0; 17326a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor} 17336a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor 1734a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a module map file. 1735a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// 1736a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-map-file: 1737a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-declaration* 1738a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorbool ModuleMapParser::parseModuleMapFile() { 1739a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor do { 1740a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (Tok.Kind) { 1741a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::EndOfFile: 1742a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return HadError; 1743a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1744587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor case MMToken::ExplicitKeyword: 1745a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::ModuleKeyword: 1746a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor case MMToken::FrameworkKeyword: 1747a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor parseModuleDecl(); 1748a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1749b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 175051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor case MMToken::Comma: 17512b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor case MMToken::ExcludeKeyword: 175290db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::ExportKeyword: 1753a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::HeaderKeyword: 1754a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::Identifier: 1755a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::LBrace: 1756b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor case MMToken::LinkKeyword: 1757a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case MMToken::LSquare: 175890db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::Period: 1759a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::RBrace: 1760a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case MMToken::RSquare: 176151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor case MMToken::RequiresKeyword: 176290db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::Star: 1763a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::StringLiteral: 1764a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::UmbrellaKeyword: 1765a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 1766a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1767a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 1768a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1769a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1770a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } while (true); 1771a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 1772a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1773a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorbool ModuleMap::parseModuleMapFile(const FileEntry *File) { 17747005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor llvm::DenseMap<const FileEntry *, bool>::iterator Known 17757005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor = ParsedModuleMap.find(File); 17767005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor if (Known != ParsedModuleMap.end()) 17777005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor return Known->second; 17787005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor 1779dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor assert(Target != 0 && "Missing target information"); 1780a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor FileID ID = SourceMgr->createFileID(File, SourceLocation(), SrcMgr::C_User); 1781a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor const llvm::MemoryBuffer *Buffer = SourceMgr->getBuffer(ID); 1782a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Buffer) 17837005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor return ParsedModuleMap[File] = true; 1784a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1785a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse this module map file. 178651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Lexer L(ID, SourceMgr->getBuffer(ID), *SourceMgr, MMapLangOpts); 178751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Diags->getClient()->BeginSourceFile(MMapLangOpts); 17889a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor ModuleMapParser Parser(L, *SourceMgr, Target, *Diags, *this, File->getDir(), 17892f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor BuiltinIncludeDir); 1790a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool Result = Parser.parseModuleMapFile(); 1791a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags->getClient()->EndSourceFile(); 17927005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor ParsedModuleMap[File] = Result; 1793a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return Result; 1794a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 1795