ModuleMap.cpp revision 209977c4d809914a20fd44873876c76cf972a56d
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"
23a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/Host.h"
248b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor#include "llvm/Support/PathV2.h"
25a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/Support/raw_ostream.h"
26a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/ADT/StringRef.h"
27a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor#include "llvm/ADT/StringSwitch.h"
28a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorusing namespace clang;
29a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
3090db26000aefe9335370013eec64c85232d80227Douglas GregorModule::ExportDecl
3190db26000aefe9335370013eec64c85232d80227Douglas GregorModuleMap::resolveExport(Module *Mod,
3290db26000aefe9335370013eec64c85232d80227Douglas Gregor                         const Module::UnresolvedExportDecl &Unresolved,
3390db26000aefe9335370013eec64c85232d80227Douglas Gregor                         bool Complain) {
340adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor  // We may have just a wildcard.
350adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor  if (Unresolved.Id.empty()) {
360adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    assert(Unresolved.Wildcard && "Invalid unresolved export");
370adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    return Module::ExportDecl(0, true);
380adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor  }
390adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor
4090db26000aefe9335370013eec64c85232d80227Douglas Gregor  // Find the starting module.
4190db26000aefe9335370013eec64c85232d80227Douglas Gregor  Module *Context = lookupModuleUnqualified(Unresolved.Id[0].first, Mod);
4290db26000aefe9335370013eec64c85232d80227Douglas Gregor  if (!Context) {
4390db26000aefe9335370013eec64c85232d80227Douglas Gregor    if (Complain)
4490db26000aefe9335370013eec64c85232d80227Douglas Gregor      Diags->Report(Unresolved.Id[0].second,
4590db26000aefe9335370013eec64c85232d80227Douglas Gregor                    diag::err_mmap_missing_module_unqualified)
4690db26000aefe9335370013eec64c85232d80227Douglas Gregor        << Unresolved.Id[0].first << Mod->getFullModuleName();
4790db26000aefe9335370013eec64c85232d80227Douglas Gregor
4890db26000aefe9335370013eec64c85232d80227Douglas Gregor    return Module::ExportDecl();
4990db26000aefe9335370013eec64c85232d80227Douglas Gregor  }
5090db26000aefe9335370013eec64c85232d80227Douglas Gregor
5190db26000aefe9335370013eec64c85232d80227Douglas Gregor  // Dig into the module path.
5290db26000aefe9335370013eec64c85232d80227Douglas Gregor  for (unsigned I = 1, N = Unresolved.Id.size(); I != N; ++I) {
5390db26000aefe9335370013eec64c85232d80227Douglas Gregor    Module *Sub = lookupModuleQualified(Unresolved.Id[I].first,
5490db26000aefe9335370013eec64c85232d80227Douglas Gregor                                        Context);
5590db26000aefe9335370013eec64c85232d80227Douglas Gregor    if (!Sub) {
5690db26000aefe9335370013eec64c85232d80227Douglas Gregor      if (Complain)
5790db26000aefe9335370013eec64c85232d80227Douglas Gregor        Diags->Report(Unresolved.Id[I].second,
5890db26000aefe9335370013eec64c85232d80227Douglas Gregor                      diag::err_mmap_missing_module_qualified)
5990db26000aefe9335370013eec64c85232d80227Douglas Gregor          << Unresolved.Id[I].first << Context->getFullModuleName()
6090db26000aefe9335370013eec64c85232d80227Douglas Gregor          << SourceRange(Unresolved.Id[0].second, Unresolved.Id[I-1].second);
6190db26000aefe9335370013eec64c85232d80227Douglas Gregor
6290db26000aefe9335370013eec64c85232d80227Douglas Gregor      return Module::ExportDecl();
6390db26000aefe9335370013eec64c85232d80227Douglas Gregor    }
6490db26000aefe9335370013eec64c85232d80227Douglas Gregor
6590db26000aefe9335370013eec64c85232d80227Douglas Gregor    Context = Sub;
6690db26000aefe9335370013eec64c85232d80227Douglas Gregor  }
6790db26000aefe9335370013eec64c85232d80227Douglas Gregor
6890db26000aefe9335370013eec64c85232d80227Douglas Gregor  return Module::ExportDecl(Context, Unresolved.Wildcard);
6990db26000aefe9335370013eec64c85232d80227Douglas Gregor}
7090db26000aefe9335370013eec64c85232d80227Douglas Gregor
71a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorModuleMap::ModuleMap(FileManager &FileMgr, const DiagnosticConsumer &DC) {
72a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs);
73a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Diags = llvm::IntrusiveRefCntPtr<DiagnosticsEngine>(
74a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor            new DiagnosticsEngine(DiagIDs));
75a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Diags->setClient(DC.clone(*Diags), /*ShouldOwnClient=*/true);
76a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceMgr = new SourceManager(*Diags, FileMgr);
77a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
78a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
79a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorModuleMap::~ModuleMap() {
8009fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor  for (llvm::StringMap<Module *>::iterator I = Modules.begin(),
8109fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor                                        IEnd = Modules.end();
8209fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor       I != IEnd; ++I) {
8309fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor    delete I->getValue();
8409fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor  }
8509fe1bb696847e6f1b482e5ac40029d53a2402dfDouglas Gregor
86a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  delete SourceMgr;
87a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
88a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
891a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *ModuleMap::findModuleForHeader(const FileEntry *File) {
9065f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor  llvm::DenseMap<const FileEntry *, Module *>::iterator Known
9165f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor    = Headers.find(File);
9265f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor  if (Known != Headers.end())
9365f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor    return Known->second;
9465f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor
95adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor  const DirectoryEntry *Dir = File->getDir();
96adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor  llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir
97adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    = UmbrellaDirs.find(Dir);
98adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor  if (KnownDir != UmbrellaDirs.end())
99adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    return KnownDir->second;
100adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor
101adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor  // Walk up the directory hierarchy looking for umbrella headers.
102adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor  llvm::SmallVector<const DirectoryEntry *, 2> SkippedDirs;
103adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor  StringRef DirName = Dir->getName();
104adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor  do {
105adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    // Retrieve our parent path.
106adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    DirName = llvm::sys::path::parent_path(DirName);
107adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    if (DirName.empty())
108adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor      break;
109adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor
110adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    // Resolve the parent path to a directory entry.
111adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    Dir = SourceMgr->getFileManager().getDirectory(DirName);
112adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    if (!Dir)
113adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor      break;
114adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor
115adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    KnownDir = UmbrellaDirs.find(Dir);
116adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    if (KnownDir != UmbrellaDirs.end()) {
117adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor      Module *Result = KnownDir->second;
118adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor
119adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor      // Record each of the directories we stepped through as being part of
120adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor      // the module we found, since the umbrella header covers them all.
121adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor      for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I)
122adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor        UmbrellaDirs[SkippedDirs[I]] = Result;
123adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor
124adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor      return Result;
125adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    }
126adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor
127adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    SkippedDirs.push_back(Dir);
128adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor  } while (true);
129adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor
13065f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor  return 0;
13165f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor}
13265f3b5e99009f49d51eb00a859dbd2c2ee660718Douglas Gregor
1331a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *ModuleMap::findModule(StringRef Name) {
134484535e45b4d301847a157e943c7823da5d40884Douglas Gregor  llvm::StringMap<Module *>::iterator Known = Modules.find(Name);
135484535e45b4d301847a157e943c7823da5d40884Douglas Gregor  if (Known != Modules.end())
136484535e45b4d301847a157e943c7823da5d40884Douglas Gregor    return Known->getValue();
137484535e45b4d301847a157e943c7823da5d40884Douglas Gregor
138484535e45b4d301847a157e943c7823da5d40884Douglas Gregor  return 0;
139484535e45b4d301847a157e943c7823da5d40884Douglas Gregor}
140484535e45b4d301847a157e943c7823da5d40884Douglas Gregor
14190db26000aefe9335370013eec64c85232d80227Douglas GregorModule *ModuleMap::lookupModuleUnqualified(StringRef Name, Module *Context) {
14290db26000aefe9335370013eec64c85232d80227Douglas Gregor  for(; Context; Context = Context->Parent) {
14390db26000aefe9335370013eec64c85232d80227Douglas Gregor    if (Module *Sub = lookupModuleQualified(Name, Context))
14490db26000aefe9335370013eec64c85232d80227Douglas Gregor      return Sub;
14590db26000aefe9335370013eec64c85232d80227Douglas Gregor  }
14690db26000aefe9335370013eec64c85232d80227Douglas Gregor
14790db26000aefe9335370013eec64c85232d80227Douglas Gregor  return findModule(Name);
14890db26000aefe9335370013eec64c85232d80227Douglas Gregor}
14990db26000aefe9335370013eec64c85232d80227Douglas Gregor
15090db26000aefe9335370013eec64c85232d80227Douglas GregorModule *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) {
15190db26000aefe9335370013eec64c85232d80227Douglas Gregor  if (!Context)
15290db26000aefe9335370013eec64c85232d80227Douglas Gregor    return findModule(Name);
15390db26000aefe9335370013eec64c85232d80227Douglas Gregor
15490db26000aefe9335370013eec64c85232d80227Douglas Gregor  llvm::StringMap<Module *>::iterator Sub = Context->SubModules.find(Name);
15590db26000aefe9335370013eec64c85232d80227Douglas Gregor  if (Sub != Context->SubModules.end())
15690db26000aefe9335370013eec64c85232d80227Douglas Gregor    return Sub->getValue();
15790db26000aefe9335370013eec64c85232d80227Douglas Gregor
15890db26000aefe9335370013eec64c85232d80227Douglas Gregor  return 0;
15990db26000aefe9335370013eec64c85232d80227Douglas Gregor}
16090db26000aefe9335370013eec64c85232d80227Douglas Gregor
1611a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregorstd::pair<Module *, bool>
162392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework,
163392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor                              bool IsExplicit) {
164392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  // Try to find an existing module with this name.
165392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  if (Module *Found = Parent? Parent->SubModules[Name] : Modules[Name])
166392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    return std::make_pair(Found, false);
167392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
168392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  // Create a new module with this name.
169392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework,
170392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor                              IsExplicit);
171392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  if (Parent)
172392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    Parent->SubModules[Name] = Result;
173392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  else
174392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor    Modules[Name] = Result;
175392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor  return std::make_pair(Result, true);
176392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor}
177392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor
1781a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModule *
1792821c7f8870629b56b9c41e1c50c7a091edd544dDouglas GregorModuleMap::inferFrameworkModule(StringRef ModuleName,
1802821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor                                const DirectoryEntry *FrameworkDir) {
1812821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // Check whether we've already found this module.
1822821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  if (Module *Module = findModule(ModuleName))
1832821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor    return Module;
1842821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor
1852821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // Look for an umbrella header.
1862821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  llvm::SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName());
1872821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  llvm::sys::path::append(UmbrellaName, "Headers");
1882821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  llvm::sys::path::append(UmbrellaName, ModuleName + ".h");
1892821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  const FileEntry *UmbrellaHeader
1902821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor    = SourceMgr->getFileManager().getFile(UmbrellaName);
1912821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor
1922821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // FIXME: If there's no umbrella header, we could probably scan the
1932821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // framework to load *everything*. But, it's not clear that this is a good
1942821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  // idea.
1952821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  if (!UmbrellaHeader)
1962821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor    return 0;
1972821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor
198a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  Module *Result = new Module(ModuleName, SourceLocation(),
199a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor                              /*IsFramework=*/true);
200209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor  // umbrella "umbrella-header-name"
2012821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  Result->UmbrellaHeader = UmbrellaHeader;
2022821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  Headers[UmbrellaHeader] = Result;
2032821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  UmbrellaDirs[FrameworkDir] = Result;
204209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor
205209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor  // export *
206209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor  Result->Exports.push_back(Module::ExportDecl(0, true));
207209977c4d809914a20fd44873876c76cf972a56dDouglas Gregor
2082821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  Modules[ModuleName] = Result;
2092821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor  return Result;
2102821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor}
2112821c7f8870629b56b9c41e1c50c7a091edd544dDouglas Gregor
212f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregorconst FileEntry *
2131a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas GregorModuleMap::getContainingModuleMapFile(Module *Module) {
214f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor  if (Module->DefinitionLoc.isInvalid() || !SourceMgr)
215f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor    return 0;
216f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor
217f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor  return SourceMgr->getFileEntryForID(
218f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor           SourceMgr->getFileID(Module->DefinitionLoc));
219f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor}
220f9e357d8a66c606a86a6e1aef678898b8843bd30Douglas Gregor
221a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMap::dump() {
222a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  llvm::errs() << "Modules:";
223a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  for (llvm::StringMap<Module *>::iterator M = Modules.begin(),
224a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                                        MEnd = Modules.end();
225a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor       M != MEnd; ++M)
226804c3bfee22076f232dddf4839439119cfdee2b6Douglas Gregor    M->getValue()->print(llvm::errs(), 2);
227a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
228a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  llvm::errs() << "Headers:";
229a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  for (llvm::DenseMap<const FileEntry *, Module *>::iterator
230a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor            H = Headers.begin(),
231a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor         HEnd = Headers.end();
232a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor       H != HEnd; ++H) {
233a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    llvm::errs() << "  \"" << H->first->getName() << "\" -> "
234a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 << H->second->getFullModuleName() << "\n";
235a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
236a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
237a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
23890db26000aefe9335370013eec64c85232d80227Douglas Gregorbool ModuleMap::resolveExports(Module *Mod, bool Complain) {
23990db26000aefe9335370013eec64c85232d80227Douglas Gregor  bool HadError = false;
24090db26000aefe9335370013eec64c85232d80227Douglas Gregor  for (unsigned I = 0, N = Mod->UnresolvedExports.size(); I != N; ++I) {
24190db26000aefe9335370013eec64c85232d80227Douglas Gregor    Module::ExportDecl Export = resolveExport(Mod, Mod->UnresolvedExports[I],
24290db26000aefe9335370013eec64c85232d80227Douglas Gregor                                              Complain);
2430adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor    if (Export.getPointer() || Export.getInt())
24490db26000aefe9335370013eec64c85232d80227Douglas Gregor      Mod->Exports.push_back(Export);
24590db26000aefe9335370013eec64c85232d80227Douglas Gregor    else
24690db26000aefe9335370013eec64c85232d80227Douglas Gregor      HadError = true;
24790db26000aefe9335370013eec64c85232d80227Douglas Gregor  }
24890db26000aefe9335370013eec64c85232d80227Douglas Gregor  Mod->UnresolvedExports.clear();
24990db26000aefe9335370013eec64c85232d80227Douglas Gregor  return HadError;
25090db26000aefe9335370013eec64c85232d80227Douglas Gregor}
25190db26000aefe9335370013eec64c85232d80227Douglas Gregor
25255988680ece66b8e505ee136b35e74fcb1173aeeDouglas GregorModule *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) {
25355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  if (Loc.isInvalid())
25455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor    return 0;
25555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
25655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  // Use the expansion location to determine which module we're in.
25755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  FullSourceLoc ExpansionLoc = Loc.getExpansionLoc();
25855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  if (!ExpansionLoc.isFileID())
25955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor    return 0;
26055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
26155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
26255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  const SourceManager &SrcMgr = Loc.getManager();
26355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  FileID ExpansionFileID = ExpansionLoc.getFileID();
26455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  const FileEntry *ExpansionFile = SrcMgr.getFileEntryForID(ExpansionFileID);
26555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  if (!ExpansionFile)
26655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor    return 0;
26755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
26855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  // Find the module that owns this header.
26955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor  return findModuleForHeader(ExpansionFile);
27055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor}
27155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor
272a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//----------------------------------------------------------------------------//
273a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor// Module map file parser
274a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor//----------------------------------------------------------------------------//
275a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
276a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregornamespace clang {
277a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  /// \brief A token in a module map file.
278a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  struct MMToken {
279a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    enum TokenKind {
280a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      EndOfFile,
281a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      HeaderKeyword,
282a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Identifier,
283a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      ExplicitKeyword,
28490db26000aefe9335370013eec64c85232d80227Douglas Gregor      ExportKeyword,
285a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor      FrameworkKeyword,
286a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      ModuleKeyword,
28790db26000aefe9335370013eec64c85232d80227Douglas Gregor      Period,
288a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      UmbrellaKeyword,
28990db26000aefe9335370013eec64c85232d80227Douglas Gregor      Star,
290a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      StringLiteral,
291a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      LBrace,
292a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      RBrace
293a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    } Kind;
294a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
295a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    unsigned Location;
296a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    unsigned StringLength;
297a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    const char *StringData;
298a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
299a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    void clear() {
300a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Kind = EndOfFile;
301a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Location = 0;
302a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      StringLength = 0;
303a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      StringData = 0;
304a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
305a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
306a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    bool is(TokenKind K) const { return Kind == K; }
307a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
308a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    SourceLocation getLocation() const {
309a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      return SourceLocation::getFromRawEncoding(Location);
310a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
311a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
312a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    StringRef getString() const {
313a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      return StringRef(StringData, StringLength);
314a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
315a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  };
316a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
317a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  class ModuleMapParser {
318a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Lexer &L;
319a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    SourceManager &SourceMgr;
320a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    DiagnosticsEngine &Diags;
321a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    ModuleMap &Map;
322a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
3238b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    /// \brief The directory that this module map resides in.
3248b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    const DirectoryEntry *Directory;
3258b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor
326a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Whether an error occurred.
327a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    bool HadError;
328a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
329a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Default target information, used only for string literal
330a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// parsing.
331a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    TargetInfo *Target;
332a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
333a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Stores string data for the various string literals referenced
334a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// during parsing.
335a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    llvm::BumpPtrAllocator StringData;
336a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
337a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief The current token.
338a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    MMToken Tok;
339a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
340a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief The active module.
3411a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor    Module *ActiveModule;
342a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
343a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Consume the current token and return its location.
344a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    SourceLocation consumeToken();
345a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
346a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// \brief Skip tokens until we reach the a token with the given kind
347a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    /// (or the end of the file).
348a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    void skipUntil(MMToken::TokenKind K);
349a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
350a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    void parseModuleDecl();
351a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    void parseUmbrellaDecl();
352a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    void parseHeaderDecl();
35390db26000aefe9335370013eec64c85232d80227Douglas Gregor    void parseExportDecl();
354a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
355a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  public:
356a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr,
357a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                             DiagnosticsEngine &Diags,
3588b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor                             ModuleMap &Map,
3598b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor                             const DirectoryEntry *Directory)
3608b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      : L(L), SourceMgr(SourceMgr), Diags(Diags), Map(Map),
3618b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor        Directory(Directory), HadError(false), ActiveModule(0)
362a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    {
363a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      TargetOptions TargetOpts;
364a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      TargetOpts.Triple = llvm::sys::getDefaultTargetTriple();
365a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Target = TargetInfo::CreateTargetInfo(Diags, TargetOpts);
366a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
367a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Tok.clear();
368a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      consumeToken();
369a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
370a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
371a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    bool parseModuleMapFile();
372a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  };
373a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
374a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
375a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas GregorSourceLocation ModuleMapParser::consumeToken() {
376a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorretry:
377a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceLocation Result = Tok.getLocation();
378a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Tok.clear();
379a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
380a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Token LToken;
381a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  L.LexFromRawLexer(LToken);
382a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Tok.Location = LToken.getLocation().getRawEncoding();
383a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  switch (LToken.getKind()) {
384a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::raw_identifier:
385a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.StringData = LToken.getRawIdentifierData();
386a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.StringLength = LToken.getLength();
387a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(Tok.getString())
388a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Case("header", MMToken::HeaderKeyword)
389a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Case("explicit", MMToken::ExplicitKeyword)
39090db26000aefe9335370013eec64c85232d80227Douglas Gregor                 .Case("export", MMToken::ExportKeyword)
391a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor                 .Case("framework", MMToken::FrameworkKeyword)
392a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Case("module", MMToken::ModuleKeyword)
393a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Case("umbrella", MMToken::UmbrellaKeyword)
394a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 .Default(MMToken::Identifier);
395a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
396a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
397a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::eof:
398a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = MMToken::EndOfFile;
399a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
400a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
401a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::l_brace:
402a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = MMToken::LBrace;
403a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
404a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
40590db26000aefe9335370013eec64c85232d80227Douglas Gregor  case tok::period:
40690db26000aefe9335370013eec64c85232d80227Douglas Gregor    Tok.Kind = MMToken::Period;
40790db26000aefe9335370013eec64c85232d80227Douglas Gregor    break;
40890db26000aefe9335370013eec64c85232d80227Douglas Gregor
409a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::r_brace:
410a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = MMToken::RBrace;
411a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
412a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
41390db26000aefe9335370013eec64c85232d80227Douglas Gregor  case tok::star:
41490db26000aefe9335370013eec64c85232d80227Douglas Gregor    Tok.Kind = MMToken::Star;
41590db26000aefe9335370013eec64c85232d80227Douglas Gregor    break;
41690db26000aefe9335370013eec64c85232d80227Douglas Gregor
417a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::string_literal: {
418a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    // Parse the string literal.
419a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    LangOptions LangOpts;
420a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    StringLiteralParser StringLiteral(&LToken, 1, SourceMgr, LangOpts, *Target);
421a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    if (StringLiteral.hadError)
422a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      goto retry;
423a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
424a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    // Copy the string literal into our string data allocator.
425a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    unsigned Length = StringLiteral.GetStringLength();
426a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    char *Saved = StringData.Allocate<char>(Length + 1);
427a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    memcpy(Saved, StringLiteral.GetString().data(), Length);
428a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Saved[Length] = 0;
429a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
430a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    // Form the token.
431a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.Kind = MMToken::StringLiteral;
432a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.StringData = Saved;
433a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Tok.StringLength = Length;
434a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    break;
435a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
436a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
437a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  case tok::comment:
438a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    goto retry;
439a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
440a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  default:
441a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token);
442a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
443a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    goto retry;
444a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
445a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
446a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  return Result;
447a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
448a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
449a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::skipUntil(MMToken::TokenKind K) {
450a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  unsigned braceDepth = 0;
451a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  do {
452a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    switch (Tok.Kind) {
453a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::EndOfFile:
454a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      return;
455a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
456a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::LBrace:
457a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      if (Tok.is(K) && braceDepth == 0)
458a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor        return;
459a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
460a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      ++braceDepth;
461a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
462a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
463a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::RBrace:
464a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      if (braceDepth > 0)
465a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor        --braceDepth;
466a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      else if (Tok.is(K))
467a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor        return;
468a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
469a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
470a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    default:
471a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      if (braceDepth == 0 && Tok.is(K))
472a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor        return;
473a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
474a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
475a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
476a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor   consumeToken();
477a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  } while (true);
478a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
479a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
480a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a module declaration.
481a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///
482a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///   module-declaration:
483a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor///     'framework'[opt] 'module' identifier { module-member* }
484a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///
485a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///   module-member:
486a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///     umbrella-declaration
487a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///     header-declaration
488a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///     'explicit'[opt] module-declaration
48990db26000aefe9335370013eec64c85232d80227Douglas Gregor///     export-declaration
490a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::parseModuleDecl() {
491a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) ||
492a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor         Tok.is(MMToken::FrameworkKeyword));
493a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor
494a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  // Parse 'framework' or 'explicit' keyword, if present.
495a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  bool Framework = false;
496a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  bool Explicit = false;
497a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor
498a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  if (Tok.is(MMToken::FrameworkKeyword)) {
499a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor    consumeToken();
500a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor    Framework = true;
501a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  }
502a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  // Parse 'explicit' keyword, if present.
503a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  else if (Tok.is(MMToken::ExplicitKeyword)) {
504a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    consumeToken();
505a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Explicit = true;
506a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
507a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
508a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse 'module' keyword.
509a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (!Tok.is(MMToken::ModuleKeyword)) {
510a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(Tok.getLocation(),
511a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 diag::err_mmap_expected_module_after_explicit);
512a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    consumeToken();
513a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
514a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return;
515a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
516a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  consumeToken(); // 'module' keyword
517a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
518a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse the module name.
519a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (!Tok.is(MMToken::Identifier)) {
520a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name);
521a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
522a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return;
523a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
524a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  StringRef ModuleName = Tok.getString();
525a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceLocation ModuleNameLoc = consumeToken();
526a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
527a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse the opening brace.
528a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (!Tok.is(MMToken::LBrace)) {
529a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace)
530a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      << ModuleName;
531a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
532a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return;
533a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
534a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceLocation LBraceLoc = consumeToken();
535a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
536a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Determine whether this (sub)module has already been defined.
537a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  llvm::StringMap<Module *> &ModuleSpace
538a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    = ActiveModule? ActiveModule->SubModules : Map.Modules;
539a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  llvm::StringMap<Module *>::iterator ExistingModule
540a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    = ModuleSpace.find(ModuleName);
541a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (ExistingModule != ModuleSpace.end()) {
542a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition)
543a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      << ModuleName;
544a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(ExistingModule->getValue()->DefinitionLoc,
545a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor                 diag::note_mmap_prev_definition);
546a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
547a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    // Skip the module definition.
548a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    skipUntil(MMToken::RBrace);
549a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    if (Tok.is(MMToken::RBrace))
550a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      consumeToken();
551a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
552a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
553a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return;
554a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
555a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
556a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Start defining this module.
557a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  ActiveModule = new Module(ModuleName, ModuleNameLoc, ActiveModule, Framework,
558a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor                            Explicit);
559a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  ModuleSpace[ModuleName] = ActiveModule;
560a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
561a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  bool Done = false;
562a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  do {
563a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    switch (Tok.Kind) {
564a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::EndOfFile:
565a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::RBrace:
566a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Done = true;
567a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
568a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
569a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::ExplicitKeyword:
570a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::ModuleKeyword:
571a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      parseModuleDecl();
572a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
573a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
57490db26000aefe9335370013eec64c85232d80227Douglas Gregor    case MMToken::ExportKeyword:
57590db26000aefe9335370013eec64c85232d80227Douglas Gregor      parseExportDecl();
57690db26000aefe9335370013eec64c85232d80227Douglas Gregor      break;
57790db26000aefe9335370013eec64c85232d80227Douglas Gregor
578a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::HeaderKeyword:
579a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      parseHeaderDecl();
580a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
581a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
582a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::UmbrellaKeyword:
583a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      parseUmbrellaDecl();
584a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
58590db26000aefe9335370013eec64c85232d80227Douglas Gregor
586a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    default:
587a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member);
588a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      consumeToken();
589a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
590a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
591a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  } while (!Done);
592a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
593a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (Tok.is(MMToken::RBrace))
594a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    consumeToken();
595a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  else {
596a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
597a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
598a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
599a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
600a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
601a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // We're done parsing this module. Pop back to our parent scope.
602a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  ActiveModule = ActiveModule->Parent;
603a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
604a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
605a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse an umbrella header declaration.
606a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///
607a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///   umbrella-declaration:
608a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///     'umbrella' string-literal
609a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::parseUmbrellaDecl() {
610a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  assert(Tok.is(MMToken::UmbrellaKeyword));
611a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceLocation UmbrellaLoc = consumeToken();
612a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
613a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse the header name.
614a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (!Tok.is(MMToken::StringLiteral)) {
615a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
616a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      << "umbrella";
617a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
618a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return;
619a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
620a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  StringRef FileName = Tok.getString();
621a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceLocation FileNameLoc = consumeToken();
622a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
6238b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // Check whether we already have an umbrella header.
6248b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  if (ActiveModule->UmbrellaHeader) {
6258b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    Diags.Report(FileNameLoc, diag::err_mmap_umbrella_header_conflict)
6268b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      << ActiveModule->getFullModuleName()
6278b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      << ActiveModule->UmbrellaHeader->getName();
6288b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    HadError = true;
6298b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    return;
6308b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  }
6318b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor
6328b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // Only top-level modules can have umbrella headers.
6338b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  if (ActiveModule->Parent) {
6348b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_header_submodule)
6358b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      << ActiveModule->getFullModuleName();
6368b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    HadError = true;
6378b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    return;
6388b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  }
6398b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor
6408b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // Look for this file.
6418b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  llvm::SmallString<128> PathName;
642a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  const FileEntry *File = 0;
64318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor
64418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  if (llvm::sys::path::is_absolute(FileName)) {
64518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor    PathName = FileName;
646a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor    File = SourceMgr.getFileManager().getFile(PathName);
64718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  } else {
64818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor    // Search for the header file within the search directory.
64918ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor    PathName += Directory->getName();
65018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor    unsigned PathLength = PathName.size();
65118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor    if (ActiveModule->isPartOfFramework()) {
65218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor      // Check whether this file is in the public headers.
65318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor      llvm::sys::path::append(PathName, "Headers");
65418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor      llvm::sys::path::append(PathName, FileName);
65518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor      File = SourceMgr.getFileManager().getFile(PathName);
656a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor
65718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor      if (!File) {
65818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor        // Check whether this file is in the private headers.
65918ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor        PathName.resize(PathLength);
66018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor        llvm::sys::path::append(PathName, "PrivateHeaders");
66118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor        llvm::sys::path::append(PathName, FileName);
66218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor        File = SourceMgr.getFileManager().getFile(PathName);
66318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor      }
66418ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor
66518ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor      // FIXME: Deal with subframeworks.
66618ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor    } else {
66718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor      // Lookup for normal headers.
668a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor      llvm::sys::path::append(PathName, FileName);
669a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor      File = SourceMgr.getFileManager().getFile(PathName);
670a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor    }
671a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  }
6728b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor
6738b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // FIXME: We shouldn't be eagerly stat'ing every file named in a module map.
6748b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // Come up with a lazy way to do this.
675a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor  if (File) {
6768b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    if (const Module *OwningModule = Map.Headers[File]) {
6778b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      Diags.Report(FileNameLoc, diag::err_mmap_header_conflict)
6788b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor        << FileName << OwningModule->getFullModuleName();
6798b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      HadError = true;
680adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor    } else if ((OwningModule = Map.UmbrellaDirs[Directory])) {
681adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor      Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
682adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor        << OwningModule->getFullModuleName();
683adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor      HadError = true;
6848b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    } else {
6858b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      // Record this umbrella header.
6868b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      ActiveModule->UmbrellaHeader = File;
6878b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      Map.Headers[File] = ActiveModule;
688adb979924ade3e25342c38a5b564400b4e0540c1Douglas Gregor      Map.UmbrellaDirs[Directory] = ActiveModule;
6898b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    }
6908b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  } else {
6918b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    Diags.Report(FileNameLoc, diag::err_mmap_header_not_found)
6928b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      << true << FileName;
6938b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    HadError = true;
6948b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  }
695a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
696a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
697a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a header declaration.
698a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///
699a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///   header-declaration:
700a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///     'header' string-literal
701a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorvoid ModuleMapParser::parseHeaderDecl() {
702a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  assert(Tok.is(MMToken::HeaderKeyword));
703c96c7218b9968f0f4bd30c25e79aca638a3249b6Benjamin Kramer  consumeToken();
704c96c7218b9968f0f4bd30c25e79aca638a3249b6Benjamin Kramer
705a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse the header name.
706a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (!Tok.is(MMToken::StringLiteral)) {
707a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
708a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      << "header";
709a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    HadError = true;
710a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return;
711a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  }
712a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  StringRef FileName = Tok.getString();
713a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  SourceLocation FileNameLoc = consumeToken();
714a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
7158b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // Look for this file.
7168b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  llvm::SmallString<128> PathName;
71718ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  if (llvm::sys::path::is_relative(FileName)) {
71818ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor    // FIXME: Change this search to also look for private headers!
71918ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor    PathName += Directory->getName();
72018ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor
72118ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor    if (ActiveModule->isPartOfFramework())
72218ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor      llvm::sys::path::append(PathName, "Headers");
72318ee547b6926cacefa15eed8ca60ff73d22e279bDouglas Gregor  }
724a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor
7258b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  llvm::sys::path::append(PathName, FileName);
7268b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor
7278b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // FIXME: We shouldn't be eagerly stat'ing every file named in a module map.
7288b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  // Come up with a lazy way to do this.
7298b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  if (const FileEntry *File = SourceMgr.getFileManager().getFile(PathName)) {
7308b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    if (const Module *OwningModule = Map.Headers[File]) {
7318b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      Diags.Report(FileNameLoc, diag::err_mmap_header_conflict)
7328b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor        << FileName << OwningModule->getFullModuleName();
7338b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      HadError = true;
7348b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    } else {
7358b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      // Record this file.
7368b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      ActiveModule->Headers.push_back(File);
7378b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      Map.Headers[File] = ActiveModule;
7388b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    }
7398b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  } else {
7408b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    Diags.Report(FileNameLoc, diag::err_mmap_header_not_found)
7418b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor      << false << FileName;
7428b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor    HadError = true;
7438b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  }
744a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
745a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
74690db26000aefe9335370013eec64c85232d80227Douglas Gregor/// \brief Parse a module export declaration.
74790db26000aefe9335370013eec64c85232d80227Douglas Gregor///
74890db26000aefe9335370013eec64c85232d80227Douglas Gregor///   export-declaration:
74990db26000aefe9335370013eec64c85232d80227Douglas Gregor///     'export' wildcard-module-id
75090db26000aefe9335370013eec64c85232d80227Douglas Gregor///
75190db26000aefe9335370013eec64c85232d80227Douglas Gregor///   wildcard-module-id:
75290db26000aefe9335370013eec64c85232d80227Douglas Gregor///     identifier
75390db26000aefe9335370013eec64c85232d80227Douglas Gregor///     '*'
75490db26000aefe9335370013eec64c85232d80227Douglas Gregor///     identifier '.' wildcard-module-id
75590db26000aefe9335370013eec64c85232d80227Douglas Gregorvoid ModuleMapParser::parseExportDecl() {
75690db26000aefe9335370013eec64c85232d80227Douglas Gregor  assert(Tok.is(MMToken::ExportKeyword));
75790db26000aefe9335370013eec64c85232d80227Douglas Gregor  SourceLocation ExportLoc = consumeToken();
75890db26000aefe9335370013eec64c85232d80227Douglas Gregor
75990db26000aefe9335370013eec64c85232d80227Douglas Gregor  // Parse the module-id with an optional wildcard at the end.
76090db26000aefe9335370013eec64c85232d80227Douglas Gregor  ModuleId ParsedModuleId;
76190db26000aefe9335370013eec64c85232d80227Douglas Gregor  bool Wildcard = false;
76290db26000aefe9335370013eec64c85232d80227Douglas Gregor  do {
76390db26000aefe9335370013eec64c85232d80227Douglas Gregor    if (Tok.is(MMToken::Identifier)) {
76490db26000aefe9335370013eec64c85232d80227Douglas Gregor      ParsedModuleId.push_back(std::make_pair(Tok.getString(),
76590db26000aefe9335370013eec64c85232d80227Douglas Gregor                                              Tok.getLocation()));
76690db26000aefe9335370013eec64c85232d80227Douglas Gregor      consumeToken();
76790db26000aefe9335370013eec64c85232d80227Douglas Gregor
76890db26000aefe9335370013eec64c85232d80227Douglas Gregor      if (Tok.is(MMToken::Period)) {
76990db26000aefe9335370013eec64c85232d80227Douglas Gregor        consumeToken();
77090db26000aefe9335370013eec64c85232d80227Douglas Gregor        continue;
77190db26000aefe9335370013eec64c85232d80227Douglas Gregor      }
77290db26000aefe9335370013eec64c85232d80227Douglas Gregor
77390db26000aefe9335370013eec64c85232d80227Douglas Gregor      break;
77490db26000aefe9335370013eec64c85232d80227Douglas Gregor    }
77590db26000aefe9335370013eec64c85232d80227Douglas Gregor
77690db26000aefe9335370013eec64c85232d80227Douglas Gregor    if(Tok.is(MMToken::Star)) {
77790db26000aefe9335370013eec64c85232d80227Douglas Gregor      Wildcard = true;
7780adaa880993ad23186c87c7f98e7a3fd2697742cDouglas Gregor      consumeToken();
77990db26000aefe9335370013eec64c85232d80227Douglas Gregor      break;
78090db26000aefe9335370013eec64c85232d80227Douglas Gregor    }
78190db26000aefe9335370013eec64c85232d80227Douglas Gregor
78290db26000aefe9335370013eec64c85232d80227Douglas Gregor    Diags.Report(Tok.getLocation(), diag::err_mmap_export_module_id);
78390db26000aefe9335370013eec64c85232d80227Douglas Gregor    HadError = true;
78490db26000aefe9335370013eec64c85232d80227Douglas Gregor    return;
78590db26000aefe9335370013eec64c85232d80227Douglas Gregor  } while (true);
78690db26000aefe9335370013eec64c85232d80227Douglas Gregor
78790db26000aefe9335370013eec64c85232d80227Douglas Gregor  Module::UnresolvedExportDecl Unresolved = {
78890db26000aefe9335370013eec64c85232d80227Douglas Gregor    ExportLoc, ParsedModuleId, Wildcard
78990db26000aefe9335370013eec64c85232d80227Douglas Gregor  };
79090db26000aefe9335370013eec64c85232d80227Douglas Gregor  ActiveModule->UnresolvedExports.push_back(Unresolved);
79190db26000aefe9335370013eec64c85232d80227Douglas Gregor}
79290db26000aefe9335370013eec64c85232d80227Douglas Gregor
793a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor/// \brief Parse a module map file.
794a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///
795a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///   module-map-file:
796a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor///     module-declaration*
797a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorbool ModuleMapParser::parseModuleMapFile() {
798a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  do {
799a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    switch (Tok.Kind) {
800a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::EndOfFile:
801a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      return HadError;
802a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
803a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::ModuleKeyword:
804a865405e4155e8ea83d7ff1a1d8316907c300897Douglas Gregor    case MMToken::FrameworkKeyword:
805a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      parseModuleDecl();
806a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
807a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
808a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::ExplicitKeyword:
80990db26000aefe9335370013eec64c85232d80227Douglas Gregor    case MMToken::ExportKeyword:
810a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::HeaderKeyword:
811a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::Identifier:
812a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::LBrace:
81390db26000aefe9335370013eec64c85232d80227Douglas Gregor    case MMToken::Period:
814a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::RBrace:
81590db26000aefe9335370013eec64c85232d80227Douglas Gregor    case MMToken::Star:
816a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::StringLiteral:
817a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    case MMToken::UmbrellaKeyword:
818a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
819a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      HadError = true;
820a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      consumeToken();
821a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor      break;
822a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    }
823a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  } while (true);
824a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
825a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  return HadError;
826a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
827a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
828a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregorbool ModuleMap::parseModuleMapFile(const FileEntry *File) {
829a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  FileID ID = SourceMgr->createFileID(File, SourceLocation(), SrcMgr::C_User);
830a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  const llvm::MemoryBuffer *Buffer = SourceMgr->getBuffer(ID);
831a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  if (!Buffer)
832a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor    return true;
833a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
834a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  // Parse this module map file.
835a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Lexer L(ID, SourceMgr->getBuffer(ID), *SourceMgr, LangOpts);
836a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Diags->getClient()->BeginSourceFile(LangOpts);
8378b6d3deb5af464e1afbbeccdec369c5d4252b1a0Douglas Gregor  ModuleMapParser Parser(L, *SourceMgr, *Diags, *this, File->getDir());
838a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  bool Result = Parser.parseModuleMapFile();
839a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  Diags->getClient()->EndSourceFile();
840a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor
841a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor  return Result;
842a30cfe5026b12c28b7b575b48176e0a3543ce939Douglas Gregor}
843