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