ModuleMap.cpp revision 30a16f1383b56cb71be251999a577b2e37db2ce0
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" 153f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose#include "clang/Basic/CharInfo.h" 16a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/Diagnostic.h" 1702c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor#include "clang/Basic/DiagnosticOptions.h" 18a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/FileManager.h" 19a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/TargetInfo.h" 20a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/TargetOptions.h" 2155ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis#include "clang/Lex/HeaderSearch.h" 2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/LexDiagnostic.h" 2355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/Lexer.h" 2455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/LiteralSupport.h" 2555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/StringRef.h" 2655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "llvm/ADT/StringSwitch.h" 27a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/Allocator.h" 28ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor#include "llvm/Support/FileSystem.h" 29a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/Host.h" 308b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor#include "llvm/Support/PathV2.h" 31a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/raw_ostream.h" 3298cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor#include <stdlib.h> 333cc6277a3dd4986af6422e41db18ba6efddbd800Douglas Gregor#if defined(LLVM_ON_UNIX) 34adeb7822cb7947194fef0e12d2d6583ccb8240b5Dmitri Gribenko#include <limits.h> 353cc6277a3dd4986af6422e41db18ba6efddbd800Douglas Gregor#endif 36a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorusing namespace clang; 37a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 3890db26000aefe9335370013eec64c85232d80227Douglas GregorModule::ExportDecl 3990db26000aefe9335370013eec64c85232d80227Douglas GregorModuleMap::resolveExport(Module *Mod, 4090db26000aefe9335370013eec64c85232d80227Douglas Gregor const Module::UnresolvedExportDecl &Unresolved, 410be5e567e3a48592fd6b11f88cc77efb20c76f26Argyrios Kyrtzidis bool Complain) const { 420adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor // We may have just a wildcard. 430adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor if (Unresolved.Id.empty()) { 440adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor assert(Unresolved.Wildcard && "Invalid unresolved export"); 450adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor return Module::ExportDecl(0, true); 460adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor } 470adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor 48906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor // Resolve the module-id. 49906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Module *Context = resolveModuleId(Unresolved.Id, Mod, Complain); 50906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor if (!Context) 51906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor return Module::ExportDecl(); 52906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 53906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor return Module::ExportDecl(Context, Unresolved.Wildcard); 54906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor} 55906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 56906d66acc5cf2679453e10a4f0a67feedd765b21Douglas GregorModule *ModuleMap::resolveModuleId(const ModuleId &Id, Module *Mod, 57906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor bool Complain) const { 5890db26000aefe9335370013eec64c85232d80227Douglas Gregor // Find the starting module. 59906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Module *Context = lookupModuleUnqualified(Id[0].first, Mod); 6090db26000aefe9335370013eec64c85232d80227Douglas Gregor if (!Context) { 6190db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Complain) 62906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Diags->Report(Id[0].second, diag::err_mmap_missing_module_unqualified) 63906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor << Id[0].first << Mod->getFullModuleName(); 64906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 65906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor return 0; 6690db26000aefe9335370013eec64c85232d80227Douglas Gregor } 6790db26000aefe9335370013eec64c85232d80227Douglas Gregor 6890db26000aefe9335370013eec64c85232d80227Douglas Gregor // Dig into the module path. 69906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor for (unsigned I = 1, N = Id.size(); I != N; ++I) { 70906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Module *Sub = lookupModuleQualified(Id[I].first, Context); 7190db26000aefe9335370013eec64c85232d80227Douglas Gregor if (!Sub) { 7290db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Complain) 73906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Diags->Report(Id[I].second, diag::err_mmap_missing_module_qualified) 74906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor << Id[I].first << Context->getFullModuleName() 75906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor << SourceRange(Id[0].second, Id[I-1].second); 76906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 77906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor return 0; 7890db26000aefe9335370013eec64c85232d80227Douglas Gregor } 79906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 8090db26000aefe9335370013eec64c85232d80227Douglas Gregor Context = Sub; 8190db26000aefe9335370013eec64c85232d80227Douglas Gregor } 82906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 83906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor return Context; 8490db26000aefe9335370013eec64c85232d80227Douglas Gregor} 8590db26000aefe9335370013eec64c85232d80227Douglas Gregor 86a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas GregorModuleMap::ModuleMap(FileManager &FileMgr, DiagnosticConsumer &DC, 8755ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis const LangOptions &LangOpts, const TargetInfo *Target, 8855ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis HeaderSearch &HeaderInfo) 8955ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis : LangOpts(LangOpts), Target(Target), HeaderInfo(HeaderInfo), 90d3220dbeeadc4ac54ceecea8cf63f8d8be291d2aArgyrios Kyrtzidis BuiltinIncludeDir(0), CompilingModule(0) 9151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor{ 92c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs); 93c93dc7889644293e318e19d82830ea2acc45b678Dylan Noblesmith Diags = IntrusiveRefCntPtr<DiagnosticsEngine>( 9402c23ebf41ae2f70da0ba7337e05c51fbfe35f7fDouglas Gregor new DiagnosticsEngine(DiagIDs, new DiagnosticOptions)); 95a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor Diags->setClient(new ForwardingDiagnosticConsumer(DC), 96a4a90cabfa15c900016a7cfaea51a6d4e8ebf4dbDouglas Gregor /*ShouldOwnClient=*/true); 97a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceMgr = new SourceManager(*Diags, FileMgr); 98a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 99a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 100a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorModuleMap::~ModuleMap() { 10109fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor for (llvm::StringMap<Module *>::iterator I = Modules.begin(), 10209fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor IEnd = Modules.end(); 10309fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor I != IEnd; ++I) { 10409fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor delete I->getValue(); 10509fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor } 10609fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor 107a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor delete SourceMgr; 108a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 109a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 110dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregorvoid ModuleMap::setTarget(const TargetInfo &Target) { 111dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor assert((!this->Target || this->Target == &Target) && 112dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor "Improper target override"); 113dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor this->Target = &Target; 114dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor} 115dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor 1168b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor/// \brief "Sanitize" a filename so that it can be used as an identifier. 1178b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregorstatic StringRef sanitizeFilenameAsIdentifier(StringRef Name, 1188b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor SmallVectorImpl<char> &Buffer) { 1198b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor if (Name.empty()) 1208b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor return Name; 1218b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor 1223f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose if (!isValidIdentifier(Name)) { 1238b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor // If we don't already have something with the form of an identifier, 1248b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor // create a buffer with the sanitized name. 1258b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Buffer.clear(); 1263f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose if (isDigit(Name[0])) 1278b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Buffer.push_back('_'); 1288b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Buffer.reserve(Buffer.size() + Name.size()); 1298b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor for (unsigned I = 0, N = Name.size(); I != N; ++I) { 1303f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose if (isIdentifierBody(Name[I])) 1318b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Buffer.push_back(Name[I]); 1328b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor else 1338b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Buffer.push_back('_'); 1348b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor } 1358b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor 1368b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Name = StringRef(Buffer.data(), Buffer.size()); 1378b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor } 1388b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor 1398b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor while (llvm::StringSwitch<bool>(Name) 1408b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor#define KEYWORD(Keyword,Conditions) .Case(#Keyword, true) 1418b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor#define ALIAS(Keyword, AliasOf, Conditions) .Case(Keyword, true) 1428b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor#include "clang/Basic/TokenKinds.def" 1438b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor .Default(false)) { 1448b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor if (Name.data() != Buffer.data()) 1458b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Buffer.append(Name.begin(), Name.end()); 1468b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Buffer.push_back('_'); 1478b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor Name = StringRef(Buffer.data(), Buffer.size()); 1488b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor } 1498b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor 1508b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor return Name; 1518b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor} 1528b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor 153db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor/// \brief Determine whether the given file name is the name of a builtin 154db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor/// header, supplied by Clang to replace, override, or augment existing system 155db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor/// headers. 156db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregorstatic bool isBuiltinHeader(StringRef FileName) { 157db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor return llvm::StringSwitch<bool>(FileName) 158db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor .Case("float.h", true) 159db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor .Case("iso646.h", true) 160db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor .Case("limits.h", true) 161db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor .Case("stdalign.h", true) 162db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor .Case("stdarg.h", true) 163db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor .Case("stdbool.h", true) 164db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor .Case("stddef.h", true) 165db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor .Case("stdint.h", true) 166db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor .Case("tgmath.h", true) 167db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor .Case("unwind.h", true) 168db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor .Default(false); 169db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor} 170db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor 1711a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *ModuleMap::findModuleForHeader(const FileEntry *File) { 1722b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor HeadersMap::iterator Known = Headers.find(File); 17351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (Known != Headers.end()) { 1742b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor // If a header is not available, don't report that it maps to anything. 1752b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor if (!Known->second.isAvailable()) 17651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return 0; 17751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 1782b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor return Known->second.getModule(); 17951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 180db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor 181db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor // If we've found a builtin header within Clang's builtin include directory, 182db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor // load all of the module maps to see if it will get associated with a 183db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor // specific module (e.g., in /usr/include). 184db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor if (File->getDir() == BuiltinIncludeDir && 185db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor isBuiltinHeader(llvm::sys::path::filename(File->getName()))) { 18630a16f1383b56cb71be251999a577b2e37db2ce0Douglas Gregor HeaderInfo.loadTopLevelSystemModules(); 187db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor 188db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor // Check again. 189db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor Known = Headers.find(File); 190db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor if (Known != Headers.end()) { 191db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor // If a header is not available, don't report that it maps to anything. 192db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor if (!Known->second.isAvailable()) 193db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor return 0; 194db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor 195db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor return Known->second.getModule(); 196db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor } 197db3910be2e30b3fa00474f0e1c0780f544469deeDouglas Gregor } 19865f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor 199adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor const DirectoryEntry *Dir = File->getDir(); 200cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<const DirectoryEntry *, 2> SkippedDirs; 201713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor 202aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor // Note: as an egregious but useful hack we use the real path here, because 203aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor // frameworks moving from top-level frameworks to embedded frameworks tend 204aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor // to be symlinked from the top-level location to the embedded location, 205aa60f9cee8fa29cac1848de75ad48cdc0520e993Douglas Gregor // and we need to resolve lookups as if we had found the embedded location. 206713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor StringRef DirName = SourceMgr->getFileManager().getCanonicalName(Dir); 207e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 208e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Keep walking up the directory hierarchy, looking for a directory with 209e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // an umbrella header. 210e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor do { 211e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir 212e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor = UmbrellaDirs.find(Dir); 213adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor if (KnownDir != UmbrellaDirs.end()) { 214adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor Module *Result = KnownDir->second; 2159f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor 2169f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor // Search up the module stack until we find a module with an umbrella 21710694cee2588442bee1e717f5042c58ffee25279Douglas Gregor // directory. 2189f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor Module *UmbrellaModule = Result; 21910694cee2588442bee1e717f5042c58ffee25279Douglas Gregor while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent) 2209f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor UmbrellaModule = UmbrellaModule->Parent; 22151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 2229f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor if (UmbrellaModule->InferSubmodules) { 223e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Infer submodules for each of the directories we found between 224e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // the directory of the umbrella header and the directory where 225e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // the actual header is located. 22623af6d58e392e18ae2946b799264717f480e6596Douglas Gregor bool Explicit = UmbrellaModule->InferExplicitSubmodules; 227e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 2286a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor for (unsigned I = SkippedDirs.size(); I != 0; --I) { 229e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Find or create the module that corresponds to this directory name. 2308b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor SmallString<32> NameBuf; 2318b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor StringRef Name = sanitizeFilenameAsIdentifier( 2328b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor llvm::sys::path::stem(SkippedDirs[I-1]->getName()), 2338b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor NameBuf); 234e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result = findOrCreateModule(Name, Result, /*IsFramework=*/false, 23523af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Explicit).first; 236e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 237e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Associate the module and the directory. 238e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor UmbrellaDirs[SkippedDirs[I-1]] = Result; 239e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 240e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // If inferred submodules export everything they import, add a 241e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // wildcard to the set of exports. 2429f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor if (UmbrellaModule->InferExportWildcard && Result->Exports.empty()) 243e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->Exports.push_back(Module::ExportDecl(0, true)); 244e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } 245e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 246e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Infer a submodule with the same name as this header file. 2478b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor SmallString<32> NameBuf; 2488b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor StringRef Name = sanitizeFilenameAsIdentifier( 2498b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor llvm::sys::path::stem(File->getName()), NameBuf); 250e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result = findOrCreateModule(Name, Result, /*IsFramework=*/false, 25123af6d58e392e18ae2946b799264717f480e6596Douglas Gregor Explicit).first; 252c1d22393628a145e54396c0ac66e9625d13a7658Argyrios Kyrtzidis Result->addTopHeader(File); 253e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 254e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // If inferred submodules export everything they import, add a 255e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // wildcard to the set of exports. 2569f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor if (UmbrellaModule->InferExportWildcard && Result->Exports.empty()) 257e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->Exports.push_back(Module::ExportDecl(0, true)); 258e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } else { 259e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Record each of the directories we stepped through as being part of 260e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // the module we found, since the umbrella header covers them all. 261e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I) 262e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor UmbrellaDirs[SkippedDirs[I]] = Result; 263e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } 264adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor 2652b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Headers[File] = KnownHeader(Result, /*Excluded=*/false); 26651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 26751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // If a header corresponds to an unavailable module, don't report 26851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // that it maps to anything. 26951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Result->isAvailable()) 27051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return 0; 27151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 272adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor return Result; 273adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor } 274adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor 275adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor SkippedDirs.push_back(Dir); 276e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 277e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Retrieve our parent path. 278e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor DirName = llvm::sys::path::parent_path(DirName); 279e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor if (DirName.empty()) 280e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor break; 281e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 282e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // Resolve the parent path to a directory entry. 283e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Dir = SourceMgr->getFileManager().getDirectory(DirName); 284e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } while (Dir); 285adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor 28665f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor return 0; 28765f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor} 28865f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor 2890be5e567e3a48592fd6b11f88cc77efb20c76f26Argyrios Kyrtzidisbool ModuleMap::isHeaderInUnavailableModule(const FileEntry *Header) const { 2900be5e567e3a48592fd6b11f88cc77efb20c76f26Argyrios Kyrtzidis HeadersMap::const_iterator Known = Headers.find(Header); 29151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (Known != Headers.end()) 2922b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor return !Known->second.isAvailable(); 29351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 29451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor const DirectoryEntry *Dir = Header->getDir(); 295cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<const DirectoryEntry *, 2> SkippedDirs; 29651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor StringRef DirName = Dir->getName(); 29751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 29851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Keep walking up the directory hierarchy, looking for a directory with 29951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // an umbrella header. 30051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor do { 3010be5e567e3a48592fd6b11f88cc77efb20c76f26Argyrios Kyrtzidis llvm::DenseMap<const DirectoryEntry *, Module *>::const_iterator KnownDir 30251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor = UmbrellaDirs.find(Dir); 30351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (KnownDir != UmbrellaDirs.end()) { 30451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Module *Found = KnownDir->second; 30551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Found->isAvailable()) 30651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return true; 30751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 30851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Search up the module stack until we find a module with an umbrella 30951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // directory. 31051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Module *UmbrellaModule = Found; 31151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent) 31251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor UmbrellaModule = UmbrellaModule->Parent; 31351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 31451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (UmbrellaModule->InferSubmodules) { 31551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor for (unsigned I = SkippedDirs.size(); I != 0; --I) { 31651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Find or create the module that corresponds to this directory name. 3178b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor SmallString<32> NameBuf; 3188b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor StringRef Name = sanitizeFilenameAsIdentifier( 3198b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor llvm::sys::path::stem(SkippedDirs[I-1]->getName()), 3208b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor NameBuf); 32151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Found = lookupModuleQualified(Name, Found); 32251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Found) 32351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return false; 32451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Found->isAvailable()) 32551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return true; 32651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 32751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 32851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Infer a submodule with the same name as this header file. 3298b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor SmallString<32> NameBuf; 3308b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor StringRef Name = sanitizeFilenameAsIdentifier( 3318b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor llvm::sys::path::stem(Header->getName()), 3328b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor NameBuf); 33351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Found = lookupModuleQualified(Name, Found); 33451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Found) 33551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return false; 33651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 33751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 33851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return !Found->isAvailable(); 33951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 34051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 34151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor SkippedDirs.push_back(Dir); 34251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 34351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Retrieve our parent path. 34451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor DirName = llvm::sys::path::parent_path(DirName); 34551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (DirName.empty()) 34651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor break; 34751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 34851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Resolve the parent path to a directory entry. 34951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Dir = SourceMgr->getFileManager().getDirectory(DirName); 35051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } while (Dir); 35151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 35251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return false; 35351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor} 35451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 3550be5e567e3a48592fd6b11f88cc77efb20c76f26Argyrios KyrtzidisModule *ModuleMap::findModule(StringRef Name) const { 3560be5e567e3a48592fd6b11f88cc77efb20c76f26Argyrios Kyrtzidis llvm::StringMap<Module *>::const_iterator Known = Modules.find(Name); 357484535e45b4d301847a157e943c7823da5d40884Douglas Gregor if (Known != Modules.end()) 358484535e45b4d301847a157e943c7823da5d40884Douglas Gregor return Known->getValue(); 359484535e45b4d301847a157e943c7823da5d40884Douglas Gregor 360484535e45b4d301847a157e943c7823da5d40884Douglas Gregor return 0; 361484535e45b4d301847a157e943c7823da5d40884Douglas Gregor} 362484535e45b4d301847a157e943c7823da5d40884Douglas Gregor 3630be5e567e3a48592fd6b11f88cc77efb20c76f26Argyrios KyrtzidisModule *ModuleMap::lookupModuleUnqualified(StringRef Name, 3640be5e567e3a48592fd6b11f88cc77efb20c76f26Argyrios Kyrtzidis Module *Context) const { 36590db26000aefe9335370013eec64c85232d80227Douglas Gregor for(; Context; Context = Context->Parent) { 36690db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Module *Sub = lookupModuleQualified(Name, Context)) 36790db26000aefe9335370013eec64c85232d80227Douglas Gregor return Sub; 36890db26000aefe9335370013eec64c85232d80227Douglas Gregor } 36990db26000aefe9335370013eec64c85232d80227Douglas Gregor 37090db26000aefe9335370013eec64c85232d80227Douglas Gregor return findModule(Name); 37190db26000aefe9335370013eec64c85232d80227Douglas Gregor} 37290db26000aefe9335370013eec64c85232d80227Douglas Gregor 3730be5e567e3a48592fd6b11f88cc77efb20c76f26Argyrios KyrtzidisModule *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) const{ 37490db26000aefe9335370013eec64c85232d80227Douglas Gregor if (!Context) 37590db26000aefe9335370013eec64c85232d80227Douglas Gregor return findModule(Name); 37690db26000aefe9335370013eec64c85232d80227Douglas Gregor 377b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor return Context->findSubmodule(Name); 37890db26000aefe9335370013eec64c85232d80227Douglas Gregor} 37990db26000aefe9335370013eec64c85232d80227Douglas Gregor 3801a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorstd::pair<Module *, bool> 381392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework, 382392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor bool IsExplicit) { 383392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Try to find an existing module with this name. 384b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (Module *Sub = lookupModuleQualified(Name, Parent)) 385b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor return std::make_pair(Sub, false); 386392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 387392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor // Create a new module with this name. 388392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework, 389392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor IsExplicit); 390d3220dbeeadc4ac54ceecea8cf63f8d8be291d2aArgyrios Kyrtzidis if (!Parent) { 391392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor Modules[Name] = Result; 392d3220dbeeadc4ac54ceecea8cf63f8d8be291d2aArgyrios Kyrtzidis if (!LangOpts.CurrentModule.empty() && !CompilingModule && 393d3220dbeeadc4ac54ceecea8cf63f8d8be291d2aArgyrios Kyrtzidis Name == LangOpts.CurrentModule) { 394d3220dbeeadc4ac54ceecea8cf63f8d8be291d2aArgyrios Kyrtzidis CompilingModule = Result; 395d3220dbeeadc4ac54ceecea8cf63f8d8be291d2aArgyrios Kyrtzidis } 396d3220dbeeadc4ac54ceecea8cf63f8d8be291d2aArgyrios Kyrtzidis } 397392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return std::make_pair(Result, true); 398392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor} 399392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 40082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregorbool ModuleMap::canInferFrameworkModule(const DirectoryEntry *ParentDir, 4010be5e567e3a48592fd6b11f88cc77efb20c76f26Argyrios Kyrtzidis StringRef Name, bool &IsSystem) const { 40282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Check whether we have already looked into the parent directory 40382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // for a module map. 4040be5e567e3a48592fd6b11f88cc77efb20c76f26Argyrios Kyrtzidis llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator 40582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor inferred = InferredDirectories.find(ParentDir); 40682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (inferred == InferredDirectories.end()) 40782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor return false; 40882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 40982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!inferred->second.InferModules) 41082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor return false; 41182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 41282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // We're allowed to infer for this directory, but make sure it's okay 41382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // to infer this particular module. 41482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor bool canInfer = std::find(inferred->second.ExcludedModules.begin(), 41582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor inferred->second.ExcludedModules.end(), 41682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Name) == inferred->second.ExcludedModules.end(); 41782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 41882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (canInfer && inferred->second.InferSystemModules) 41982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor IsSystem = true; 42082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 42182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor return canInfer; 42282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor} 42382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 4248767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor/// \brief For a framework module, infer the framework against which we 4258767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor/// should link. 4268767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregorstatic void inferFrameworkLink(Module *Mod, const DirectoryEntry *FrameworkDir, 4278767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor FileManager &FileMgr) { 4288767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor assert(Mod->IsFramework && "Can only infer linking for framework modules"); 4298767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor assert(!Mod->isSubFramework() && 4308767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor "Can only infer linking for top-level frameworks"); 4318767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor 4328767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor SmallString<128> LibName; 4338767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor LibName += FrameworkDir->getName(); 4348767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor llvm::sys::path::append(LibName, Mod->Name); 4358767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor if (FileMgr.getFile(LibName)) { 4368767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor Mod->LinkLibraries.push_back(Module::LinkLibrary(Mod->Name, 4378767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor /*IsFramework=*/true)); 4388767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor } 4398767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor} 4408767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor 4411a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule * 44282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas GregorModuleMap::inferFrameworkModule(StringRef ModuleName, 443ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor const DirectoryEntry *FrameworkDir, 444a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor bool IsSystem, 445ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Module *Parent) { 4462821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // Check whether we've already found this module. 447ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor if (Module *Mod = lookupModuleQualified(ModuleName, Parent)) 448ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor return Mod; 449ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor 450ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor FileManager &FileMgr = SourceMgr->getFileManager(); 45182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 45282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // If the framework has a parent path from which we're allowed to infer 45382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // a framework module, do so. 45482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!Parent) { 4557005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor // Determine whether we're allowed to infer a module map. 456713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor 4577005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor // Note: as an egregious but useful hack we use the real path here, because 4587005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor // we might be looking at an embedded framework that symlinks out to a 4597005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor // top-level framework, and we need to infer as if we were naming the 4607005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor // top-level framework. 461713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor StringRef FrameworkDirName 462713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor = SourceMgr->getFileManager().getCanonicalName(FrameworkDir); 4637005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor 46482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor bool canInfer = false; 4657005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor if (llvm::sys::path::has_parent_path(FrameworkDirName)) { 46682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Figure out the parent path. 4677005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor StringRef Parent = llvm::sys::path::parent_path(FrameworkDirName); 46882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (const DirectoryEntry *ParentDir = FileMgr.getDirectory(Parent)) { 46982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Check whether we have already looked into the parent directory 47082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // for a module map. 4710be5e567e3a48592fd6b11f88cc77efb20c76f26Argyrios Kyrtzidis llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator 47282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor inferred = InferredDirectories.find(ParentDir); 47382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (inferred == InferredDirectories.end()) { 47482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // We haven't looked here before. Load a module map, if there is 47582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // one. 47682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor SmallString<128> ModMapPath = Parent; 47782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor llvm::sys::path::append(ModMapPath, "module.map"); 47882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (const FileEntry *ModMapFile = FileMgr.getFile(ModMapPath)) { 47982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor parseModuleMapFile(ModMapFile); 48082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor inferred = InferredDirectories.find(ParentDir); 48182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 48282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 48382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (inferred == InferredDirectories.end()) 48482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor inferred = InferredDirectories.insert( 48582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor std::make_pair(ParentDir, InferredDirectory())).first; 48682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 48782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 48882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (inferred->second.InferModules) { 48982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // We're allowed to infer for this directory, but make sure it's okay 49082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // to infer this particular module. 4917005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor StringRef Name = llvm::sys::path::stem(FrameworkDirName); 49282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor canInfer = std::find(inferred->second.ExcludedModules.begin(), 49382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor inferred->second.ExcludedModules.end(), 49482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Name) == inferred->second.ExcludedModules.end(); 49582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 49682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (inferred->second.InferSystemModules) 49782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor IsSystem = true; 49882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 49982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 50082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 50182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 50282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // If we're not allowed to infer a framework module, don't. 50382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!canInfer) 50482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor return 0; 50582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 50682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 50782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 5082821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // Look for an umbrella header. 509f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName()); 5102821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor llvm::sys::path::append(UmbrellaName, "Headers"); 5112821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor llvm::sys::path::append(UmbrellaName, ModuleName + ".h"); 512ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName); 5132821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor 5142821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // FIXME: If there's no umbrella header, we could probably scan the 5152821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // framework to load *everything*. But, it's not clear that this is a good 5162821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor // idea. 5172821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor if (!UmbrellaHeader) 5182821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor return 0; 5192821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor 520ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Module *Result = new Module(ModuleName, SourceLocation(), Parent, 521ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor /*IsFramework=*/true, /*IsExplicit=*/false); 522a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (IsSystem) 523a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor Result->IsSystem = IsSystem; 524a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 525b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (!Parent) 526ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Modules[ModuleName] = Result; 527b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor 528489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor // umbrella header "umbrella-header-name" 52910694cee2588442bee1e717f5042c58ffee25279Douglas Gregor Result->Umbrella = UmbrellaHeader; 5302b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Headers[UmbrellaHeader] = KnownHeader(Result, /*Excluded=*/false); 5313cee31e4d7c23d3d5d0b8927998577b9f75087d7Douglas Gregor UmbrellaDirs[UmbrellaHeader->getDir()] = Result; 532209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor 533209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor // export * 534209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor Result->Exports.push_back(Module::ExportDecl(0, true)); 535209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor 536e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor // module * { export * } 537e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->InferSubmodules = true; 538e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor Result->InferExportWildcard = true; 539e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 540ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor // Look for subframeworks. 541ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor llvm::error_code EC; 542f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> SubframeworksDirName 54352b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor = StringRef(FrameworkDir->getName()); 544ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor llvm::sys::path::append(SubframeworksDirName, "Frameworks"); 545f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> SubframeworksDirNameNative; 54652b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor llvm::sys::path::native(SubframeworksDirName.str(), 54752b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor SubframeworksDirNameNative); 54852b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor for (llvm::sys::fs::directory_iterator 54952b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor Dir(SubframeworksDirNameNative.str(), EC), DirEnd; 550ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor Dir != DirEnd && !EC; Dir.increment(EC)) { 551ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor if (!StringRef(Dir->path()).endswith(".framework")) 552ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor continue; 55398cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor 554ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor if (const DirectoryEntry *SubframeworkDir 555ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor = FileMgr.getDirectory(Dir->path())) { 55698cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor // Note: as an egregious but useful hack, we use the real path here and 55798cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor // check whether it is actually a subdirectory of the parent directory. 55898cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor // This will not be the case if the 'subframework' is actually a symlink 55998cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor // out to a top-level framework. 560713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor StringRef SubframeworkDirName = FileMgr.getCanonicalName(SubframeworkDir); 561713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor bool FoundParent = false; 562713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor do { 563713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor // Get the parent directory name. 564713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor SubframeworkDirName 565713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor = llvm::sys::path::parent_path(SubframeworkDirName); 566713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor if (SubframeworkDirName.empty()) 567713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor break; 568713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor 569713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor if (FileMgr.getDirectory(SubframeworkDirName) == FrameworkDir) { 570713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor FoundParent = true; 571713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor break; 572713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor } 573713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor } while (true); 57498cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor 575713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor if (!FoundParent) 576713b7c011869f177dc76e6df4f7f44b1bd073bb0Douglas Gregor continue; 57798cfcbf2aeff03d40575ab79b03e6baeff4e3570Douglas Gregor 578ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor // FIXME: Do we want to warn about subframeworks without umbrella headers? 5798b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor SmallString<32> NameBuf; 5808b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor inferFrameworkModule(sanitizeFilenameAsIdentifier( 5818b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor llvm::sys::path::stem(Dir->path()), NameBuf), 5828b48e087bc0e022703d235fa6382551cfaa57ae6Douglas Gregor SubframeworkDir, IsSystem, Result); 583ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor } 584ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor } 5853a110f75acafc992cb664200cebec90520986715Douglas Gregor 5868767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor // If the module is a top-level framework, automatically link against the 5878767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor // framework. 5888767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor if (!Result->isSubFramework()) { 5898767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor inferFrameworkLink(Result, FrameworkDir, FileMgr); 5908767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor } 5918767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor 5922821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor return Result; 5932821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor} 5942821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor 595e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregorvoid ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader){ 5962b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Headers[UmbrellaHeader] = KnownHeader(Mod, /*Excluded=*/false); 59710694cee2588442bee1e717f5042c58ffee25279Douglas Gregor Mod->Umbrella = UmbrellaHeader; 5986a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor UmbrellaDirs[UmbrellaHeader->getDir()] = Mod; 599e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor} 600e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 60177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregorvoid ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir) { 60277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Mod->Umbrella = UmbrellaDir; 60377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor UmbrellaDirs[UmbrellaDir] = Mod; 60477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor} 60577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 6062b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregorvoid ModuleMap::addHeader(Module *Mod, const FileEntry *Header, 6072b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor bool Excluded) { 60855ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis if (Excluded) { 6092b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Mod->ExcludedHeaders.push_back(Header); 61055ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis } else { 6112b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Mod->Headers.push_back(Header); 612d3220dbeeadc4ac54ceecea8cf63f8d8be291d2aArgyrios Kyrtzidis bool isCompilingModuleHeader = Mod->getTopLevelModule() == CompilingModule; 613d3220dbeeadc4ac54ceecea8cf63f8d8be291d2aArgyrios Kyrtzidis HeaderInfo.MarkFileModuleHeader(Header, isCompilingModuleHeader); 61455ea75bf61a5d76f6453513d937944ce68181c6aArgyrios Kyrtzidis } 6152b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Headers[Header] = KnownHeader(Mod, Excluded); 616e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor} 617e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 618f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregorconst FileEntry * 6190be5e567e3a48592fd6b11f88cc77efb20c76f26Argyrios KyrtzidisModuleMap::getContainingModuleMapFile(Module *Module) const { 620f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor if (Module->DefinitionLoc.isInvalid() || !SourceMgr) 621f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor return 0; 622f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 623f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor return SourceMgr->getFileEntryForID( 624f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor SourceMgr->getFileID(Module->DefinitionLoc)); 625f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor} 626f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor 627a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMap::dump() { 628a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::errs() << "Modules:"; 629a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor for (llvm::StringMap<Module *>::iterator M = Modules.begin(), 630a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor MEnd = Modules.end(); 631a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor M != MEnd; ++M) 632804c3bfee22076f232dddf4839439119cfdee2b6Douglas Gregor M->getValue()->print(llvm::errs(), 2); 633a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 634a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::errs() << "Headers:"; 6352b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor for (HeadersMap::iterator H = Headers.begin(), HEnd = Headers.end(); 636a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor H != HEnd; ++H) { 637a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::errs() << " \"" << H->first->getName() << "\" -> " 6382b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor << H->second.getModule()->getFullModuleName() << "\n"; 639a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 640a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 641a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 64290db26000aefe9335370013eec64c85232d80227Douglas Gregorbool ModuleMap::resolveExports(Module *Mod, bool Complain) { 64390db26000aefe9335370013eec64c85232d80227Douglas Gregor bool HadError = false; 64490db26000aefe9335370013eec64c85232d80227Douglas Gregor for (unsigned I = 0, N = Mod->UnresolvedExports.size(); I != N; ++I) { 64590db26000aefe9335370013eec64c85232d80227Douglas Gregor Module::ExportDecl Export = resolveExport(Mod, Mod->UnresolvedExports[I], 64690db26000aefe9335370013eec64c85232d80227Douglas Gregor Complain); 6470adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor if (Export.getPointer() || Export.getInt()) 64890db26000aefe9335370013eec64c85232d80227Douglas Gregor Mod->Exports.push_back(Export); 64990db26000aefe9335370013eec64c85232d80227Douglas Gregor else 65090db26000aefe9335370013eec64c85232d80227Douglas Gregor HadError = true; 65190db26000aefe9335370013eec64c85232d80227Douglas Gregor } 65290db26000aefe9335370013eec64c85232d80227Douglas Gregor Mod->UnresolvedExports.clear(); 65390db26000aefe9335370013eec64c85232d80227Douglas Gregor return HadError; 65490db26000aefe9335370013eec64c85232d80227Douglas Gregor} 65590db26000aefe9335370013eec64c85232d80227Douglas Gregor 656906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregorbool ModuleMap::resolveConflicts(Module *Mod, bool Complain) { 657906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor bool HadError = false; 658906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor for (unsigned I = 0, N = Mod->UnresolvedConflicts.size(); I != N; ++I) { 659906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Module *OtherMod = resolveModuleId(Mod->UnresolvedConflicts[I].Id, 660906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Mod, Complain); 661906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor if (!OtherMod) { 662906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor HadError = true; 663906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor continue; 664906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor } 665906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 666906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Module::Conflict Conflict; 667906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Conflict.Other = OtherMod; 668906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Conflict.Message = Mod->UnresolvedConflicts[I].Message; 669906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Mod->Conflicts.push_back(Conflict); 670906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor } 671906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Mod->UnresolvedConflicts.clear(); 672906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor return HadError; 673906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor} 674906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 67555988680ece66b8e505ee136b35e74fcb1173aeeDouglas GregorModule *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) { 67655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor if (Loc.isInvalid()) 67755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor return 0; 67855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 67955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor // Use the expansion location to determine which module we're in. 68055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor FullSourceLoc ExpansionLoc = Loc.getExpansionLoc(); 68155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor if (!ExpansionLoc.isFileID()) 68255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor return 0; 68355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 68455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 68555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor const SourceManager &SrcMgr = Loc.getManager(); 68655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor FileID ExpansionFileID = ExpansionLoc.getFileID(); 68755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 688303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor while (const FileEntry *ExpansionFile 689303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor = SrcMgr.getFileEntryForID(ExpansionFileID)) { 690303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor // Find the module that owns this header (if any). 691303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor if (Module *Mod = findModuleForHeader(ExpansionFile)) 692303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor return Mod; 693303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor 694303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor // No module owns this header, so look up the inclusion chain to see if 695303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor // any included header has an associated module. 696303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor SourceLocation IncludeLoc = SrcMgr.getIncludeLoc(ExpansionFileID); 697303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor if (IncludeLoc.isInvalid()) 698303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor return 0; 699303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor 700303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor ExpansionFileID = SrcMgr.getFileID(IncludeLoc); 701303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor } 702303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor 703303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor return 0; 70455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor} 70555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 706a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//----------------------------------------------------------------------------// 707a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// Module map file parser 708a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//----------------------------------------------------------------------------// 709a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 710a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregornamespace clang { 711a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief A token in a module map file. 712a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor struct MMToken { 713a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor enum TokenKind { 71451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Comma, 71563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor ConfigMacros, 716906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Conflict, 717a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor EndOfFile, 718a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HeaderKeyword, 719a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Identifier, 7202b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor ExcludeKeyword, 721a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ExplicitKeyword, 72290db26000aefe9335370013eec64c85232d80227Douglas Gregor ExportKeyword, 723a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor FrameworkKeyword, 724b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor LinkKeyword, 725a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ModuleKeyword, 72690db26000aefe9335370013eec64c85232d80227Douglas Gregor Period, 727a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor UmbrellaKeyword, 72851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor RequiresKeyword, 72990db26000aefe9335370013eec64c85232d80227Douglas Gregor Star, 730a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringLiteral, 731a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor LBrace, 732a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor RBrace, 733a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor LSquare, 734a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor RSquare 735a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } Kind; 736a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 737a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned Location; 738a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned StringLength; 739a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor const char *StringData; 740a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 741a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor void clear() { 742a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Kind = EndOfFile; 743a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Location = 0; 744a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringLength = 0; 745a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringData = 0; 746a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 747a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 748a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool is(TokenKind K) const { return Kind == K; } 749a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 750a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation getLocation() const { 751a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return SourceLocation::getFromRawEncoding(Location); 752a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 753a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 754a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringRef getString() const { 755a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return StringRef(StringData, StringLength); 756a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 757a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor }; 75882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 75982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor /// \brief The set of attributes that can be attached to a module. 760ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling struct Attributes { 76163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Attributes() : IsSystem(), IsExhaustive() { } 76282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 76382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor /// \brief Whether this is a system module. 76482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor unsigned IsSystem : 1; 76563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 76663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor /// \brief Whether this is an exhaustive set of configuration macros. 76763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor unsigned IsExhaustive : 1; 76882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor }; 769a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 77082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 771a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor class ModuleMapParser { 772a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Lexer &L; 773a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceManager &SourceMgr; 7749a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor 7759a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor /// \brief Default target information, used only for string literal 7769a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor /// parsing. 7779a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor const TargetInfo *Target; 7789a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor 779a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor DiagnosticsEngine &Diags; 780a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ModuleMap ⤅ 781a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 7828b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor /// \brief The directory that this module map resides in. 7838b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor const DirectoryEntry *Directory; 7842f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 7852f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor /// \brief The directory containing Clang-supplied headers. 7862f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor const DirectoryEntry *BuiltinIncludeDir; 7872f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 788a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Whether an error occurred. 789a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool HadError; 7909a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor 791a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Stores string data for the various string literals referenced 792a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// during parsing. 793a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor llvm::BumpPtrAllocator StringData; 794a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 795a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief The current token. 796a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor MMToken Tok; 797a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 798a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief The active module. 7991a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor Module *ActiveModule; 800a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 801a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Consume the current token and return its location. 802a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation consumeToken(); 803a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 804a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// \brief Skip tokens until we reach the a token with the given kind 805a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor /// (or the end of the file). 806a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor void skipUntil(MMToken::TokenKind K); 807587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 808cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko typedef SmallVector<std::pair<std::string, SourceLocation>, 2> ModuleId; 809587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor bool parseModuleId(ModuleId &Id); 810a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor void parseModuleDecl(); 81151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor void parseRequiresDecl(); 8122b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor void parseHeaderDecl(SourceLocation UmbrellaLoc, SourceLocation ExcludeLoc); 81377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc); 81490db26000aefe9335370013eec64c85232d80227Douglas Gregor void parseExportDecl(); 815b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor void parseLinkDecl(); 81663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor void parseConfigMacros(); 817906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor void parseConflict(); 81882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor void parseInferredModuleDecl(bool Framework, bool Explicit); 819ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling bool parseOptionalAttributes(Attributes &Attrs); 82082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 8216a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor const DirectoryEntry *getOverriddenHeaderSearchDir(); 8226a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor 823a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor public: 824a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr, 8259a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor const TargetInfo *Target, 826a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor DiagnosticsEngine &Diags, 8278b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor ModuleMap &Map, 8282f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor const DirectoryEntry *Directory, 8292f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor const DirectoryEntry *BuiltinIncludeDir) 8309a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map), 8312f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor Directory(Directory), BuiltinIncludeDir(BuiltinIncludeDir), 8322f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor HadError(false), ActiveModule(0) 833a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor { 834a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.clear(); 835a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 836a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 837a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 838a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool parseModuleMapFile(); 839a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor }; 840a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 841a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 842a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorSourceLocation ModuleMapParser::consumeToken() { 843a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorretry: 844a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation Result = Tok.getLocation(); 845a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.clear(); 846a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 847a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Token LToken; 848a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor L.LexFromRawLexer(LToken); 849a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Location = LToken.getLocation().getRawEncoding(); 850a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (LToken.getKind()) { 851a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::raw_identifier: 852a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringData = LToken.getRawIdentifierData(); 853a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringLength = LToken.getLength(); 854a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(Tok.getString()) 85563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor .Case("config_macros", MMToken::ConfigMacros) 856906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor .Case("conflict", MMToken::Conflict) 8572b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor .Case("exclude", MMToken::ExcludeKeyword) 858a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("explicit", MMToken::ExplicitKeyword) 85990db26000aefe9335370013eec64c85232d80227Douglas Gregor .Case("export", MMToken::ExportKeyword) 860a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor .Case("framework", MMToken::FrameworkKeyword) 86163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor .Case("header", MMToken::HeaderKeyword) 862b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor .Case("link", MMToken::LinkKeyword) 863a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("module", MMToken::ModuleKeyword) 86451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor .Case("requires", MMToken::RequiresKeyword) 865a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Case("umbrella", MMToken::UmbrellaKeyword) 866a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor .Default(MMToken::Identifier); 867a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 86851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 86951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor case tok::comma: 87051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Tok.Kind = MMToken::Comma; 87151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor break; 87251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 873a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::eof: 874a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::EndOfFile; 875a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 876a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 877a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::l_brace: 878a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::LBrace; 879a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 880a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 881a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case tok::l_square: 882a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor Tok.Kind = MMToken::LSquare; 883a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor break; 884a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 88590db26000aefe9335370013eec64c85232d80227Douglas Gregor case tok::period: 88690db26000aefe9335370013eec64c85232d80227Douglas Gregor Tok.Kind = MMToken::Period; 88790db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 88890db26000aefe9335370013eec64c85232d80227Douglas Gregor 889a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::r_brace: 890a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::RBrace; 891a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 892a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 893a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case tok::r_square: 894a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor Tok.Kind = MMToken::RSquare; 895a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor break; 896a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 89790db26000aefe9335370013eec64c85232d80227Douglas Gregor case tok::star: 89890db26000aefe9335370013eec64c85232d80227Douglas Gregor Tok.Kind = MMToken::Star; 89990db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 90090db26000aefe9335370013eec64c85232d80227Douglas Gregor 901a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::string_literal: { 90299831e4677a7e2e051af636221694d60ba31fcdbRichard Smith if (LToken.hasUDSuffix()) { 90399831e4677a7e2e051af636221694d60ba31fcdbRichard Smith Diags.Report(LToken.getLocation(), diag::err_invalid_string_udl); 90499831e4677a7e2e051af636221694d60ba31fcdbRichard Smith HadError = true; 90599831e4677a7e2e051af636221694d60ba31fcdbRichard Smith goto retry; 90699831e4677a7e2e051af636221694d60ba31fcdbRichard Smith } 90799831e4677a7e2e051af636221694d60ba31fcdbRichard Smith 908a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the string literal. 909a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor LangOptions LangOpts; 910a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor StringLiteralParser StringLiteral(<oken, 1, SourceMgr, LangOpts, *Target); 911a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (StringLiteral.hadError) 912a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor goto retry; 913a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 914a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Copy the string literal into our string data allocator. 915a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned Length = StringLiteral.GetStringLength(); 916a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor char *Saved = StringData.Allocate<char>(Length + 1); 917a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor memcpy(Saved, StringLiteral.GetString().data(), Length); 918a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Saved[Length] = 0; 919a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 920a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Form the token. 921a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.Kind = MMToken::StringLiteral; 922a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringData = Saved; 923a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Tok.StringLength = Length; 924a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 925a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 926a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 927a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case tok::comment: 928a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor goto retry; 929a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 930a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor default: 931a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token); 932a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 933a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor goto retry; 934a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 935a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 936a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return Result; 937a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 938a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 939a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::skipUntil(MMToken::TokenKind K) { 940a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor unsigned braceDepth = 0; 941a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor unsigned squareDepth = 0; 942a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor do { 943a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (Tok.Kind) { 944a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::EndOfFile: 945a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 946a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 947a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::LBrace: 948a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 949a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 950a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 951a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor ++braceDepth; 952a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 953a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 954a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case MMToken::LSquare: 955a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (Tok.is(K) && braceDepth == 0 && squareDepth == 0) 956a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor return; 957a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 958a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor ++squareDepth; 959a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor break; 960a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 961a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::RBrace: 962a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (braceDepth > 0) 963a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor --braceDepth; 964a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor else if (Tok.is(K)) 965a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 966a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 967a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 968a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case MMToken::RSquare: 969a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (squareDepth > 0) 970a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor --squareDepth; 971a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor else if (Tok.is(K)) 972a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor return; 973a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor break; 974a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 975a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor default: 976a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor if (braceDepth == 0 && squareDepth == 0 && Tok.is(K)) 977a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 978a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 979a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 980a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 981a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 982a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } while (true); 983a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 984a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 985587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// \brief Parse a module-id. 986587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// 987587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// module-id: 988587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// identifier 989587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// identifier '.' module-id 990587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// 991587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// \returns true if an error occurred, false otherwise. 992587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregorbool ModuleMapParser::parseModuleId(ModuleId &Id) { 993587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Id.clear(); 994587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor do { 995587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Tok.is(MMToken::Identifier)) { 996587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation())); 997587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor consumeToken(); 998587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 999587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name); 1000587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return true; 1001587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 1002587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1003587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (!Tok.is(MMToken::Period)) 1004587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor break; 1005587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1006587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor consumeToken(); 1007587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } while (true); 1008587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1009587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return false; 1010587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor} 1011587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1012a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregornamespace { 1013a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor /// \brief Enumerates the known attributes. 1014a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor enum AttributeKind { 1015a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor /// \brief An unknown attribute. 1016a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor AT_unknown, 1017a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor /// \brief The 'system' attribute. 101863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor AT_system, 101963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor /// \brief The 'exhaustive' attribute. 102063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor AT_exhaustive 1021a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor }; 1022a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor} 1023a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 1024a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a module declaration. 1025a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// 1026a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-declaration: 1027a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// 'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt] 1028a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// { module-member* } 1029a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor/// 1030a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-member: 103151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// requires-declaration 1032a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// header-declaration 1033587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// submodule-declaration 103490db26000aefe9335370013eec64c85232d80227Douglas Gregor/// export-declaration 1035b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor/// link-declaration 10361e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// 10371e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// submodule-declaration: 10381e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// module-declaration 10391e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor/// inferred-submodule-declaration 1040a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::parseModuleDecl() { 1041a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) || 1042a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor Tok.is(MMToken::FrameworkKeyword)); 1043d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Parse 'explicit' or 'framework' keyword, if present. 1044587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor SourceLocation ExplicitLoc; 1045a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool Explicit = false; 1046d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor bool Framework = false; 1047a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor 1048a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor // Parse 'explicit' keyword, if present. 1049d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Tok.is(MMToken::ExplicitKeyword)) { 1050587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ExplicitLoc = consumeToken(); 1051a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Explicit = true; 1052a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1053d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 1054d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Parse 'framework' keyword, if present. 1055d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Tok.is(MMToken::FrameworkKeyword)) { 1056d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor consumeToken(); 1057d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor Framework = true; 1058d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 1059a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1060a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse 'module' keyword. 1061a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Tok.is(MMToken::ModuleKeyword)) { 1062e6fb9876970e2dc55f091522644efa16caa9ba06Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 1063a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 1064a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1065a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 1066a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1067a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); // 'module' keyword 10681e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 10691e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // If we have a wildcard for the module name, this is an inferred submodule. 10701e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Parse it. 10711e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::Star)) 107282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor return parseInferredModuleDecl(Framework, Explicit); 1073a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1074a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the module name. 1075587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ModuleId Id; 1076587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (parseModuleId(Id)) { 1077587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor HadError = true; 1078587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return; 1079587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 108082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 1081587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (ActiveModule) { 1082587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Id.size() > 1) { 1083587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id) 1084587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor << SourceRange(Id.front().second, Id.back().second); 1085587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1086587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor HadError = true; 1087587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return; 1088587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 1089587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else if (Id.size() == 1 && Explicit) { 1090587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Top-level modules can't be explicit. 1091587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level); 1092587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Explicit = false; 1093587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ExplicitLoc = SourceLocation(); 1094a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1095a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1096587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1097587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Module *PreviousActiveModule = ActiveModule; 1098587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Id.size() > 1) { 1099587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // This module map defines a submodule. Go find the module of which it 1100587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // is a submodule. 1101587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ActiveModule = 0; 1102587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) { 1103587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) { 1104587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ActiveModule = Next; 1105587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor continue; 1106587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 1107587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1108587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (ActiveModule) { 1109587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified) 1110587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor << Id[I].first << ActiveModule->getTopLevelModule(); 1111587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 1112587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor Diags.Report(Id[I].second, diag::err_mmap_expected_module_name); 1113587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 1114587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor HadError = true; 1115587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor return; 1116587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 1117587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 1118587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1119587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor StringRef ModuleName = Id.back().first; 1120587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor SourceLocation ModuleNameLoc = Id.back().second; 1121a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1122a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor // Parse the optional attribute list. 1123ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling Attributes Attrs; 112482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor parseOptionalAttributes(Attrs); 1125a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor 1126a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the opening brace. 1127a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Tok.is(MMToken::LBrace)) { 1128a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace) 1129a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor << ModuleName; 1130a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1131a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 1132a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1133a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation LBraceLoc = consumeToken(); 1134a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1135a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Determine whether this (sub)module has already been defined. 1136b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) { 1137c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor if (Existing->DefinitionLoc.isInvalid() && !ActiveModule) { 1138c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor // Skip the module definition. 1139c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor skipUntil(MMToken::RBrace); 1140c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor if (Tok.is(MMToken::RBrace)) 1141c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor consumeToken(); 1142c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor else { 1143c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 1144c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 1145c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor HadError = true; 1146c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor } 1147c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor return; 1148c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor } 1149c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor 1150a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition) 1151a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor << ModuleName; 1152b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition); 1153a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1154a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Skip the module definition. 1155a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor skipUntil(MMToken::RBrace); 1156a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (Tok.is(MMToken::RBrace)) 1157a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 1158a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1159a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1160a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 1161a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1162a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1163a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Start defining this module. 1164b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor ActiveModule = Map.findOrCreateModule(ModuleName, ActiveModule, Framework, 1165b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor Explicit).first; 1166b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor ActiveModule->DefinitionLoc = ModuleNameLoc; 116782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (Attrs.IsSystem) 1168a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor ActiveModule->IsSystem = true; 1169a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1170a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool Done = false; 1171a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor do { 1172a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (Tok.Kind) { 1173a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::EndOfFile: 1174a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::RBrace: 1175a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Done = true; 1176a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 117763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 117863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor case MMToken::ConfigMacros: 117963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor parseConfigMacros(); 118063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor break; 118163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 1182906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor case MMToken::Conflict: 1183906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor parseConflict(); 1184906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor break; 1185906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 1186a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::ExplicitKeyword: 1187d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor case MMToken::FrameworkKeyword: 1188a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::ModuleKeyword: 1189a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor parseModuleDecl(); 1190a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1191a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 119290db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::ExportKeyword: 119390db26000aefe9335370013eec64c85232d80227Douglas Gregor parseExportDecl(); 119490db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 119590db26000aefe9335370013eec64c85232d80227Douglas Gregor 119651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor case MMToken::RequiresKeyword: 119751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor parseRequiresDecl(); 119851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor break; 119951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 120077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor case MMToken::UmbrellaKeyword: { 120177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor SourceLocation UmbrellaLoc = consumeToken(); 120277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (Tok.is(MMToken::HeaderKeyword)) 12032b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor parseHeaderDecl(UmbrellaLoc, SourceLocation()); 120477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor else 120577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor parseUmbrellaDirDecl(UmbrellaLoc); 1206a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 120777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 1208a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 12092b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor case MMToken::ExcludeKeyword: { 12102b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor SourceLocation ExcludeLoc = consumeToken(); 12112b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor if (Tok.is(MMToken::HeaderKeyword)) { 12122b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor parseHeaderDecl(SourceLocation(), ExcludeLoc); 12132b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor } else { 12142b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 12152b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor << "exclude"; 12162b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor } 12172b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor break; 12182b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor } 12192b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor 1220489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor case MMToken::HeaderKeyword: 12212b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor parseHeaderDecl(SourceLocation(), SourceLocation()); 1222a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1223b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 1224b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor case MMToken::LinkKeyword: 1225b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor parseLinkDecl(); 1226b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor break; 1227b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 1228a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor default: 1229a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member); 1230a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 1231a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1232a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1233a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } while (!Done); 1234a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1235a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (Tok.is(MMToken::RBrace)) 1236a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 1237a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor else { 1238a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 1239a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 1240a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1241a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1242a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 12438767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor // If the active module is a top-level framework, and there are no link 12448767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor // libraries, automatically link against the framework. 12458767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() && 12468767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor ActiveModule->LinkLibraries.empty()) { 12478767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager()); 12488767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor } 12498767dc29ec23f96e71658f760333bdf5d87283d5Douglas Gregor 1250587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // We're done parsing this module. Pop back to the previous module. 1251587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor ActiveModule = PreviousActiveModule; 1252a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 1253d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 125451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// \brief Parse a requires declaration. 125551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// 125651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// requires-declaration: 125751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// 'requires' feature-list 125851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// 125951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// feature-list: 126051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// identifier ',' feature-list 126151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// identifier 126251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregorvoid ModuleMapParser::parseRequiresDecl() { 126351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor assert(Tok.is(MMToken::RequiresKeyword)); 126451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 126551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Parse 'requires' keyword. 126651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor consumeToken(); 126751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 126851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Parse the feature-list. 126951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor do { 127051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Tok.is(MMToken::Identifier)) { 127151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature); 127251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor HadError = true; 127351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return; 127451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } 127551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 127651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Consume the feature name. 127751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor std::string Feature = Tok.getString(); 127851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor consumeToken(); 127951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 128051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Add this feature. 1281dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor ActiveModule->addRequirement(Feature, Map.LangOpts, *Map.Target); 128251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 128351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (!Tok.is(MMToken::Comma)) 128451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor break; 128551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 128651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor // Consume the comma. 128751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor consumeToken(); 128851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor } while (true); 128951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor} 129051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 1291d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor/// \brief Append to \p Paths the set of paths needed to get to the 1292d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor/// subframework in which the given module lives. 12935bbc385ad2d8e487edfbc2756eaf4fb0b920cfe4Benjamin Kramerstatic void appendSubframeworkPaths(Module *Mod, 1294cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVectorImpl<char> &Path) { 1295d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Collect the framework names from the given module to the top-level module. 1296cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<StringRef, 2> Paths; 1297d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor for (; Mod; Mod = Mod->Parent) { 1298d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Mod->IsFramework) 1299d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor Paths.push_back(Mod->Name); 1300d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 1301d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 1302d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (Paths.empty()) 1303d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor return; 1304d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 1305d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor // Add Frameworks/Name.framework for each subframework. 1306d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor for (unsigned I = Paths.size() - 1; I != 0; --I) { 1307d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor llvm::sys::path::append(Path, "Frameworks"); 1308d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor llvm::sys::path::append(Path, Paths[I-1] + ".framework"); 1309d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 1310d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor} 1311d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor 1312489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor/// \brief Parse a header declaration. 1313a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// 1314489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor/// header-declaration: 1315489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor/// 'umbrella'[opt] 'header' string-literal 13162b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor/// 'exclude'[opt] 'header' string-literal 13172b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregorvoid ModuleMapParser::parseHeaderDecl(SourceLocation UmbrellaLoc, 13182b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor SourceLocation ExcludeLoc) { 1319489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor assert(Tok.is(MMToken::HeaderKeyword)); 1320489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor consumeToken(); 1321489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor 1322489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor bool Umbrella = UmbrellaLoc.isValid(); 13232b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor bool Exclude = ExcludeLoc.isValid(); 13242b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor assert(!(Umbrella && Exclude) && "Cannot have both 'umbrella' and 'exclude'"); 1325a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse the header name. 1326a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Tok.is(MMToken::StringLiteral)) { 1327a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 1328489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor << "header"; 1329a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1330a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return; 1331a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1332587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor std::string FileName = Tok.getString(); 1333a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor SourceLocation FileNameLoc = consumeToken(); 1334489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor 133577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Check whether we already have an umbrella. 133677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (Umbrella && ActiveModule->Umbrella) { 133777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(FileNameLoc, diag::err_mmap_umbrella_clash) 133877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << ActiveModule->getFullModuleName(); 13398b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor HadError = true; 13408b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor return; 13418b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } 1342a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor 13438b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor // Look for this file. 1344587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor const FileEntry *File = 0; 13452f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor const FileEntry *BuiltinFile = 0; 1346f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> PathName; 1347587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (llvm::sys::path::is_absolute(FileName)) { 1348587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor PathName = FileName; 1349587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 13506a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor } else if (const DirectoryEntry *Dir = getOverriddenHeaderSearchDir()) { 13516a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor PathName = Dir->getName(); 13526a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor llvm::sys::path::append(PathName, FileName); 13536a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 1354587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 1355587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Search for the header file within the search directory. 13566a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor PathName = Directory->getName(); 1357587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor unsigned PathLength = PathName.size(); 135818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor 1359d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor if (ActiveModule->isPartOfFramework()) { 1360d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor appendSubframeworkPaths(ActiveModule, PathName); 1361587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1362587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Check whether this file is in the public headers. 136318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor llvm::sys::path::append(PathName, "Headers"); 1364587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, FileName); 1365587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 1366587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor 1367587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (!File) { 1368587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Check whether this file is in the private headers. 1369587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor PathName.resize(PathLength); 1370587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, "PrivateHeaders"); 1371587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, FileName); 1372587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 1373587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } 1374587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor } else { 1375587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor // Lookup for normal headers. 1376587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor llvm::sys::path::append(PathName, FileName); 1377587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor File = SourceMgr.getFileManager().getFile(PathName); 13782f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 13792f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // If this is a system module with a top-level header, this header 13802f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // may have a counterpart (or replacement) in the set of headers 13812f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // supplied by Clang. Find that builtin header. 13822f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor if (ActiveModule->IsSystem && !Umbrella && BuiltinIncludeDir && 13832f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor BuiltinIncludeDir != Directory && isBuiltinHeader(FileName)) { 1384f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName()); 13852f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor llvm::sys::path::append(BuiltinPathName, FileName); 13862f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName); 13872f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 13882f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // If Clang supplies this header but the underlying system does not, 13892f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // just silently swap in our builtin version. Otherwise, we'll end 13902f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // up adding both (later). 13912f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor if (!File && BuiltinFile) { 13922f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor File = BuiltinFile; 13932f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor BuiltinFile = 0; 13942f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor } 13952f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor } 1396d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor } 139718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor } 1398a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor 13998b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor // FIXME: We shouldn't be eagerly stat'ing every file named in a module map. 14008b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor // Come up with a lazy way to do this. 1401587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor if (File) { 14022b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor if (ModuleMap::KnownHeader OwningModule = Map.Headers[File]) { 14038b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor Diags.Report(FileNameLoc, diag::err_mmap_header_conflict) 14042b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor << FileName << OwningModule.getModule()->getFullModuleName(); 14058b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor HadError = true; 1406489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor } else if (Umbrella) { 1407489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor const DirectoryEntry *UmbrellaDir = File->getDir(); 14082b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor if (Module *UmbrellaModule = Map.UmbrellaDirs[UmbrellaDir]) { 1409489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash) 14102b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor << UmbrellaModule->getFullModuleName(); 1411489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor HadError = true; 1412489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor } else { 1413489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor // Record this umbrella header. 1414489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor Map.setUmbrellaHeader(ActiveModule, File); 1415489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor } 14168b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } else { 1417489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor // Record this header. 14182b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Map.addHeader(ActiveModule, File, Exclude); 14192f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor 14202f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor // If there is a builtin counterpart to this file, add it now. 14212f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor if (BuiltinFile) 14222b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor Map.addHeader(ActiveModule, BuiltinFile, Exclude); 14238b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } 142471f49f5d8fc3c4980bed4bb7790c8d0e50586d3bDouglas Gregor } else if (!Exclude) { 142571f49f5d8fc3c4980bed4bb7790c8d0e50586d3bDouglas Gregor // Ignore excluded header files. They're optional anyway. 142671f49f5d8fc3c4980bed4bb7790c8d0e50586d3bDouglas Gregor 14278b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor Diags.Report(FileNameLoc, diag::err_mmap_header_not_found) 142877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << Umbrella << FileName; 142977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor HadError = true; 143077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 143177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor} 143277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 143377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor/// \brief Parse an umbrella directory declaration. 143477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor/// 143577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor/// umbrella-dir-declaration: 143677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor/// umbrella string-literal 143777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregorvoid ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) { 143877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Parse the directory name. 143977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (!Tok.is(MMToken::StringLiteral)) { 144077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 144177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << "umbrella"; 144277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor HadError = true; 144377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor return; 144477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 144577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 144677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor std::string DirName = Tok.getString(); 144777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor SourceLocation DirNameLoc = consumeToken(); 144877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 144977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Check whether we already have an umbrella. 145077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (ActiveModule->Umbrella) { 145177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash) 145277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << ActiveModule->getFullModuleName(); 14538b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor HadError = true; 145477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor return; 145577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 145677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 145777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Look for this file. 145877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor const DirectoryEntry *Dir = 0; 145977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (llvm::sys::path::is_absolute(DirName)) 146077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Dir = SourceMgr.getFileManager().getDirectory(DirName); 146177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor else { 1462f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith SmallString<128> PathName; 146377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor PathName = Directory->getName(); 146477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor llvm::sys::path::append(PathName, DirName); 146577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Dir = SourceMgr.getFileManager().getDirectory(PathName); 14668b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor } 146777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 146877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (!Dir) { 146977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found) 147077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << DirName; 147177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor HadError = true; 147277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor return; 147377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 147477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 147577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (Module *OwningModule = Map.UmbrellaDirs[Dir]) { 147677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash) 147777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor << OwningModule->getFullModuleName(); 147877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor HadError = true; 147977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor return; 148077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 148177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 148277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor // Record this umbrella directory. 148377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor Map.setUmbrellaDir(ActiveModule, Dir); 1484a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 1485a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 148690db26000aefe9335370013eec64c85232d80227Douglas Gregor/// \brief Parse a module export declaration. 148790db26000aefe9335370013eec64c85232d80227Douglas Gregor/// 148890db26000aefe9335370013eec64c85232d80227Douglas Gregor/// export-declaration: 148990db26000aefe9335370013eec64c85232d80227Douglas Gregor/// 'export' wildcard-module-id 149090db26000aefe9335370013eec64c85232d80227Douglas Gregor/// 149190db26000aefe9335370013eec64c85232d80227Douglas Gregor/// wildcard-module-id: 149290db26000aefe9335370013eec64c85232d80227Douglas Gregor/// identifier 149390db26000aefe9335370013eec64c85232d80227Douglas Gregor/// '*' 149490db26000aefe9335370013eec64c85232d80227Douglas Gregor/// identifier '.' wildcard-module-id 149590db26000aefe9335370013eec64c85232d80227Douglas Gregorvoid ModuleMapParser::parseExportDecl() { 149690db26000aefe9335370013eec64c85232d80227Douglas Gregor assert(Tok.is(MMToken::ExportKeyword)); 149790db26000aefe9335370013eec64c85232d80227Douglas Gregor SourceLocation ExportLoc = consumeToken(); 149890db26000aefe9335370013eec64c85232d80227Douglas Gregor 149990db26000aefe9335370013eec64c85232d80227Douglas Gregor // Parse the module-id with an optional wildcard at the end. 150090db26000aefe9335370013eec64c85232d80227Douglas Gregor ModuleId ParsedModuleId; 150190db26000aefe9335370013eec64c85232d80227Douglas Gregor bool Wildcard = false; 150290db26000aefe9335370013eec64c85232d80227Douglas Gregor do { 150390db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Tok.is(MMToken::Identifier)) { 150490db26000aefe9335370013eec64c85232d80227Douglas Gregor ParsedModuleId.push_back(std::make_pair(Tok.getString(), 150590db26000aefe9335370013eec64c85232d80227Douglas Gregor Tok.getLocation())); 150690db26000aefe9335370013eec64c85232d80227Douglas Gregor consumeToken(); 150790db26000aefe9335370013eec64c85232d80227Douglas Gregor 150890db26000aefe9335370013eec64c85232d80227Douglas Gregor if (Tok.is(MMToken::Period)) { 150990db26000aefe9335370013eec64c85232d80227Douglas Gregor consumeToken(); 151090db26000aefe9335370013eec64c85232d80227Douglas Gregor continue; 151190db26000aefe9335370013eec64c85232d80227Douglas Gregor } 151290db26000aefe9335370013eec64c85232d80227Douglas Gregor 151390db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 151490db26000aefe9335370013eec64c85232d80227Douglas Gregor } 151590db26000aefe9335370013eec64c85232d80227Douglas Gregor 151690db26000aefe9335370013eec64c85232d80227Douglas Gregor if(Tok.is(MMToken::Star)) { 151790db26000aefe9335370013eec64c85232d80227Douglas Gregor Wildcard = true; 15180adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor consumeToken(); 151990db26000aefe9335370013eec64c85232d80227Douglas Gregor break; 152090db26000aefe9335370013eec64c85232d80227Douglas Gregor } 152190db26000aefe9335370013eec64c85232d80227Douglas Gregor 152290db26000aefe9335370013eec64c85232d80227Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_export_module_id); 152390db26000aefe9335370013eec64c85232d80227Douglas Gregor HadError = true; 152490db26000aefe9335370013eec64c85232d80227Douglas Gregor return; 152590db26000aefe9335370013eec64c85232d80227Douglas Gregor } while (true); 152690db26000aefe9335370013eec64c85232d80227Douglas Gregor 152790db26000aefe9335370013eec64c85232d80227Douglas Gregor Module::UnresolvedExportDecl Unresolved = { 152890db26000aefe9335370013eec64c85232d80227Douglas Gregor ExportLoc, ParsedModuleId, Wildcard 152990db26000aefe9335370013eec64c85232d80227Douglas Gregor }; 153090db26000aefe9335370013eec64c85232d80227Douglas Gregor ActiveModule->UnresolvedExports.push_back(Unresolved); 153190db26000aefe9335370013eec64c85232d80227Douglas Gregor} 153290db26000aefe9335370013eec64c85232d80227Douglas Gregor 1533b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor/// \brief Parse a link declaration. 1534b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor/// 1535b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor/// module-declaration: 1536b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor/// 'link' 'framework'[opt] string-literal 1537b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregorvoid ModuleMapParser::parseLinkDecl() { 1538b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor assert(Tok.is(MMToken::LinkKeyword)); 1539b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor SourceLocation LinkLoc = consumeToken(); 1540b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 1541b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor // Parse the optional 'framework' keyword. 1542b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor bool IsFramework = false; 1543b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor if (Tok.is(MMToken::FrameworkKeyword)) { 1544b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor consumeToken(); 1545b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor IsFramework = true; 1546b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor } 1547b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 1548b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor // Parse the library name 1549b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor if (!Tok.is(MMToken::StringLiteral)) { 1550b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_library_name) 1551b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor << IsFramework << SourceRange(LinkLoc); 1552b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor HadError = true; 1553b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor return; 1554b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor } 1555b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 1556b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor std::string LibraryName = Tok.getString(); 1557b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor consumeToken(); 1558b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName, 1559b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor IsFramework)); 1560b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor} 1561b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 156263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// \brief Parse a configuration macro declaration. 156363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// 156463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// module-declaration: 156563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// 'config_macros' attributes[opt] config-macro-list? 156663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// 156763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// config-macro-list: 156863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor/// identifier (',' identifier)? 156963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregorvoid ModuleMapParser::parseConfigMacros() { 157063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor assert(Tok.is(MMToken::ConfigMacros)); 157163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor SourceLocation ConfigMacrosLoc = consumeToken(); 157263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 157363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // Only top-level modules can have configuration macros. 157463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (ActiveModule->Parent) { 157563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Diags.Report(ConfigMacrosLoc, diag::err_mmap_config_macro_submodule); 157663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 157763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 157863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // Parse the optional attributes. 157963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Attributes Attrs; 158063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor parseOptionalAttributes(Attrs); 158163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (Attrs.IsExhaustive && !ActiveModule->Parent) { 158263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor ActiveModule->ConfigMacrosExhaustive = true; 158363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 158463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 158563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If we don't have an identifier, we're done. 158663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (!Tok.is(MMToken::Identifier)) 158763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor return; 158863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 158963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // Consume the first identifier. 159063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (!ActiveModule->Parent) { 159163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor ActiveModule->ConfigMacros.push_back(Tok.getString().str()); 159263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 159363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor consumeToken(); 159463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 159563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor do { 159663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // If there's a comma, consume it. 159763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (!Tok.is(MMToken::Comma)) 159863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor break; 159963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor consumeToken(); 160063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 160163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // We expect to see a macro name here. 160263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (!Tok.is(MMToken::Identifier)) { 160363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_config_macro); 160463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor break; 160563a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 160663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 160763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor // Consume the macro name. 160863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor if (!ActiveModule->Parent) { 160963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor ActiveModule->ConfigMacros.push_back(Tok.getString().str()); 161063a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } 161163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor consumeToken(); 161263a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor } while (true); 161363a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor} 161463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 1615906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor/// \brief Format a module-id into a string. 1616906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregorstatic std::string formatModuleId(const ModuleId &Id) { 1617906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor std::string result; 1618906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor { 1619906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor llvm::raw_string_ostream OS(result); 1620906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 1621906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor for (unsigned I = 0, N = Id.size(); I != N; ++I) { 1622906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor if (I) 1623906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor OS << "."; 1624906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor OS << Id[I].first; 1625906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor } 1626906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor } 1627906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 1628906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor return result; 1629906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor} 1630906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 1631906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor/// \brief Parse a conflict declaration. 1632906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor/// 1633906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor/// module-declaration: 1634906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor/// 'conflict' module-id ',' string-literal 1635906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregorvoid ModuleMapParser::parseConflict() { 1636906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor assert(Tok.is(MMToken::Conflict)); 1637906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor SourceLocation ConflictLoc = consumeToken(); 1638906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Module::UnresolvedConflict Conflict; 1639906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 1640906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor // Parse the module-id. 1641906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor if (parseModuleId(Conflict.Id)) 1642906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor return; 1643906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 1644906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor // Parse the ','. 1645906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor if (!Tok.is(MMToken::Comma)) { 1646906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_comma) 1647906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor << SourceRange(ConflictLoc); 1648906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor return; 1649906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor } 1650906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor consumeToken(); 1651906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 1652906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor // Parse the message. 1653906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor if (!Tok.is(MMToken::StringLiteral)) { 1654906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_message) 1655906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor << formatModuleId(Conflict.Id); 1656906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor return; 1657906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor } 1658906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor Conflict.Message = Tok.getString().str(); 1659906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor consumeToken(); 1660906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 1661906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor // Add this unresolved conflict. 1662906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor ActiveModule->UnresolvedConflicts.push_back(Conflict); 1663906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor} 1664906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor 1665b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor/// \brief Parse an inferred module declaration (wildcard modules). 166682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 166782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// module-declaration: 166882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 'explicit'[opt] 'framework'[opt] 'module' * attributes[opt] 166982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// { inferred-module-member* } 167082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 167182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// inferred-module-member: 167282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 'export' '*' 167382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 'exclude' identifier 167482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregorvoid ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) { 16751e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor assert(Tok.is(MMToken::Star)); 16761e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor SourceLocation StarLoc = consumeToken(); 16771e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor bool Failed = false; 167882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 16791e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Inferred modules must be submodules. 168082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!ActiveModule && !Framework) { 16811e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule); 16821e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Failed = true; 16831e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 168482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 168582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (ActiveModule) { 168682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Inferred modules must have umbrella directories. 168782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!Failed && !ActiveModule->getUmbrellaDir()) { 168882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella); 168982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Failed = true; 169082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 169182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 169282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Check for redefinition of an inferred module. 169382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!Failed && ActiveModule->InferSubmodules) { 169482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(StarLoc, diag::err_mmap_inferred_redef); 169582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (ActiveModule->InferredSubmoduleLoc.isValid()) 169682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(ActiveModule->InferredSubmoduleLoc, 169782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor diag::note_mmap_prev_definition); 169882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Failed = true; 169982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 170082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 170182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Check for the 'framework' keyword, which is not permitted here. 170282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (Framework) { 170382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule); 170482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Framework = false; 170582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 170682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } else if (Explicit) { 170782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework); 170882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Explicit = false; 17091e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 171082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 17111e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // If there were any problems with this inferred submodule, skip its body. 17121e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Failed) { 17131e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::LBrace)) { 17141e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 17151e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor skipUntil(MMToken::RBrace); 17161e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::RBrace)) 17171e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 17181e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 17191e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor HadError = true; 17201e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor return; 17211e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 172282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 172382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Parse optional attributes. 1724ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendling Attributes Attrs; 172582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor parseOptionalAttributes(Attrs); 172682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 172782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (ActiveModule) { 172882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Note that we have an inferred submodule. 172982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor ActiveModule->InferSubmodules = true; 173082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor ActiveModule->InferredSubmoduleLoc = StarLoc; 173182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor ActiveModule->InferExplicitSubmodules = Explicit; 173282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } else { 173382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // We'll be inferring framework modules for this directory. 173482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Map.InferredDirectories[Directory].InferModules = true; 173582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Map.InferredDirectories[Directory].InferSystemModules = Attrs.IsSystem; 173682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 173782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 17381e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Parse the opening brace. 17391e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (!Tok.is(MMToken::LBrace)) { 17401e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard); 17411e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor HadError = true; 17421e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor return; 17431e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 17441e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor SourceLocation LBraceLoc = consumeToken(); 17451e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 17461e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor // Parse the body of the inferred submodule. 17471e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor bool Done = false; 17481e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor do { 17491e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor switch (Tok.Kind) { 17501e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::EndOfFile: 17511e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::RBrace: 17521e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Done = true; 17531e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor break; 175482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 175582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor case MMToken::ExcludeKeyword: { 175682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (ActiveModule) { 175782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 1758b7ac5ac3faf70146707683a2ae041e8d53c3562aDouglas Gregor << (ActiveModule != 0); 175982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor consumeToken(); 176082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor break; 176182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 176282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 176382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor consumeToken(); 176482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!Tok.is(MMToken::Identifier)) { 176582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name); 176682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor break; 176782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 176882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 176982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Map.InferredDirectories[Directory].ExcludedModules 177082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor .push_back(Tok.getString()); 177182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor consumeToken(); 177282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor break; 177382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 177482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 177582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor case MMToken::ExportKeyword: 177682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!ActiveModule) { 177782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 1778b7ac5ac3faf70146707683a2ae041e8d53c3562aDouglas Gregor << (ActiveModule != 0); 177982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor consumeToken(); 178082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor break; 178182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 178282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 17831e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 17841e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::Star)) 1785ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor ActiveModule->InferExportWildcard = true; 17861e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor else 17871e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(Tok.getLocation(), 17881e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor diag::err_mmap_expected_export_wildcard); 17891e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 17901e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor break; 179182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 17921e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::ExplicitKeyword: 17931e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::ModuleKeyword: 17941e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::HeaderKeyword: 17951e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor case MMToken::UmbrellaKeyword: 17961e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor default: 179782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member) 1798b7ac5ac3faf70146707683a2ae041e8d53c3562aDouglas Gregor << (ActiveModule != 0); 17991e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 18001e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor break; 18011e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 18021e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } while (!Done); 18031e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 18041e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor if (Tok.is(MMToken::RBrace)) 18051e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor consumeToken(); 18061e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor else { 18071e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace); 18081e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match); 18091e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor HadError = true; 18101e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 18111e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor} 18121e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 181382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// \brief Parse optional attributes. 181482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 181582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// attributes: 181682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// attribute attributes 181782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// attribute 181882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 181982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// attribute: 182082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// [ identifier ] 182182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 182282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// \param Attrs Will be filled in with the parsed attributes. 182382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// 182482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor/// \returns true if an error occurred, false otherwise. 1825ad017fa7a4df7389d245d02a49b3c79ed70bedb9Bill Wendlingbool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) { 182682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor bool HadError = false; 182782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 182882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor while (Tok.is(MMToken::LSquare)) { 182982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Consume the '['. 183082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor SourceLocation LSquareLoc = consumeToken(); 183182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 183282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Check whether we have an attribute name here. 183382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!Tok.is(MMToken::Identifier)) { 183482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute); 183582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor skipUntil(MMToken::RSquare); 183682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (Tok.is(MMToken::RSquare)) 183782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor consumeToken(); 183882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor HadError = true; 183982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 184082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 184182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Decode the attribute name. 184282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor AttributeKind Attribute 184382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor = llvm::StringSwitch<AttributeKind>(Tok.getString()) 184463a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor .Case("exhaustive", AT_exhaustive) 184582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor .Case("system", AT_system) 184682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor .Default(AT_unknown); 184782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor switch (Attribute) { 184882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor case AT_unknown: 184982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute) 185082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor << Tok.getString(); 185182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor break; 185282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 185382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor case AT_system: 185482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Attrs.IsSystem = true; 185582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor break; 185663a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor 185763a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor case AT_exhaustive: 185863a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor Attrs.IsExhaustive = true; 185963a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor break; 186082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 186182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor consumeToken(); 186282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 186382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor // Consume the ']'. 186482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (!Tok.is(MMToken::RSquare)) { 186582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare); 186682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match); 186782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor skipUntil(MMToken::RSquare); 186882e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor HadError = true; 186982e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 187082e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 187182e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor if (Tok.is(MMToken::RSquare)) 187282e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor consumeToken(); 187382e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor } 187482e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 187582e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor return HadError; 187682e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor} 187782e52377bd76ed71e8c09edc5f2f452e388b16adDouglas Gregor 18786a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor/// \brief If there is a specific header search directory due the presence 18796a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor/// of an umbrella directory, retrieve that directory. Otherwise, returns null. 18806a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregorconst DirectoryEntry *ModuleMapParser::getOverriddenHeaderSearchDir() { 18816a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor for (Module *Mod = ActiveModule; Mod; Mod = Mod->Parent) { 18826a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor // If we have an umbrella directory, use that. 18836a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor if (Mod->hasUmbrellaDir()) 18846a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor return Mod->getUmbrellaDir(); 18856a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor 18866a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor // If we have a framework directory, stop looking. 18876a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor if (Mod->IsFramework) 18886a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor return 0; 18896a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor } 18906a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor 18916a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor return 0; 18926a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor} 18936a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor 1894a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a module map file. 1895a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// 1896a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-map-file: 1897a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// module-declaration* 1898a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorbool ModuleMapParser::parseModuleMapFile() { 1899a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor do { 1900a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor switch (Tok.Kind) { 1901a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::EndOfFile: 1902a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return HadError; 1903a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1904587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor case MMToken::ExplicitKeyword: 1905a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::ModuleKeyword: 1906a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor case MMToken::FrameworkKeyword: 1907a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor parseModuleDecl(); 1908a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1909b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor 191051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor case MMToken::Comma: 191163a726870b486e0470c3a4b11cf62bab8be00b73Douglas Gregor case MMToken::ConfigMacros: 1912906d66acc5cf2679453e10a4f0a67feedd765b21Douglas Gregor case MMToken::Conflict: 19132b49d1f0ad790a8a5d514af1be211591a746cb73Douglas Gregor case MMToken::ExcludeKeyword: 191490db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::ExportKeyword: 1915a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::HeaderKeyword: 1916a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::Identifier: 1917a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::LBrace: 1918b6cbe517237c3c223beb064d60d5b49e56d65c06Douglas Gregor case MMToken::LinkKeyword: 1919a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case MMToken::LSquare: 192090db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::Period: 1921a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::RBrace: 1922a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor case MMToken::RSquare: 192351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor case MMToken::RequiresKeyword: 192490db26000aefe9335370013eec64c85232d80227Douglas Gregor case MMToken::Star: 1925a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::StringLiteral: 1926a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor case MMToken::UmbrellaKeyword: 1927a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module); 1928a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor HadError = true; 1929a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor consumeToken(); 1930a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor break; 1931a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } 1932a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor } while (true); 1933a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 1934a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1935a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorbool ModuleMap::parseModuleMapFile(const FileEntry *File) { 19367005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor llvm::DenseMap<const FileEntry *, bool>::iterator Known 19377005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor = ParsedModuleMap.find(File); 19387005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor if (Known != ParsedModuleMap.end()) 19397005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor return Known->second; 19407005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor 1941dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor assert(Target != 0 && "Missing target information"); 1942a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor FileID ID = SourceMgr->createFileID(File, SourceLocation(), SrcMgr::C_User); 1943a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor const llvm::MemoryBuffer *Buffer = SourceMgr->getBuffer(ID); 1944a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor if (!Buffer) 19457005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor return ParsedModuleMap[File] = true; 1946a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor 1947a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor // Parse this module map file. 194851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Lexer L(ID, SourceMgr->getBuffer(ID), *SourceMgr, MMapLangOpts); 194951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor Diags->getClient()->BeginSourceFile(MMapLangOpts); 19509a022bb007a3e77e1ac1330f955a239cfb1dd0fbDouglas Gregor ModuleMapParser Parser(L, *SourceMgr, Target, *Diags, *this, File->getDir(), 19512f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor BuiltinIncludeDir); 1952a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor bool Result = Parser.parseModuleMapFile(); 1953a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor Diags->getClient()->EndSourceFile(); 19547005b907ea159c8e74e81f85269777429bc18d3cDouglas Gregor ParsedModuleMap[File] = Result; 1955a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor return Result; 1956a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor} 1957