ModuleMap.cpp revision f7ccbad5d9949e7ddd1cbef43d482553b811e026
1a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//===--- ModuleMap.cpp - Describe the layout of modules ---------*- C++ -*-===//
2a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//
3a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//                     The LLVM Compiler Infrastructure
4a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//
5a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// This file is distributed under the University of Illinois Open Source
6a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// License. See LICENSE.TXT for details.
7a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//
8a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//===----------------------------------------------------------------------===//
9a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//
10a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// This file defines the ModuleMap implementation, which describes the layout
11a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// of a module as it relates to headers.
12a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//
13a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//===----------------------------------------------------------------------===//
14a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Lex/ModuleMap.h"
15a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Lex/Lexer.h"
16a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Lex/LiteralSupport.h"
17a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Lex/LexDiagnostic.h"
18a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/Diagnostic.h"
19a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/FileManager.h"
20a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/TargetInfo.h"
21a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "clang/Basic/TargetOptions.h"
22a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/Allocator.h"
23ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor#include "llvm/Support/FileSystem.h"
24a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/Host.h"
258b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor#include "llvm/Support/PathV2.h"
26a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/raw_ostream.h"
27a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/ADT/StringRef.h"
28a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/ADT/StringSwitch.h"
29a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorusing namespace clang;
30a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
3190db26000aefe9335370013eec64c85232d80227Douglas GregorModule::ExportDecl
3290db26000aefe9335370013eec64c85232d80227Douglas GregorModuleMap::resolveExport(Module *Mod,
3390db26000aefe9335370013eec64c85232d80227Douglas Gregor                         const Module::UnresolvedExportDecl &Unresolved,
3490db26000aefe9335370013eec64c85232d80227Douglas Gregor                         bool Complain) {
350adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor  // We may have just a wildcard.
360adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor  if (Unresolved.Id.empty()) {
370adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    assert(Unresolved.Wildcard && "Invalid unresolved export");
380adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    return Module::ExportDecl(0, true);
390adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor  }
400adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor
4190db26000aefe9335370013eec64c85232d80227Douglas Gregor  // Find the starting module.
4290db26000aefe9335370013eec64c85232d80227Douglas Gregor  Module *Context = lookupModuleUnqualified(Unresolved.Id[0].first, Mod);
4390db26000aefe9335370013eec64c85232d80227Douglas Gregor  if (!Context) {
4490db26000aefe9335370013eec64c85232d80227Douglas Gregor    if (Complain)
4590db26000aefe9335370013eec64c85232d80227Douglas Gregor      Diags->Report(Unresolved.Id[0].second,
4690db26000aefe9335370013eec64c85232d80227Douglas Gregor                    diag::err_mmap_missing_module_unqualified)
4790db26000aefe9335370013eec64c85232d80227Douglas Gregor        << Unresolved.Id[0].first << Mod->getFullModuleName();
4890db26000aefe9335370013eec64c85232d80227Douglas Gregor
4990db26000aefe9335370013eec64c85232d80227Douglas Gregor    return Module::ExportDecl();
5090db26000aefe9335370013eec64c85232d80227Douglas Gregor  }
5190db26000aefe9335370013eec64c85232d80227Douglas Gregor
5290db26000aefe9335370013eec64c85232d80227Douglas Gregor  // Dig into the module path.
5390db26000aefe9335370013eec64c85232d80227Douglas Gregor  for (unsigned I = 1, N = Unresolved.Id.size(); I != N; ++I) {
5490db26000aefe9335370013eec64c85232d80227Douglas Gregor    Module *Sub = lookupModuleQualified(Unresolved.Id[I].first,
5590db26000aefe9335370013eec64c85232d80227Douglas Gregor                                        Context);
5690db26000aefe9335370013eec64c85232d80227Douglas Gregor    if (!Sub) {
5790db26000aefe9335370013eec64c85232d80227Douglas Gregor      if (Complain)
5890db26000aefe9335370013eec64c85232d80227Douglas Gregor        Diags->Report(Unresolved.Id[I].second,
5990db26000aefe9335370013eec64c85232d80227Douglas Gregor                      diag::err_mmap_missing_module_qualified)
6090db26000aefe9335370013eec64c85232d80227Douglas Gregor          << Unresolved.Id[I].first << Context->getFullModuleName()
6190db26000aefe9335370013eec64c85232d80227Douglas Gregor          << SourceRange(Unresolved.Id[0].second, Unresolved.Id[I-1].second);
6290db26000aefe9335370013eec64c85232d80227Douglas Gregor
6390db26000aefe9335370013eec64c85232d80227Douglas Gregor      return Module::ExportDecl();
6490db26000aefe9335370013eec64c85232d80227Douglas Gregor    }
6590db26000aefe9335370013eec64c85232d80227Douglas Gregor
6690db26000aefe9335370013eec64c85232d80227Douglas Gregor    Context = Sub;
6790db26000aefe9335370013eec64c85232d80227Douglas Gregor  }
6890db26000aefe9335370013eec64c85232d80227Douglas Gregor
6990db26000aefe9335370013eec64c85232d80227Douglas Gregor  return Module::ExportDecl(Context, Unresolved.Wildcard);
7090db26000aefe9335370013eec64c85232d80227Douglas Gregor}
7190db26000aefe9335370013eec64c85232d80227Douglas Gregor
7251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas GregorModuleMap::ModuleMap(FileManager &FileMgr, const DiagnosticConsumer &DC,
73dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor                     const LangOptions &LangOpts, const TargetInfo *Target)
742f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor  : LangOpts(LangOpts), Target(Target), BuiltinIncludeDir(0)
7551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor{
76a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs);
77a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Diags = llvm::IntrusiveRefCntPtr<DiagnosticsEngine>(
78a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor            new DiagnosticsEngine(DiagIDs));
79a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Diags->setClient(DC.clone(*Diags), /*ShouldOwnClient=*/true);
80a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceMgr = new SourceManager(*Diags, FileMgr);
81a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
82a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
83a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorModuleMap::~ModuleMap() {
8409fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor  for (llvm::StringMap<Module *>::iterator I = Modules.begin(),
8509fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor                                        IEnd = Modules.end();
8609fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor       I != IEnd; ++I) {
8709fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor    delete I->getValue();
8809fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor  }
8909fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor
90a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  delete SourceMgr;
91a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
92a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
93dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregorvoid ModuleMap::setTarget(const TargetInfo &Target) {
94dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor  assert((!this->Target || this->Target == &Target) &&
95dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor         "Improper target override");
96dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor  this->Target = &Target;
97dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor}
98dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor
991a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *ModuleMap::findModuleForHeader(const FileEntry *File) {
10065f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor  llvm::DenseMap<const FileEntry *, Module *>::iterator Known
10165f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor    = Headers.find(File);
10251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  if (Known != Headers.end()) {
10351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    // If a header corresponds to an unavailable module, don't report
10451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    // that it maps to anything.
10551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    if (!Known->second->isAvailable())
10651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      return 0;
10751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
10865f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor    return Known->second;
10951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  }
11065f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor
111adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor  const DirectoryEntry *Dir = File->getDir();
112adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor  llvm::SmallVector<const DirectoryEntry *, 2> SkippedDirs;
113adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor  StringRef DirName = Dir->getName();
114e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
115e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  // Keep walking up the directory hierarchy, looking for a directory with
116e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  // an umbrella header.
117e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  do {
118e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor    llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir
119e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      = UmbrellaDirs.find(Dir);
120adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    if (KnownDir != UmbrellaDirs.end()) {
121adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor      Module *Result = KnownDir->second;
1229f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor
1239f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor      // Search up the module stack until we find a module with an umbrella
12410694cee2588442bee1e717f5042c58ffee25279Douglas Gregor      // directory.
1259f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor      Module *UmbrellaModule = Result;
12610694cee2588442bee1e717f5042c58ffee25279Douglas Gregor      while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
1279f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor        UmbrellaModule = UmbrellaModule->Parent;
12851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
1299f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor      if (UmbrellaModule->InferSubmodules) {
130e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // Infer submodules for each of the directories we found between
131e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // the directory of the umbrella header and the directory where
132e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // the actual header is located.
13323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor        bool Explicit = UmbrellaModule->InferExplicitSubmodules;
134e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
1356a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor        for (unsigned I = SkippedDirs.size(); I != 0; --I) {
136e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          // Find or create the module that corresponds to this directory name.
137e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          StringRef Name = llvm::sys::path::stem(SkippedDirs[I-1]->getName());
138e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
13923af6d58e392e18ae2946b799264717f480e6596Douglas Gregor                                      Explicit).first;
140e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
141e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          // Associate the module and the directory.
142e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          UmbrellaDirs[SkippedDirs[I-1]] = Result;
143e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
144e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          // If inferred submodules export everything they import, add a
145e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          // wildcard to the set of exports.
1469f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor          if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
147e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor            Result->Exports.push_back(Module::ExportDecl(0, true));
148e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        }
149e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
150e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // Infer a submodule with the same name as this header file.
151e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        StringRef Name = llvm::sys::path::stem(File->getName());
152e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
15323af6d58e392e18ae2946b799264717f480e6596Douglas Gregor                                    Explicit).first;
154e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
155e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // If inferred submodules export everything they import, add a
156e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // wildcard to the set of exports.
1579f74f4f05c407b59f7639606bb0f4ec377b4e126Douglas Gregor        if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
158e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          Result->Exports.push_back(Module::ExportDecl(0, true));
159e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      } else {
160e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // Record each of the directories we stepped through as being part of
161e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        // the module we found, since the umbrella header covers them all.
162e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor        for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I)
163e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor          UmbrellaDirs[SkippedDirs[I]] = Result;
164e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      }
165adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor
166e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      Headers[File] = Result;
16751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
16851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      // If a header corresponds to an unavailable module, don't report
16951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      // that it maps to anything.
17051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      if (!Result->isAvailable())
17151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor        return 0;
17251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
173adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor      return Result;
174adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    }
175adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor
176adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    SkippedDirs.push_back(Dir);
177e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
178e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor    // Retrieve our parent path.
179e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor    DirName = llvm::sys::path::parent_path(DirName);
180e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor    if (DirName.empty())
181e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      break;
182e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
183e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor    // Resolve the parent path to a directory entry.
184e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor    Dir = SourceMgr->getFileManager().getDirectory(DirName);
185e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  } while (Dir);
186adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor
18765f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor  return 0;
18865f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor}
18965f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor
19051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregorbool ModuleMap::isHeaderInUnavailableModule(const FileEntry *Header) {
19151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  llvm::DenseMap<const FileEntry *, Module *>::iterator Known
19251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    = Headers.find(Header);
19351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  if (Known != Headers.end())
19451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    return !Known->second->isAvailable();
19551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
19651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  const DirectoryEntry *Dir = Header->getDir();
19751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  llvm::SmallVector<const DirectoryEntry *, 2> SkippedDirs;
19851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  StringRef DirName = Dir->getName();
19951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
20051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  // Keep walking up the directory hierarchy, looking for a directory with
20151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  // an umbrella header.
20251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  do {
20351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir
20451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      = UmbrellaDirs.find(Dir);
20551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    if (KnownDir != UmbrellaDirs.end()) {
20651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      Module *Found = KnownDir->second;
20751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      if (!Found->isAvailable())
20851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor        return true;
20951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
21051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      // Search up the module stack until we find a module with an umbrella
21151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      // directory.
21251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      Module *UmbrellaModule = Found;
21351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
21451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor        UmbrellaModule = UmbrellaModule->Parent;
21551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
21651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      if (UmbrellaModule->InferSubmodules) {
21751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor        for (unsigned I = SkippedDirs.size(); I != 0; --I) {
21851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor          // Find or create the module that corresponds to this directory name.
21951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor          StringRef Name = llvm::sys::path::stem(SkippedDirs[I-1]->getName());
22051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor          Found = lookupModuleQualified(Name, Found);
22151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor          if (!Found)
22251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor            return false;
22351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor          if (!Found->isAvailable())
22451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor            return true;
22551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor        }
22651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
22751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor        // Infer a submodule with the same name as this header file.
22851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor        StringRef Name = llvm::sys::path::stem(Header->getName());
22951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor        Found = lookupModuleQualified(Name, Found);
23051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor        if (!Found)
23151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor          return false;
23251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      }
23351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
23451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      return !Found->isAvailable();
23551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    }
23651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
23751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    SkippedDirs.push_back(Dir);
23851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
23951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    // Retrieve our parent path.
24051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    DirName = llvm::sys::path::parent_path(DirName);
24151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    if (DirName.empty())
24251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      break;
24351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
24451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    // Resolve the parent path to a directory entry.
24551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    Dir = SourceMgr->getFileManager().getDirectory(DirName);
24651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  } while (Dir);
24751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
24851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  return false;
24951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor}
25051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
2511a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *ModuleMap::findModule(StringRef Name) {
252484535e45b4d301847a157e943c7823da5d40884Douglas Gregor  llvm::StringMap<Module *>::iterator Known = Modules.find(Name);
253484535e45b4d301847a157e943c7823da5d40884Douglas Gregor  if (Known != Modules.end())
254484535e45b4d301847a157e943c7823da5d40884Douglas Gregor    return Known->getValue();
255484535e45b4d301847a157e943c7823da5d40884Douglas Gregor
256484535e45b4d301847a157e943c7823da5d40884Douglas Gregor  return 0;
257484535e45b4d301847a157e943c7823da5d40884Douglas Gregor}
258484535e45b4d301847a157e943c7823da5d40884Douglas Gregor
25990db26000aefe9335370013eec64c85232d80227Douglas GregorModule *ModuleMap::lookupModuleUnqualified(StringRef Name, Module *Context) {
26090db26000aefe9335370013eec64c85232d80227Douglas Gregor  for(; Context; Context = Context->Parent) {
26190db26000aefe9335370013eec64c85232d80227Douglas Gregor    if (Module *Sub = lookupModuleQualified(Name, Context))
26290db26000aefe9335370013eec64c85232d80227Douglas Gregor      return Sub;
26390db26000aefe9335370013eec64c85232d80227Douglas Gregor  }
26490db26000aefe9335370013eec64c85232d80227Douglas Gregor
26590db26000aefe9335370013eec64c85232d80227Douglas Gregor  return findModule(Name);
26690db26000aefe9335370013eec64c85232d80227Douglas Gregor}
26790db26000aefe9335370013eec64c85232d80227Douglas Gregor
26890db26000aefe9335370013eec64c85232d80227Douglas GregorModule *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) {
26990db26000aefe9335370013eec64c85232d80227Douglas Gregor  if (!Context)
27090db26000aefe9335370013eec64c85232d80227Douglas Gregor    return findModule(Name);
27190db26000aefe9335370013eec64c85232d80227Douglas Gregor
272b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor  return Context->findSubmodule(Name);
27390db26000aefe9335370013eec64c85232d80227Douglas Gregor}
27490db26000aefe9335370013eec64c85232d80227Douglas Gregor
2751a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorstd::pair<Module *, bool>
276392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework,
277392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor                              bool IsExplicit) {
278392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  // Try to find an existing module with this name.
279b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor  if (Module *Sub = lookupModuleQualified(Name, Parent))
280b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor    return std::make_pair(Sub, false);
281392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
282392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  // Create a new module with this name.
283392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework,
284392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor                              IsExplicit);
285b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor  if (!Parent)
286392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    Modules[Name] = Result;
287392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  return std::make_pair(Result, true);
288392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor}
289392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
2901a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *
2912821c7f8870629b56b9c41e1c50c7a091edd544dDouglas GregorModuleMap::inferFrameworkModule(StringRef ModuleName,
292ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor                                const DirectoryEntry *FrameworkDir,
293a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor                                bool IsSystem,
294ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor                                Module *Parent) {
2952821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // Check whether we've already found this module.
296ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  if (Module *Mod = lookupModuleQualified(ModuleName, Parent))
297ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor    return Mod;
298ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor
299ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  FileManager &FileMgr = SourceMgr->getFileManager();
3002821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor
3012821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // Look for an umbrella header.
302f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName());
3032821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  llvm::sys::path::append(UmbrellaName, "Headers");
3042821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  llvm::sys::path::append(UmbrellaName, ModuleName + ".h");
305ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName);
3062821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor
3072821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // FIXME: If there's no umbrella header, we could probably scan the
3082821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // framework to load *everything*. But, it's not clear that this is a good
3092821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // idea.
3102821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  if (!UmbrellaHeader)
3112821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor    return 0;
3122821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor
313ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  Module *Result = new Module(ModuleName, SourceLocation(), Parent,
314ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor                              /*IsFramework=*/true, /*IsExplicit=*/false);
315a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  if (IsSystem)
316a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    Result->IsSystem = IsSystem;
317a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
318b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor  if (!Parent)
319ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor    Modules[ModuleName] = Result;
320b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor
321489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor  // umbrella header "umbrella-header-name"
32210694cee2588442bee1e717f5042c58ffee25279Douglas Gregor  Result->Umbrella = UmbrellaHeader;
3232821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  Headers[UmbrellaHeader] = Result;
3243cee31e4d7c23d3d5d0b8927998577b9f75087d7Douglas Gregor  UmbrellaDirs[UmbrellaHeader->getDir()] = Result;
325209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor
326209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor  // export *
327209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor  Result->Exports.push_back(Module::ExportDecl(0, true));
328209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor
329e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  // module * { export * }
330e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  Result->InferSubmodules = true;
331e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  Result->InferExportWildcard = true;
332e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
333ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  // Look for subframeworks.
334ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  llvm::error_code EC;
335f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<128> SubframeworksDirName
33652b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor    = StringRef(FrameworkDir->getName());
337ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  llvm::sys::path::append(SubframeworksDirName, "Frameworks");
338f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<128> SubframeworksDirNameNative;
33952b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor  llvm::sys::path::native(SubframeworksDirName.str(),
34052b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor                          SubframeworksDirNameNative);
34152b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor  for (llvm::sys::fs::directory_iterator
34252b1ed3685c80cb436f2a616c3c13a066f9d1e31Douglas Gregor         Dir(SubframeworksDirNameNative.str(), EC), DirEnd;
343ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor       Dir != DirEnd && !EC; Dir.increment(EC)) {
344ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor    if (!StringRef(Dir->path()).endswith(".framework"))
345ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor      continue;
346ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor
347ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor    if (const DirectoryEntry *SubframeworkDir
348ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor          = FileMgr.getDirectory(Dir->path())) {
349ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor      // FIXME: Do we want to warn about subframeworks without umbrella headers?
350ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor      inferFrameworkModule(llvm::sys::path::stem(Dir->path()), SubframeworkDir,
351a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor                           IsSystem, Result);
352ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor    }
353ac252a3b0f8101a7274309e4a5cf2d5f0fdba675Douglas Gregor  }
3543a110f75acafc992cb664200cebec90520986715Douglas Gregor
3552821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  return Result;
3562821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor}
3572821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor
358e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregorvoid ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader){
359e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  Headers[UmbrellaHeader] = Mod;
36010694cee2588442bee1e717f5042c58ffee25279Douglas Gregor  Mod->Umbrella = UmbrellaHeader;
3616a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor  UmbrellaDirs[UmbrellaHeader->getDir()] = Mod;
362e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor}
363e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
36477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregorvoid ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir) {
36577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  Mod->Umbrella = UmbrellaDir;
36677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  UmbrellaDirs[UmbrellaDir] = Mod;
36777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor}
36877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor
369e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregorvoid ModuleMap::addHeader(Module *Mod, const FileEntry *Header) {
370e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  Mod->Headers.push_back(Header);
371e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor  Headers[Header] = Mod;
372e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor}
373e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor
374f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregorconst FileEntry *
3751a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModuleMap::getContainingModuleMapFile(Module *Module) {
376f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor  if (Module->DefinitionLoc.isInvalid() || !SourceMgr)
377f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor    return 0;
378f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor
379f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor  return SourceMgr->getFileEntryForID(
380f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor           SourceMgr->getFileID(Module->DefinitionLoc));
381f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor}
382f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor
383a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMap::dump() {
384a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  llvm::errs() << "Modules:";
385a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  for (llvm::StringMap<Module *>::iterator M = Modules.begin(),
386a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                                        MEnd = Modules.end();
387a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor       M != MEnd; ++M)
388804c3bfee22076f232dddf4839439119cfdee2b6Douglas Gregor    M->getValue()->print(llvm::errs(), 2);
389a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
390a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  llvm::errs() << "Headers:";
391a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  for (llvm::DenseMap<const FileEntry *, Module *>::iterator
392a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor            H = Headers.begin(),
393a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor         HEnd = Headers.end();
394a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor       H != HEnd; ++H) {
395a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    llvm::errs() << "  \"" << H->first->getName() << "\" -> "
396a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 << H->second->getFullModuleName() << "\n";
397a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
398a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
399a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
40090db26000aefe9335370013eec64c85232d80227Douglas Gregorbool ModuleMap::resolveExports(Module *Mod, bool Complain) {
40190db26000aefe9335370013eec64c85232d80227Douglas Gregor  bool HadError = false;
40290db26000aefe9335370013eec64c85232d80227Douglas Gregor  for (unsigned I = 0, N = Mod->UnresolvedExports.size(); I != N; ++I) {
40390db26000aefe9335370013eec64c85232d80227Douglas Gregor    Module::ExportDecl Export = resolveExport(Mod, Mod->UnresolvedExports[I],
40490db26000aefe9335370013eec64c85232d80227Douglas Gregor                                              Complain);
4050adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    if (Export.getPointer() || Export.getInt())
40690db26000aefe9335370013eec64c85232d80227Douglas Gregor      Mod->Exports.push_back(Export);
40790db26000aefe9335370013eec64c85232d80227Douglas Gregor    else
40890db26000aefe9335370013eec64c85232d80227Douglas Gregor      HadError = true;
40990db26000aefe9335370013eec64c85232d80227Douglas Gregor  }
41090db26000aefe9335370013eec64c85232d80227Douglas Gregor  Mod->UnresolvedExports.clear();
41190db26000aefe9335370013eec64c85232d80227Douglas Gregor  return HadError;
41290db26000aefe9335370013eec64c85232d80227Douglas Gregor}
41390db26000aefe9335370013eec64c85232d80227Douglas Gregor
41455988680ece66b8e505ee136b35e74fcb1173aeeDouglas GregorModule *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) {
41555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  if (Loc.isInvalid())
41655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor    return 0;
41755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
41855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  // Use the expansion location to determine which module we're in.
41955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  FullSourceLoc ExpansionLoc = Loc.getExpansionLoc();
42055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  if (!ExpansionLoc.isFileID())
42155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor    return 0;
42255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
42355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
42455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  const SourceManager &SrcMgr = Loc.getManager();
42555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  FileID ExpansionFileID = ExpansionLoc.getFileID();
42655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
427303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor  while (const FileEntry *ExpansionFile
428303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor           = SrcMgr.getFileEntryForID(ExpansionFileID)) {
429303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor    // Find the module that owns this header (if any).
430303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor    if (Module *Mod = findModuleForHeader(ExpansionFile))
431303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor      return Mod;
432303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor
433303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor    // No module owns this header, so look up the inclusion chain to see if
434303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor    // any included header has an associated module.
435303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor    SourceLocation IncludeLoc = SrcMgr.getIncludeLoc(ExpansionFileID);
436303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor    if (IncludeLoc.isInvalid())
437303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor      return 0;
438303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor
439303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor    ExpansionFileID = SrcMgr.getFileID(IncludeLoc);
440303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor  }
441303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor
442303aae98a5a27f2595d023c0b4e1484bf2c0ee57Douglas Gregor  return 0;
44355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor}
44455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
445a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//----------------------------------------------------------------------------//
446a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// Module map file parser
447a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//----------------------------------------------------------------------------//
448a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
449a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregornamespace clang {
450a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  /// \brief A token in a module map file.
451a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  struct MMToken {
452a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    enum TokenKind {
45351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      Comma,
454a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      EndOfFile,
455a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      HeaderKeyword,
456a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Identifier,
457a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      ExplicitKeyword,
45890db26000aefe9335370013eec64c85232d80227Douglas Gregor      ExportKeyword,
459a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor      FrameworkKeyword,
460a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      ModuleKeyword,
46190db26000aefe9335370013eec64c85232d80227Douglas Gregor      Period,
462a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      UmbrellaKeyword,
46351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      RequiresKeyword,
46490db26000aefe9335370013eec64c85232d80227Douglas Gregor      Star,
465a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      StringLiteral,
466a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      LBrace,
467a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      RBrace,
468a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      LSquare,
469a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      RSquare
470a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    } Kind;
471a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
472a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    unsigned Location;
473a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    unsigned StringLength;
474a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    const char *StringData;
475a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
476a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    void clear() {
477a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Kind = EndOfFile;
478a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Location = 0;
479a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      StringLength = 0;
480a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      StringData = 0;
481a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
482a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
483a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    bool is(TokenKind K) const { return Kind == K; }
484a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
485a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    SourceLocation getLocation() const {
486a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      return SourceLocation::getFromRawEncoding(Location);
487a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
488a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
489a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    StringRef getString() const {
490a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      return StringRef(StringData, StringLength);
491a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
492a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  };
493a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
494a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  class ModuleMapParser {
495a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Lexer &L;
496a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    SourceManager &SourceMgr;
497a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    DiagnosticsEngine &Diags;
498a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    ModuleMap &Map;
499a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
5008b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    /// \brief The directory that this module map resides in.
5018b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    const DirectoryEntry *Directory;
5022f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor
5032f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor    /// \brief The directory containing Clang-supplied headers.
5042f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor    const DirectoryEntry *BuiltinIncludeDir;
5052f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor
506a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Whether an error occurred.
507a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    bool HadError;
508a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
509a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Default target information, used only for string literal
510a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// parsing.
511a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    TargetInfo *Target;
512a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
513a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Stores string data for the various string literals referenced
514a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// during parsing.
515a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    llvm::BumpPtrAllocator StringData;
516a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
517a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief The current token.
518a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    MMToken Tok;
519a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
520a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief The active module.
5211a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor    Module *ActiveModule;
522a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
523a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Consume the current token and return its location.
524a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    SourceLocation consumeToken();
525a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
526a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Skip tokens until we reach the a token with the given kind
527a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// (or the end of the file).
528a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    void skipUntil(MMToken::TokenKind K);
529587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
530587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    typedef llvm::SmallVector<std::pair<std::string, SourceLocation>, 2>
531587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      ModuleId;
532587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    bool parseModuleId(ModuleId &Id);
533a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    void parseModuleDecl();
53451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    void parseRequiresDecl();
535489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor    void parseHeaderDecl(SourceLocation UmbrellaLoc);
53677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc);
53790db26000aefe9335370013eec64c85232d80227Douglas Gregor    void parseExportDecl();
5381e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    void parseInferredSubmoduleDecl(bool Explicit);
539a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
5406a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor    const DirectoryEntry *getOverriddenHeaderSearchDir();
5416a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor
542a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  public:
543a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr,
544a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                             DiagnosticsEngine &Diags,
5458b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor                             ModuleMap &Map,
5462f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor                             const DirectoryEntry *Directory,
5472f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor                             const DirectoryEntry *BuiltinIncludeDir)
5488b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      : L(L), SourceMgr(SourceMgr), Diags(Diags), Map(Map),
5492f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor        Directory(Directory), BuiltinIncludeDir(BuiltinIncludeDir),
5502f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor        HadError(false), ActiveModule(0)
551a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    {
552a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      TargetOptions TargetOpts;
553a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      TargetOpts.Triple = llvm::sys::getDefaultTargetTriple();
554a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts);
555a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
556a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Tok.clear();
557a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      consumeToken();
558a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
559a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
560a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    bool parseModuleMapFile();
561a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  };
562a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
563a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
564a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorSourceLocation ModuleMapParser::consumeToken() {
565a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorretry:
566a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceLocation Result = Tok.getLocation();
567a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Tok.clear();
568a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
569a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Token LToken;
570a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  L.LexFromRawLexer(LToken);
571a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Tok.Location = LToken.getLocation().getRawEncoding();
572a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  switch (LToken.getKind()) {
573a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::raw_identifier:
574a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.StringData = LToken.getRawIdentifierData();
575a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.StringLength = LToken.getLength();
576a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(Tok.getString())
577a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Case("header", MMToken::HeaderKeyword)
578a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Case("explicit", MMToken::ExplicitKeyword)
57990db26000aefe9335370013eec64c85232d80227Douglas Gregor                 .Case("export", MMToken::ExportKeyword)
580a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor                 .Case("framework", MMToken::FrameworkKeyword)
581a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Case("module", MMToken::ModuleKeyword)
58251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor                 .Case("requires", MMToken::RequiresKeyword)
583a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Case("umbrella", MMToken::UmbrellaKeyword)
584a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Default(MMToken::Identifier);
585a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
58651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
58751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  case tok::comma:
58851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    Tok.Kind = MMToken::Comma;
58951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    break;
59051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
591a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::eof:
592a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = MMToken::EndOfFile;
593a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
594a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
595a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::l_brace:
596a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = MMToken::LBrace;
597a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
598a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
599a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  case tok::l_square:
600a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    Tok.Kind = MMToken::LSquare;
601a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    break;
602a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
60390db26000aefe9335370013eec64c85232d80227Douglas Gregor  case tok::period:
60490db26000aefe9335370013eec64c85232d80227Douglas Gregor    Tok.Kind = MMToken::Period;
60590db26000aefe9335370013eec64c85232d80227Douglas Gregor    break;
60690db26000aefe9335370013eec64c85232d80227Douglas Gregor
607a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::r_brace:
608a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = MMToken::RBrace;
609a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
610a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
611a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  case tok::r_square:
612a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    Tok.Kind = MMToken::RSquare;
613a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    break;
614a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
61590db26000aefe9335370013eec64c85232d80227Douglas Gregor  case tok::star:
61690db26000aefe9335370013eec64c85232d80227Douglas Gregor    Tok.Kind = MMToken::Star;
61790db26000aefe9335370013eec64c85232d80227Douglas Gregor    break;
61890db26000aefe9335370013eec64c85232d80227Douglas Gregor
619a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::string_literal: {
620a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    // Parse the string literal.
621a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    LangOptions LangOpts;
622a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    StringLiteralParser StringLiteral(&LToken, 1, SourceMgr, LangOpts, *Target);
623a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    if (StringLiteral.hadError)
624a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      goto retry;
625a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
626a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    // Copy the string literal into our string data allocator.
627a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    unsigned Length = StringLiteral.GetStringLength();
628a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    char *Saved = StringData.Allocate<char>(Length + 1);
629a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    memcpy(Saved, StringLiteral.GetString().data(), Length);
630a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Saved[Length] = 0;
631a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
632a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    // Form the token.
633a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = MMToken::StringLiteral;
634a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.StringData = Saved;
635a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.StringLength = Length;
636a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
637a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
638a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
639a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::comment:
640a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    goto retry;
641a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
642a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  default:
643a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token);
644a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
645a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    goto retry;
646a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
647a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
648a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  return Result;
649a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
650a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
651a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::skipUntil(MMToken::TokenKind K) {
652a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  unsigned braceDepth = 0;
653a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  unsigned squareDepth = 0;
654a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  do {
655a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    switch (Tok.Kind) {
656a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::EndOfFile:
657a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      return;
658a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
659a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::LBrace:
660a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
661a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor        return;
662a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
663a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      ++braceDepth;
664a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
665a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
666a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    case MMToken::LSquare:
667a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
668a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor        return;
669a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
670a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      ++squareDepth;
671a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      break;
672a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
673a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::RBrace:
674a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      if (braceDepth > 0)
675a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor        --braceDepth;
676a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      else if (Tok.is(K))
677a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor        return;
678a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
679a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
680a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    case MMToken::RSquare:
681a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      if (squareDepth > 0)
682a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor        --squareDepth;
683a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      else if (Tok.is(K))
684a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor        return;
685a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      break;
686a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
687a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    default:
688a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      if (braceDepth == 0 && squareDepth == 0 && Tok.is(K))
689a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor        return;
690a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
691a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
692a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
693a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor   consumeToken();
694a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  } while (true);
695a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
696a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
697587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// \brief Parse a module-id.
698587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor///
699587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor///   module-id:
700587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor///     identifier
701587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor///     identifier '.' module-id
702587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor///
703587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor/// \returns true if an error occurred, false otherwise.
704587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregorbool ModuleMapParser::parseModuleId(ModuleId &Id) {
705587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  Id.clear();
706587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  do {
707587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    if (Tok.is(MMToken::Identifier)) {
708587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation()));
709587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      consumeToken();
710587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    } else {
711587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name);
712587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      return true;
713587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    }
714587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
715587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    if (!Tok.is(MMToken::Period))
716587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      break;
717587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
718587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    consumeToken();
719587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  } while (true);
720587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
721587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  return false;
722587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor}
723587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
724a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregornamespace {
725a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  /// \brief Enumerates the known attributes.
726a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  enum AttributeKind {
727a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    /// \brief An unknown attribute.
728a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    AT_unknown,
729a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    /// \brief The 'system' attribute.
730a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    AT_system
731a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  };
732a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor}
733a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
734a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a module declaration.
735a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///
736a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///   module-declaration:
737a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor///     'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt]
738a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor///       { module-member* }
739a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor///
740a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor///   attributes:
741a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor///     attribute attributes
742a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor///     attribute
743a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor///
744a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor///   attribute:
745a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor///     [ identifier ]
746a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///
747a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///   module-member:
74851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor///     requires-declaration
749a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///     header-declaration
750587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor///     submodule-declaration
75190db26000aefe9335370013eec64c85232d80227Douglas Gregor///     export-declaration
7521e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor///
7531e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor///   submodule-declaration:
7541e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor///     module-declaration
7551e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor///     inferred-submodule-declaration
756a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::parseModuleDecl() {
757a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) ||
758a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor         Tok.is(MMToken::FrameworkKeyword));
759d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  // Parse 'explicit' or 'framework' keyword, if present.
760587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  SourceLocation ExplicitLoc;
761a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  bool Explicit = false;
762d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  bool Framework = false;
763a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor
764a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  // Parse 'explicit' keyword, if present.
765d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  if (Tok.is(MMToken::ExplicitKeyword)) {
766587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    ExplicitLoc = consumeToken();
767a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Explicit = true;
768a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
769d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor
770d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  // Parse 'framework' keyword, if present.
771d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  if (Tok.is(MMToken::FrameworkKeyword)) {
772d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    consumeToken();
773d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    Framework = true;
774d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  }
775a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
776a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse 'module' keyword.
777a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (!Tok.is(MMToken::ModuleKeyword)) {
778e6fb9876970e2dc55f091522644efa16caa9ba06Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
779a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    consumeToken();
780a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
781a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return;
782a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
783a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  consumeToken(); // 'module' keyword
7841e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
7851e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // If we have a wildcard for the module name, this is an inferred submodule.
7861e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // Parse it.
7871e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  if (Tok.is(MMToken::Star))
7881e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    return parseInferredSubmoduleDecl(Explicit);
789a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
790a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse the module name.
791587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  ModuleId Id;
792587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  if (parseModuleId(Id)) {
793587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    HadError = true;
794587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    return;
795587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  }
796587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
797587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  if (ActiveModule) {
798587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    if (Id.size() > 1) {
799587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id)
800587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        << SourceRange(Id.front().second, Id.back().second);
801587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
802587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      HadError = true;
803587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      return;
804587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    }
805587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  } else if (Id.size() == 1 && Explicit) {
806587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    // Top-level modules can't be explicit.
807587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level);
808587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    Explicit = false;
809587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    ExplicitLoc = SourceLocation();
810a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
811a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
812587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
813587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  Module *PreviousActiveModule = ActiveModule;
814587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  if (Id.size() > 1) {
815587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    // This module map defines a submodule. Go find the module of which it
816587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    // is a submodule.
817587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    ActiveModule = 0;
818587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) {
819587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) {
820587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        ActiveModule = Next;
821587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        continue;
822587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      }
823587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
824587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      if (ActiveModule) {
825587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified)
826587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor          << Id[I].first << ActiveModule->getTopLevelModule();
827587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      } else {
828587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        Diags.Report(Id[I].second, diag::err_mmap_expected_module_name);
829587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      }
830587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      HadError = true;
831587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      return;
832587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    }
833587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  }
834587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
835587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  StringRef ModuleName = Id.back().first;
836587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  SourceLocation ModuleNameLoc = Id.back().second;
837a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
838a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  // Parse the optional attribute list.
839a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  bool IsSystem = false;
840a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  while (Tok.is(MMToken::LSquare)) {
841a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    // Consume the '['.
842a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    SourceLocation LSquareLoc = consumeToken();
843a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
844a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    // Check whether we have an attribute name here.
845a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    if (!Tok.is(MMToken::Identifier)) {
846a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute);
847a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      skipUntil(MMToken::RSquare);
848a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      if (Tok.is(MMToken::RSquare))
849a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor        consumeToken();
850a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      continue;
851a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    }
852a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
853a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    // Decode the attribute name.
854a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    AttributeKind Attribute
855a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      = llvm::StringSwitch<AttributeKind>(Tok.getString())
856a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor        .Case("system", AT_system)
857a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor        .Default(AT_unknown);
858a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    switch (Attribute) {
859a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    case AT_unknown:
860a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute)
861a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor        << Tok.getString();
862a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      break;
863a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
864a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    case AT_system:
865a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      IsSystem = true;
866a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      break;
867a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    }
868a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    consumeToken();
869a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
870a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    // Consume the ']'.
871a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    if (!Tok.is(MMToken::RSquare)) {
872a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare);
873a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match);
874a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      skipUntil(MMToken::RSquare);
875a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    }
876a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
877a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    if (Tok.is(MMToken::RSquare))
878a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor      consumeToken();
879a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  }
880a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor
881a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse the opening brace.
882a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (!Tok.is(MMToken::LBrace)) {
883a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace)
884a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      << ModuleName;
885a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
886a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return;
887a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
888a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceLocation LBraceLoc = consumeToken();
889a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
890a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Determine whether this (sub)module has already been defined.
891b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor  if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) {
892c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor    if (Existing->DefinitionLoc.isInvalid() && !ActiveModule) {
893c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor      // Skip the module definition.
894c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor      skipUntil(MMToken::RBrace);
895c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor      if (Tok.is(MMToken::RBrace))
896c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor        consumeToken();
897c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor      else {
898c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor        Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
899c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor        Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
900c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor        HadError = true;
901c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor      }
902c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor      return;
903c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor    }
904c634f50c5cc892b899659c1743d696766c82afcdDouglas Gregor
905a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition)
906a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      << ModuleName;
907b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor    Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition);
908a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
909a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    // Skip the module definition.
910a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    skipUntil(MMToken::RBrace);
911a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    if (Tok.is(MMToken::RBrace))
912a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      consumeToken();
913a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
914a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
915a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return;
916a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
917a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
918a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Start defining this module.
919b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor  ActiveModule = Map.findOrCreateModule(ModuleName, ActiveModule, Framework,
920b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor                                        Explicit).first;
921b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor  ActiveModule->DefinitionLoc = ModuleNameLoc;
922a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor  if (IsSystem)
923a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    ActiveModule->IsSystem = true;
924a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
925a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  bool Done = false;
926a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  do {
927a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    switch (Tok.Kind) {
928a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::EndOfFile:
929a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::RBrace:
930a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Done = true;
931a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
932a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
933a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::ExplicitKeyword:
934d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    case MMToken::FrameworkKeyword:
935a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::ModuleKeyword:
936a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      parseModuleDecl();
937a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
938a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
93990db26000aefe9335370013eec64c85232d80227Douglas Gregor    case MMToken::ExportKeyword:
94090db26000aefe9335370013eec64c85232d80227Douglas Gregor      parseExportDecl();
94190db26000aefe9335370013eec64c85232d80227Douglas Gregor      break;
94290db26000aefe9335370013eec64c85232d80227Douglas Gregor
94351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    case MMToken::RequiresKeyword:
94451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      parseRequiresDecl();
94551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      break;
94651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
94777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    case MMToken::UmbrellaKeyword: {
94877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      SourceLocation UmbrellaLoc = consumeToken();
94977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      if (Tok.is(MMToken::HeaderKeyword))
95077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor        parseHeaderDecl(UmbrellaLoc);
95177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      else
95277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor        parseUmbrellaDirDecl(UmbrellaLoc);
953a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
95477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    }
955a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
956489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor    case MMToken::HeaderKeyword:
957489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      parseHeaderDecl(SourceLocation());
958a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
959489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor
960a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    default:
961a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member);
962a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      consumeToken();
963a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
964a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
965a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  } while (!Done);
966a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
967a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (Tok.is(MMToken::RBrace))
968a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    consumeToken();
969a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  else {
970a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
971a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
972a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
973a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
974a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
975587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  // We're done parsing this module. Pop back to the previous module.
976587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  ActiveModule = PreviousActiveModule;
977a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
978d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor
97951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/// \brief Parse a requires declaration.
98051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor///
98151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor///   requires-declaration:
98251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor///     'requires' feature-list
98351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor///
98451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor///   feature-list:
98551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor///     identifier ',' feature-list
98651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor///     identifier
98751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregorvoid ModuleMapParser::parseRequiresDecl() {
98851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  assert(Tok.is(MMToken::RequiresKeyword));
98951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
99051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  // Parse 'requires' keyword.
99151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  consumeToken();
99251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
99351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  // Parse the feature-list.
99451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  do {
99551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    if (!Tok.is(MMToken::Identifier)) {
99651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature);
99751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      HadError = true;
99851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      return;
99951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    }
100051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
100151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    // Consume the feature name.
100251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    std::string Feature = Tok.getString();
100351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    consumeToken();
100451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
100551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    // Add this feature.
1006dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor    ActiveModule->addRequirement(Feature, Map.LangOpts, *Map.Target);
100751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
100851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    if (!Tok.is(MMToken::Comma))
100951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor      break;
101051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
101151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    // Consume the comma.
101251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    consumeToken();
101351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  } while (true);
101451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor}
101551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor
1016d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor/// \brief Append to \p Paths the set of paths needed to get to the
1017d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor/// subframework in which the given module lives.
1018d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregorvoid appendSubframeworkPaths(Module *Mod, llvm::SmallVectorImpl<char> &Path) {
1019d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  // Collect the framework names from the given module to the top-level module.
1020d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  llvm::SmallVector<StringRef, 2> Paths;
1021d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  for (; Mod; Mod = Mod->Parent) {
1022d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    if (Mod->IsFramework)
1023d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor      Paths.push_back(Mod->Name);
1024d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  }
1025d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor
1026d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  if (Paths.empty())
1027d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    return;
1028d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor
1029d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  // Add Frameworks/Name.framework for each subframework.
1030d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  for (unsigned I = Paths.size() - 1; I != 0; --I) {
1031d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    llvm::sys::path::append(Path, "Frameworks");
1032d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    llvm::sys::path::append(Path, Paths[I-1] + ".framework");
1033d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor  }
1034d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor}
1035d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor
10362f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor/// \brief Determine whether the given file name is the name of a builtin
10372f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor/// header, supplied by Clang to replace, override, or augment existing system
10382f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor/// headers.
10392f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregorstatic bool isBuiltinHeader(StringRef FileName) {
10402f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor  return llvm::StringSwitch<bool>(FileName)
10412f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      .Case("float.h", true)
10422f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      .Case("iso646.h", true)
10432f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      .Case("limits.h", true)
10442f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      .Case("stdalign.h", true)
10452f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      .Case("stdarg.h", true)
10462f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      .Case("stdbool.h", true)
10472f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      .Case("stddef.h", true)
10482f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      .Case("stdint.h", true)
10492f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      .Case("tgmath.h", true)
10502f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      .Case("unwind.h", true)
10512f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      .Default(false);
10522f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor}
10532f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor
1054489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor/// \brief Parse a header declaration.
1055a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///
1056489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor///   header-declaration:
1057489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor///     'umbrella'[opt] 'header' string-literal
1058489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregorvoid ModuleMapParser::parseHeaderDecl(SourceLocation UmbrellaLoc) {
1059489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor  assert(Tok.is(MMToken::HeaderKeyword));
1060489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor  consumeToken();
1061489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor
1062489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor  bool Umbrella = UmbrellaLoc.isValid();
1063a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
1064a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse the header name.
1065a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (!Tok.is(MMToken::StringLiteral)) {
1066a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1067489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      << "header";
1068a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
1069a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return;
1070a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
1071587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  std::string FileName = Tok.getString();
1072a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceLocation FileNameLoc = consumeToken();
1073489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor
107477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  // Check whether we already have an umbrella.
107577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  if (Umbrella && ActiveModule->Umbrella) {
107677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    Diags.Report(FileNameLoc, diag::err_mmap_umbrella_clash)
107777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      << ActiveModule->getFullModuleName();
10788b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    HadError = true;
10798b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    return;
10808b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  }
1081a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor
10828b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // Look for this file.
1083587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  const FileEntry *File = 0;
10842f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor  const FileEntry *BuiltinFile = 0;
1085f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith  SmallString<128> PathName;
1086587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  if (llvm::sys::path::is_absolute(FileName)) {
1087587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    PathName = FileName;
1088587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    File = SourceMgr.getFileManager().getFile(PathName);
10896a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor  } else if (const DirectoryEntry *Dir = getOverriddenHeaderSearchDir()) {
10906a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor    PathName = Dir->getName();
10916a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor    llvm::sys::path::append(PathName, FileName);
10926a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor    File = SourceMgr.getFileManager().getFile(PathName);
1093587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  } else {
1094587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    // Search for the header file within the search directory.
10956a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor    PathName = Directory->getName();
1096587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    unsigned PathLength = PathName.size();
109718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor
1098d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    if (ActiveModule->isPartOfFramework()) {
1099d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor      appendSubframeworkPaths(ActiveModule, PathName);
1100587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
1101587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      // Check whether this file is in the public headers.
110218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor      llvm::sys::path::append(PathName, "Headers");
1103587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      llvm::sys::path::append(PathName, FileName);
1104587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      File = SourceMgr.getFileManager().getFile(PathName);
1105587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor
1106587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      if (!File) {
1107587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        // Check whether this file is in the private headers.
1108587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        PathName.resize(PathLength);
1109587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        llvm::sys::path::append(PathName, "PrivateHeaders");
1110587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        llvm::sys::path::append(PathName, FileName);
1111587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor        File = SourceMgr.getFileManager().getFile(PathName);
1112587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      }
1113587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    } else {
1114587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      // Lookup for normal headers.
1115587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      llvm::sys::path::append(PathName, FileName);
1116587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor      File = SourceMgr.getFileManager().getFile(PathName);
11172f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor
11182f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      // If this is a system module with a top-level header, this header
11192f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      // may have a counterpart (or replacement) in the set of headers
11202f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      // supplied by Clang. Find that builtin header.
11212f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      if (ActiveModule->IsSystem && !Umbrella && BuiltinIncludeDir &&
11222f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor          BuiltinIncludeDir != Directory && isBuiltinHeader(FileName)) {
1123f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith        SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName());
11242f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor        llvm::sys::path::append(BuiltinPathName, FileName);
11252f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor        BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName);
11262f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor
11272f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor        // If Clang supplies this header but the underlying system does not,
11282f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor        // just silently swap in our builtin version. Otherwise, we'll end
11292f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor        // up adding both (later).
11302f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor        if (!File && BuiltinFile) {
11312f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor          File = BuiltinFile;
11322f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor          BuiltinFile = 0;
11332f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor        }
11342f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      }
1135d620a84a01cc232a9449dbcc2c40bd43ca314fc9Douglas Gregor    }
113618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  }
1137a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor
11388b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // FIXME: We shouldn't be eagerly stat'ing every file named in a module map.
11398b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // Come up with a lazy way to do this.
1140587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor  if (File) {
11418b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    if (const Module *OwningModule = Map.Headers[File]) {
11428b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      Diags.Report(FileNameLoc, diag::err_mmap_header_conflict)
11438b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor        << FileName << OwningModule->getFullModuleName();
11448b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      HadError = true;
1145489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor    } else if (Umbrella) {
1146489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      const DirectoryEntry *UmbrellaDir = File->getDir();
1147489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      if ((OwningModule = Map.UmbrellaDirs[UmbrellaDir])) {
1148489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor        Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
1149489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor          << OwningModule->getFullModuleName();
1150489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor        HadError = true;
1151489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      } else {
1152489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor        // Record this umbrella header.
1153489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor        Map.setUmbrellaHeader(ActiveModule, File);
1154489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      }
11558b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    } else {
1156489ad43b77c10a98df80f1395de81e3f52697e76Douglas Gregor      // Record this header.
1157e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor      Map.addHeader(ActiveModule, File);
11582f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor
11592f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      // If there is a builtin counterpart to this file, add it now.
11602f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor      if (BuiltinFile)
11612f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor        Map.addHeader(ActiveModule, BuiltinFile);
11628b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    }
11638b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  } else {
11648b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    Diags.Report(FileNameLoc, diag::err_mmap_header_not_found)
116577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      << Umbrella << FileName;
116677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    HadError = true;
116777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  }
116877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor}
116977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor
117077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor/// \brief Parse an umbrella directory declaration.
117177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor///
117277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor///   umbrella-dir-declaration:
117377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor///     umbrella string-literal
117477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregorvoid ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) {
117577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  // Parse the directory name.
117677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  if (!Tok.is(MMToken::StringLiteral)) {
117777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
117877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      << "umbrella";
117977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    HadError = true;
118077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    return;
118177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  }
118277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor
118377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  std::string DirName = Tok.getString();
118477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  SourceLocation DirNameLoc = consumeToken();
118577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor
118677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  // Check whether we already have an umbrella.
118777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  if (ActiveModule->Umbrella) {
118877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash)
118977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      << ActiveModule->getFullModuleName();
11908b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    HadError = true;
119177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    return;
119277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  }
119377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor
119477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  // Look for this file.
119577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  const DirectoryEntry *Dir = 0;
119677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  if (llvm::sys::path::is_absolute(DirName))
119777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    Dir = SourceMgr.getFileManager().getDirectory(DirName);
119877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  else {
1199f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith    SmallString<128> PathName;
120077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    PathName = Directory->getName();
120177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    llvm::sys::path::append(PathName, DirName);
120277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    Dir = SourceMgr.getFileManager().getDirectory(PathName);
12038b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  }
120477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor
120577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  if (!Dir) {
120677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found)
120777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      << DirName;
120877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    HadError = true;
120977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    return;
121077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  }
121177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor
121277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  if (Module *OwningModule = Map.UmbrellaDirs[Dir]) {
121377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
121477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor      << OwningModule->getFullModuleName();
121577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    HadError = true;
121677d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor    return;
121777d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  }
121877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor
121977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  // Record this umbrella directory.
122077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  Map.setUmbrellaDir(ActiveModule, Dir);
1221a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
1222a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
122390db26000aefe9335370013eec64c85232d80227Douglas Gregor/// \brief Parse a module export declaration.
122490db26000aefe9335370013eec64c85232d80227Douglas Gregor///
122590db26000aefe9335370013eec64c85232d80227Douglas Gregor///   export-declaration:
122690db26000aefe9335370013eec64c85232d80227Douglas Gregor///     'export' wildcard-module-id
122790db26000aefe9335370013eec64c85232d80227Douglas Gregor///
122890db26000aefe9335370013eec64c85232d80227Douglas Gregor///   wildcard-module-id:
122990db26000aefe9335370013eec64c85232d80227Douglas Gregor///     identifier
123090db26000aefe9335370013eec64c85232d80227Douglas Gregor///     '*'
123190db26000aefe9335370013eec64c85232d80227Douglas Gregor///     identifier '.' wildcard-module-id
123290db26000aefe9335370013eec64c85232d80227Douglas Gregorvoid ModuleMapParser::parseExportDecl() {
123390db26000aefe9335370013eec64c85232d80227Douglas Gregor  assert(Tok.is(MMToken::ExportKeyword));
123490db26000aefe9335370013eec64c85232d80227Douglas Gregor  SourceLocation ExportLoc = consumeToken();
123590db26000aefe9335370013eec64c85232d80227Douglas Gregor
123690db26000aefe9335370013eec64c85232d80227Douglas Gregor  // Parse the module-id with an optional wildcard at the end.
123790db26000aefe9335370013eec64c85232d80227Douglas Gregor  ModuleId ParsedModuleId;
123890db26000aefe9335370013eec64c85232d80227Douglas Gregor  bool Wildcard = false;
123990db26000aefe9335370013eec64c85232d80227Douglas Gregor  do {
124090db26000aefe9335370013eec64c85232d80227Douglas Gregor    if (Tok.is(MMToken::Identifier)) {
124190db26000aefe9335370013eec64c85232d80227Douglas Gregor      ParsedModuleId.push_back(std::make_pair(Tok.getString(),
124290db26000aefe9335370013eec64c85232d80227Douglas Gregor                                              Tok.getLocation()));
124390db26000aefe9335370013eec64c85232d80227Douglas Gregor      consumeToken();
124490db26000aefe9335370013eec64c85232d80227Douglas Gregor
124590db26000aefe9335370013eec64c85232d80227Douglas Gregor      if (Tok.is(MMToken::Period)) {
124690db26000aefe9335370013eec64c85232d80227Douglas Gregor        consumeToken();
124790db26000aefe9335370013eec64c85232d80227Douglas Gregor        continue;
124890db26000aefe9335370013eec64c85232d80227Douglas Gregor      }
124990db26000aefe9335370013eec64c85232d80227Douglas Gregor
125090db26000aefe9335370013eec64c85232d80227Douglas Gregor      break;
125190db26000aefe9335370013eec64c85232d80227Douglas Gregor    }
125290db26000aefe9335370013eec64c85232d80227Douglas Gregor
125390db26000aefe9335370013eec64c85232d80227Douglas Gregor    if(Tok.is(MMToken::Star)) {
125490db26000aefe9335370013eec64c85232d80227Douglas Gregor      Wildcard = true;
12550adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      consumeToken();
125690db26000aefe9335370013eec64c85232d80227Douglas Gregor      break;
125790db26000aefe9335370013eec64c85232d80227Douglas Gregor    }
125890db26000aefe9335370013eec64c85232d80227Douglas Gregor
125990db26000aefe9335370013eec64c85232d80227Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_export_module_id);
126090db26000aefe9335370013eec64c85232d80227Douglas Gregor    HadError = true;
126190db26000aefe9335370013eec64c85232d80227Douglas Gregor    return;
126290db26000aefe9335370013eec64c85232d80227Douglas Gregor  } while (true);
126390db26000aefe9335370013eec64c85232d80227Douglas Gregor
126490db26000aefe9335370013eec64c85232d80227Douglas Gregor  Module::UnresolvedExportDecl Unresolved = {
126590db26000aefe9335370013eec64c85232d80227Douglas Gregor    ExportLoc, ParsedModuleId, Wildcard
126690db26000aefe9335370013eec64c85232d80227Douglas Gregor  };
126790db26000aefe9335370013eec64c85232d80227Douglas Gregor  ActiveModule->UnresolvedExports.push_back(Unresolved);
126890db26000aefe9335370013eec64c85232d80227Douglas Gregor}
126990db26000aefe9335370013eec64c85232d80227Douglas Gregor
12701e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregorvoid ModuleMapParser::parseInferredSubmoduleDecl(bool Explicit) {
12711e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  assert(Tok.is(MMToken::Star));
12721e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  SourceLocation StarLoc = consumeToken();
12731e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  bool Failed = false;
12741e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
12751e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // Inferred modules must be submodules.
12761e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  if (!ActiveModule) {
12771e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule);
12781e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Failed = true;
12791e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  }
12801e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
128177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  // Inferred modules must have umbrella directories.
128277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor  if (!Failed && !ActiveModule->getUmbrellaDir()) {
12831e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
12841e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Failed = true;
12851e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  }
12861e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
12871e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // Check for redefinition of an inferred module.
1288ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor  if (!Failed && ActiveModule->InferSubmodules) {
12891e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Diags.Report(StarLoc, diag::err_mmap_inferred_redef);
1290ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor    if (ActiveModule->InferredSubmoduleLoc.isValid())
1291ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor      Diags.Report(ActiveModule->InferredSubmoduleLoc,
12921e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor                   diag::note_mmap_prev_definition);
12931e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Failed = true;
12941e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  }
12951e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
12961e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // If there were any problems with this inferred submodule, skip its body.
12971e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  if (Failed) {
12981e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    if (Tok.is(MMToken::LBrace)) {
12991e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      consumeToken();
13001e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      skipUntil(MMToken::RBrace);
13011e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      if (Tok.is(MMToken::RBrace))
13021e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor        consumeToken();
13031e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    }
13041e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    HadError = true;
13051e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    return;
13061e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  }
13071e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
13081e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // Note that we have an inferred submodule.
1309ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor  ActiveModule->InferSubmodules = true;
1310ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor  ActiveModule->InferredSubmoduleLoc = StarLoc;
1311ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor  ActiveModule->InferExplicitSubmodules = Explicit;
13121e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
13131e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // Parse the opening brace.
13141e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  if (!Tok.is(MMToken::LBrace)) {
13151e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard);
13161e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    HadError = true;
13171e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    return;
13181e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  }
13191e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  SourceLocation LBraceLoc = consumeToken();
13201e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
13211e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  // Parse the body of the inferred submodule.
13221e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  bool Done = false;
13231e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  do {
13241e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    switch (Tok.Kind) {
13251e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    case MMToken::EndOfFile:
13261e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    case MMToken::RBrace:
13271e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      Done = true;
13281e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      break;
13291e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
13301e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    case MMToken::ExportKeyword: {
13311e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      consumeToken();
13321e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      if (Tok.is(MMToken::Star))
1333ef85b56bfee855823756a6f46ee50a8c7cc5f3a6Douglas Gregor        ActiveModule->InferExportWildcard = true;
13341e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      else
13351e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor        Diags.Report(Tok.getLocation(),
13361e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor                     diag::err_mmap_expected_export_wildcard);
13371e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      consumeToken();
13381e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      break;
13391e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    }
13401e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
13411e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    case MMToken::ExplicitKeyword:
13421e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    case MMToken::ModuleKeyword:
13431e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    case MMToken::HeaderKeyword:
13441e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    case MMToken::UmbrellaKeyword:
13451e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    default:
13461e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_wildcard_member);
13471e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      consumeToken();
13481e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor      break;
13491e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    }
13501e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  } while (!Done);
13511e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
13521e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  if (Tok.is(MMToken::RBrace))
13531e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    consumeToken();
13541e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  else {
13551e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
13561e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
13571e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor    HadError = true;
13581e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor  }
13591e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor}
13601e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor
13616a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor/// \brief If there is a specific header search directory due the presence
13626a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor/// of an umbrella directory, retrieve that directory. Otherwise, returns null.
13636a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregorconst DirectoryEntry *ModuleMapParser::getOverriddenHeaderSearchDir() {
13646a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor  for (Module *Mod = ActiveModule; Mod; Mod = Mod->Parent) {
13656a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor    // If we have an umbrella directory, use that.
13666a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor    if (Mod->hasUmbrellaDir())
13676a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor      return Mod->getUmbrellaDir();
13686a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor
13696a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor    // If we have a framework directory, stop looking.
13706a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor    if (Mod->IsFramework)
13716a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor      return 0;
13726a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor  }
13736a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor
13746a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor  return 0;
13756a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor}
13766a1db484f32eb791840dd55a8d45c86ff5bd0834Douglas Gregor
1377a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a module map file.
1378a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///
1379a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///   module-map-file:
1380a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///     module-declaration*
1381a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorbool ModuleMapParser::parseModuleMapFile() {
1382a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  do {
1383a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    switch (Tok.Kind) {
1384a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::EndOfFile:
1385a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      return HadError;
1386a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
1387587986efc5ca409da3ebf0a4ab7f72ebf50a3ab9Douglas Gregor    case MMToken::ExplicitKeyword:
1388a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::ModuleKeyword:
1389a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor    case MMToken::FrameworkKeyword:
1390a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      parseModuleDecl();
1391a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
1392a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
139351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    case MMToken::Comma:
139490db26000aefe9335370013eec64c85232d80227Douglas Gregor    case MMToken::ExportKeyword:
1395a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::HeaderKeyword:
1396a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::Identifier:
1397a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::LBrace:
1398a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    case MMToken::LSquare:
139990db26000aefe9335370013eec64c85232d80227Douglas Gregor    case MMToken::Period:
1400a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::RBrace:
1401a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor    case MMToken::RSquare:
140251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor    case MMToken::RequiresKeyword:
140390db26000aefe9335370013eec64c85232d80227Douglas Gregor    case MMToken::Star:
1404a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::StringLiteral:
1405a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::UmbrellaKeyword:
1406a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1407a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      HadError = true;
1408a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      consumeToken();
1409a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
1410a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
1411a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  } while (true);
1412a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
1413a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
1414a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorbool ModuleMap::parseModuleMapFile(const FileEntry *File) {
1415dc58aa71026cce539ca9b5c2c52cc4efc7bd77feDouglas Gregor  assert(Target != 0 && "Missing target information");
1416a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  FileID ID = SourceMgr->createFileID(File, SourceLocation(), SrcMgr::C_User);
1417a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  const llvm::MemoryBuffer *Buffer = SourceMgr->getBuffer(ID);
1418a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (!Buffer)
1419a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return true;
1420a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
1421a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse this module map file.
142251f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  Lexer L(ID, SourceMgr->getBuffer(ID), *SourceMgr, MMapLangOpts);
142351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor  Diags->getClient()->BeginSourceFile(MMapLangOpts);
14242f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor  ModuleMapParser Parser(L, *SourceMgr, *Diags, *this, File->getDir(),
14252f04f1843ca0ffca13b8b0d4dadd1f50dffb38b8Douglas Gregor                         BuiltinIncludeDir);
1426a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  bool Result = Parser.parseModuleMapFile();
1427a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Diags->getClient()->EndSourceFile();
1428a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
1429a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  return Result;
1430a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
1431