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 &Map;
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(&LToken, 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