]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/llvm/tools/clang/lib/Lex/ModuleMap.cpp
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / contrib / llvm / tools / clang / lib / Lex / ModuleMap.cpp
1 //===--- ModuleMap.cpp - Describe the layout of modules ---------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines the ModuleMap implementation, which describes the layout
11 // of a module as it relates to headers.
12 //
13 //===----------------------------------------------------------------------===//
14 #include "clang/Lex/ModuleMap.h"
15 #include "clang/Basic/CharInfo.h"
16 #include "clang/Basic/Diagnostic.h"
17 #include "clang/Basic/DiagnosticOptions.h"
18 #include "clang/Basic/FileManager.h"
19 #include "clang/Basic/TargetInfo.h"
20 #include "clang/Basic/TargetOptions.h"
21 #include "clang/Lex/HeaderSearch.h"
22 #include "clang/Lex/LexDiagnostic.h"
23 #include "clang/Lex/Lexer.h"
24 #include "clang/Lex/LiteralSupport.h"
25 #include "llvm/ADT/StringRef.h"
26 #include "llvm/ADT/StringSwitch.h"
27 #include "llvm/Support/Allocator.h"
28 #include "llvm/Support/FileSystem.h"
29 #include "llvm/Support/Host.h"
30 #include "llvm/Support/Path.h"
31 #include "llvm/Support/raw_ostream.h"
32 #include <stdlib.h>
33 #if defined(LLVM_ON_UNIX)
34 #include <limits.h>
35 #endif
36 using namespace clang;
37
38 Module::ExportDecl 
39 ModuleMap::resolveExport(Module *Mod, 
40                          const Module::UnresolvedExportDecl &Unresolved,
41                          bool Complain) const {
42   // We may have just a wildcard.
43   if (Unresolved.Id.empty()) {
44     assert(Unresolved.Wildcard && "Invalid unresolved export");
45     return Module::ExportDecl(0, true);
46   }
47   
48   // Resolve the module-id.
49   Module *Context = resolveModuleId(Unresolved.Id, Mod, Complain);
50   if (!Context)
51     return Module::ExportDecl();
52
53   return Module::ExportDecl(Context, Unresolved.Wildcard);
54 }
55
56 Module *ModuleMap::resolveModuleId(const ModuleId &Id, Module *Mod,
57                                    bool Complain) const {
58   // Find the starting module.
59   Module *Context = lookupModuleUnqualified(Id[0].first, Mod);
60   if (!Context) {
61     if (Complain)
62       Diags->Report(Id[0].second, diag::err_mmap_missing_module_unqualified)
63       << Id[0].first << Mod->getFullModuleName();
64
65     return 0;
66   }
67
68   // Dig into the module path.
69   for (unsigned I = 1, N = Id.size(); I != N; ++I) {
70     Module *Sub = lookupModuleQualified(Id[I].first, Context);
71     if (!Sub) {
72       if (Complain)
73         Diags->Report(Id[I].second, diag::err_mmap_missing_module_qualified)
74         << Id[I].first << Context->getFullModuleName()
75         << SourceRange(Id[0].second, Id[I-1].second);
76
77       return 0;
78     }
79
80     Context = Sub;
81   }
82
83   return Context;
84 }
85
86 ModuleMap::ModuleMap(SourceManager &SourceMgr, DiagnosticConsumer &DC,
87                      const LangOptions &LangOpts, const TargetInfo *Target,
88                      HeaderSearch &HeaderInfo)
89     : SourceMgr(SourceMgr), LangOpts(LangOpts), Target(Target),
90       HeaderInfo(HeaderInfo), BuiltinIncludeDir(0), CompilingModule(0),
91       SourceModule(0) {
92   IntrusiveRefCntPtr<DiagnosticIDs> DiagIDs(new DiagnosticIDs);
93   Diags = IntrusiveRefCntPtr<DiagnosticsEngine>(
94             new DiagnosticsEngine(DiagIDs, new DiagnosticOptions));
95   Diags->setClient(new ForwardingDiagnosticConsumer(DC),
96                    /*ShouldOwnClient=*/true);
97   Diags->setSourceManager(&SourceMgr);
98 }
99
100 ModuleMap::~ModuleMap() {
101   for (llvm::StringMap<Module *>::iterator I = Modules.begin(), 
102                                         IEnd = Modules.end();
103        I != IEnd; ++I) {
104     delete I->getValue();
105   }
106 }
107
108 void ModuleMap::setTarget(const TargetInfo &Target) {
109   assert((!this->Target || this->Target == &Target) && 
110          "Improper target override");
111   this->Target = &Target;
112 }
113
114 /// \brief "Sanitize" a filename so that it can be used as an identifier.
115 static StringRef sanitizeFilenameAsIdentifier(StringRef Name,
116                                               SmallVectorImpl<char> &Buffer) {
117   if (Name.empty())
118     return Name;
119
120   if (!isValidIdentifier(Name)) {
121     // If we don't already have something with the form of an identifier,
122     // create a buffer with the sanitized name.
123     Buffer.clear();
124     if (isDigit(Name[0]))
125       Buffer.push_back('_');
126     Buffer.reserve(Buffer.size() + Name.size());
127     for (unsigned I = 0, N = Name.size(); I != N; ++I) {
128       if (isIdentifierBody(Name[I]))
129         Buffer.push_back(Name[I]);
130       else
131         Buffer.push_back('_');
132     }
133
134     Name = StringRef(Buffer.data(), Buffer.size());
135   }
136
137   while (llvm::StringSwitch<bool>(Name)
138 #define KEYWORD(Keyword,Conditions) .Case(#Keyword, true)
139 #define ALIAS(Keyword, AliasOf, Conditions) .Case(Keyword, true)
140 #include "clang/Basic/TokenKinds.def"
141            .Default(false)) {
142     if (Name.data() != Buffer.data())
143       Buffer.append(Name.begin(), Name.end());
144     Buffer.push_back('_');
145     Name = StringRef(Buffer.data(), Buffer.size());
146   }
147
148   return Name;
149 }
150
151 /// \brief Determine whether the given file name is the name of a builtin
152 /// header, supplied by Clang to replace, override, or augment existing system
153 /// headers.
154 static bool isBuiltinHeader(StringRef FileName) {
155   return llvm::StringSwitch<bool>(FileName)
156            .Case("float.h", true)
157            .Case("iso646.h", true)
158            .Case("limits.h", true)
159            .Case("stdalign.h", true)
160            .Case("stdarg.h", true)
161            .Case("stdbool.h", true)
162            .Case("stddef.h", true)
163            .Case("stdint.h", true)
164            .Case("tgmath.h", true)
165            .Case("unwind.h", true)
166            .Default(false);
167 }
168
169 ModuleMap::KnownHeader
170 ModuleMap::findModuleForHeader(const FileEntry *File,
171                                Module *RequestingModule) {
172   HeadersMap::iterator Known = Headers.find(File);
173   if (Known != Headers.end()) {
174     ModuleMap::KnownHeader Result = KnownHeader();
175
176     // Iterate over all modules that 'File' is part of to find the best fit.
177     for (SmallVectorImpl<KnownHeader>::iterator I = Known->second.begin(),
178                                                 E = Known->second.end();
179          I != E; ++I) {
180       // Cannot use a module if the header is excluded or unavailable in it.
181       if (I->getRole() == ModuleMap::ExcludedHeader ||
182           !I->getModule()->isAvailable())
183         continue;
184
185       // If 'File' is part of 'RequestingModule', 'RequestingModule' is the
186       // module we are looking for.
187       if (I->getModule() == RequestingModule)
188         return *I;
189
190       // If uses need to be specified explicitly, we are only allowed to return
191       // modules that are explicitly used by the requesting module.
192       if (RequestingModule && LangOpts.ModulesDeclUse &&
193           std::find(RequestingModule->DirectUses.begin(),
194                     RequestingModule->DirectUses.end(),
195                     I->getModule()) == RequestingModule->DirectUses.end())
196         continue;
197       Result = *I;
198       // If 'File' is a public header of this module, this is as good as we
199       // are going to get.
200       if (I->getRole() == ModuleMap::NormalHeader)
201         break;
202     }
203     return Result;
204   }
205
206   // If we've found a builtin header within Clang's builtin include directory,
207   // load all of the module maps to see if it will get associated with a
208   // specific module (e.g., in /usr/include).
209   if (File->getDir() == BuiltinIncludeDir &&
210       isBuiltinHeader(llvm::sys::path::filename(File->getName()))) {
211     HeaderInfo.loadTopLevelSystemModules();
212
213     // Check again.
214     if (Headers.find(File) != Headers.end())
215       return findModuleForHeader(File, RequestingModule);
216   }
217   
218   const DirectoryEntry *Dir = File->getDir();
219   SmallVector<const DirectoryEntry *, 2> SkippedDirs;
220
221   // Note: as an egregious but useful hack we use the real path here, because
222   // frameworks moving from top-level frameworks to embedded frameworks tend
223   // to be symlinked from the top-level location to the embedded location,
224   // and we need to resolve lookups as if we had found the embedded location.
225   StringRef DirName = SourceMgr.getFileManager().getCanonicalName(Dir);
226
227   // Keep walking up the directory hierarchy, looking for a directory with
228   // an umbrella header.
229   do {    
230     llvm::DenseMap<const DirectoryEntry *, Module *>::iterator KnownDir
231       = UmbrellaDirs.find(Dir);
232     if (KnownDir != UmbrellaDirs.end()) {
233       Module *Result = KnownDir->second;
234       
235       // Search up the module stack until we find a module with an umbrella
236       // directory.
237       Module *UmbrellaModule = Result;
238       while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
239         UmbrellaModule = UmbrellaModule->Parent;
240
241       if (UmbrellaModule->InferSubmodules) {
242         // Infer submodules for each of the directories we found between
243         // the directory of the umbrella header and the directory where 
244         // the actual header is located.
245         bool Explicit = UmbrellaModule->InferExplicitSubmodules;
246         
247         for (unsigned I = SkippedDirs.size(); I != 0; --I) {
248           // Find or create the module that corresponds to this directory name.
249           SmallString<32> NameBuf;
250           StringRef Name = sanitizeFilenameAsIdentifier(
251                              llvm::sys::path::stem(SkippedDirs[I-1]->getName()),
252                              NameBuf);
253           Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
254                                       Explicit).first;
255           
256           // Associate the module and the directory.
257           UmbrellaDirs[SkippedDirs[I-1]] = Result;
258
259           // If inferred submodules export everything they import, add a 
260           // wildcard to the set of exports.
261           if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
262             Result->Exports.push_back(Module::ExportDecl(0, true));
263         }
264         
265         // Infer a submodule with the same name as this header file.
266         SmallString<32> NameBuf;
267         StringRef Name = sanitizeFilenameAsIdentifier(
268                            llvm::sys::path::stem(File->getName()), NameBuf);
269         Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
270                                     Explicit).first;
271         Result->addTopHeader(File);
272         
273         // If inferred submodules export everything they import, add a 
274         // wildcard to the set of exports.
275         if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
276           Result->Exports.push_back(Module::ExportDecl(0, true));
277       } else {
278         // Record each of the directories we stepped through as being part of
279         // the module we found, since the umbrella header covers them all.
280         for (unsigned I = 0, N = SkippedDirs.size(); I != N; ++I)
281           UmbrellaDirs[SkippedDirs[I]] = Result;
282       }
283       
284       Headers[File].push_back(KnownHeader(Result, NormalHeader));
285
286       // If a header corresponds to an unavailable module, don't report
287       // that it maps to anything.
288       if (!Result->isAvailable())
289         return KnownHeader();
290
291       return Headers[File].back();
292     }
293     
294     SkippedDirs.push_back(Dir);
295     
296     // Retrieve our parent path.
297     DirName = llvm::sys::path::parent_path(DirName);
298     if (DirName.empty())
299       break;
300     
301     // Resolve the parent path to a directory entry.
302     Dir = SourceMgr.getFileManager().getDirectory(DirName);
303   } while (Dir);
304   
305   return KnownHeader();
306 }
307
308 bool ModuleMap::isHeaderInUnavailableModule(const FileEntry *Header) const {
309   HeadersMap::const_iterator Known = Headers.find(Header);
310   if (Known != Headers.end()) {
311     for (SmallVectorImpl<KnownHeader>::const_iterator
312              I = Known->second.begin(),
313              E = Known->second.end();
314          I != E; ++I) {
315       if (I->isAvailable())
316         return false;
317     }
318     return true;
319   }
320   
321   const DirectoryEntry *Dir = Header->getDir();
322   SmallVector<const DirectoryEntry *, 2> SkippedDirs;
323   StringRef DirName = Dir->getName();
324
325   // Keep walking up the directory hierarchy, looking for a directory with
326   // an umbrella header.
327   do {    
328     llvm::DenseMap<const DirectoryEntry *, Module *>::const_iterator KnownDir
329       = UmbrellaDirs.find(Dir);
330     if (KnownDir != UmbrellaDirs.end()) {
331       Module *Found = KnownDir->second;
332       if (!Found->isAvailable())
333         return true;
334
335       // Search up the module stack until we find a module with an umbrella
336       // directory.
337       Module *UmbrellaModule = Found;
338       while (!UmbrellaModule->getUmbrellaDir() && UmbrellaModule->Parent)
339         UmbrellaModule = UmbrellaModule->Parent;
340
341       if (UmbrellaModule->InferSubmodules) {
342         for (unsigned I = SkippedDirs.size(); I != 0; --I) {
343           // Find or create the module that corresponds to this directory name.
344           SmallString<32> NameBuf;
345           StringRef Name = sanitizeFilenameAsIdentifier(
346                              llvm::sys::path::stem(SkippedDirs[I-1]->getName()),
347                              NameBuf);
348           Found = lookupModuleQualified(Name, Found);
349           if (!Found)
350             return false;
351           if (!Found->isAvailable())
352             return true;
353         }
354         
355         // Infer a submodule with the same name as this header file.
356         SmallString<32> NameBuf;
357         StringRef Name = sanitizeFilenameAsIdentifier(
358                            llvm::sys::path::stem(Header->getName()),
359                            NameBuf);
360         Found = lookupModuleQualified(Name, Found);
361         if (!Found)
362           return false;
363       }
364
365       return !Found->isAvailable();
366     }
367     
368     SkippedDirs.push_back(Dir);
369     
370     // Retrieve our parent path.
371     DirName = llvm::sys::path::parent_path(DirName);
372     if (DirName.empty())
373       break;
374     
375     // Resolve the parent path to a directory entry.
376     Dir = SourceMgr.getFileManager().getDirectory(DirName);
377   } while (Dir);
378   
379   return false;
380 }
381
382 Module *ModuleMap::findModule(StringRef Name) const {
383   llvm::StringMap<Module *>::const_iterator Known = Modules.find(Name);
384   if (Known != Modules.end())
385     return Known->getValue();
386   
387   return 0;
388 }
389
390 Module *ModuleMap::lookupModuleUnqualified(StringRef Name,
391                                            Module *Context) const {
392   for(; Context; Context = Context->Parent) {
393     if (Module *Sub = lookupModuleQualified(Name, Context))
394       return Sub;
395   }
396   
397   return findModule(Name);
398 }
399
400 Module *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) const{
401   if (!Context)
402     return findModule(Name);
403   
404   return Context->findSubmodule(Name);
405 }
406
407 std::pair<Module *, bool> 
408 ModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework,
409                               bool IsExplicit) {
410   // Try to find an existing module with this name.
411   if (Module *Sub = lookupModuleQualified(Name, Parent))
412     return std::make_pair(Sub, false);
413   
414   // Create a new module with this name.
415   Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework, 
416                               IsExplicit);
417   if (LangOpts.CurrentModule == Name) {
418     SourceModule = Result;
419     SourceModuleName = Name;
420   }
421   if (!Parent) {
422     Modules[Name] = Result;
423     if (!LangOpts.CurrentModule.empty() && !CompilingModule &&
424         Name == LangOpts.CurrentModule) {
425       CompilingModule = Result;
426     }
427   }
428   return std::make_pair(Result, true);
429 }
430
431 bool ModuleMap::canInferFrameworkModule(const DirectoryEntry *ParentDir,
432                                         StringRef Name, bool &IsSystem) const {
433   // Check whether we have already looked into the parent directory
434   // for a module map.
435   llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator
436     inferred = InferredDirectories.find(ParentDir);
437   if (inferred == InferredDirectories.end())
438     return false;
439
440   if (!inferred->second.InferModules)
441     return false;
442
443   // We're allowed to infer for this directory, but make sure it's okay
444   // to infer this particular module.
445   bool canInfer = std::find(inferred->second.ExcludedModules.begin(),
446                             inferred->second.ExcludedModules.end(),
447                             Name) == inferred->second.ExcludedModules.end();
448
449   if (canInfer && inferred->second.InferSystemModules)
450     IsSystem = true;
451
452   return canInfer;
453 }
454
455 /// \brief For a framework module, infer the framework against which we
456 /// should link.
457 static void inferFrameworkLink(Module *Mod, const DirectoryEntry *FrameworkDir,
458                                FileManager &FileMgr) {
459   assert(Mod->IsFramework && "Can only infer linking for framework modules");
460   assert(!Mod->isSubFramework() &&
461          "Can only infer linking for top-level frameworks");
462
463   SmallString<128> LibName;
464   LibName += FrameworkDir->getName();
465   llvm::sys::path::append(LibName, Mod->Name);
466   if (FileMgr.getFile(LibName)) {
467     Mod->LinkLibraries.push_back(Module::LinkLibrary(Mod->Name,
468                                                      /*IsFramework=*/true));
469   }
470 }
471
472 Module *
473 ModuleMap::inferFrameworkModule(StringRef ModuleName,
474                                 const DirectoryEntry *FrameworkDir,
475                                 bool IsSystem,
476                                 Module *Parent) {
477   // Check whether we've already found this module.
478   if (Module *Mod = lookupModuleQualified(ModuleName, Parent))
479     return Mod;
480   
481   FileManager &FileMgr = SourceMgr.getFileManager();
482
483   // If the framework has a parent path from which we're allowed to infer
484   // a framework module, do so.
485   if (!Parent) {
486     // Determine whether we're allowed to infer a module map.
487
488     // Note: as an egregious but useful hack we use the real path here, because
489     // we might be looking at an embedded framework that symlinks out to a
490     // top-level framework, and we need to infer as if we were naming the
491     // top-level framework.
492     StringRef FrameworkDirName
493       = SourceMgr.getFileManager().getCanonicalName(FrameworkDir);
494
495     bool canInfer = false;
496     if (llvm::sys::path::has_parent_path(FrameworkDirName)) {
497       // Figure out the parent path.
498       StringRef Parent = llvm::sys::path::parent_path(FrameworkDirName);
499       if (const DirectoryEntry *ParentDir = FileMgr.getDirectory(Parent)) {
500         // Check whether we have already looked into the parent directory
501         // for a module map.
502         llvm::DenseMap<const DirectoryEntry *, InferredDirectory>::const_iterator
503           inferred = InferredDirectories.find(ParentDir);
504         if (inferred == InferredDirectories.end()) {
505           // We haven't looked here before. Load a module map, if there is
506           // one.
507           SmallString<128> ModMapPath = Parent;
508           llvm::sys::path::append(ModMapPath, "module.map");
509           if (const FileEntry *ModMapFile = FileMgr.getFile(ModMapPath)) {
510             parseModuleMapFile(ModMapFile, IsSystem);
511             inferred = InferredDirectories.find(ParentDir);
512           }
513
514           if (inferred == InferredDirectories.end())
515             inferred = InferredDirectories.insert(
516                          std::make_pair(ParentDir, InferredDirectory())).first;
517         }
518
519         if (inferred->second.InferModules) {
520           // We're allowed to infer for this directory, but make sure it's okay
521           // to infer this particular module.
522           StringRef Name = llvm::sys::path::stem(FrameworkDirName);
523           canInfer = std::find(inferred->second.ExcludedModules.begin(),
524                                inferred->second.ExcludedModules.end(),
525                                Name) == inferred->second.ExcludedModules.end();
526
527           if (inferred->second.InferSystemModules)
528             IsSystem = true;
529         }
530       }
531     }
532
533     // If we're not allowed to infer a framework module, don't.
534     if (!canInfer)
535       return 0;
536   }
537
538
539   // Look for an umbrella header.
540   SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName());
541   llvm::sys::path::append(UmbrellaName, "Headers", ModuleName + ".h");
542   const FileEntry *UmbrellaHeader = FileMgr.getFile(UmbrellaName);
543   
544   // FIXME: If there's no umbrella header, we could probably scan the
545   // framework to load *everything*. But, it's not clear that this is a good
546   // idea.
547   if (!UmbrellaHeader)
548     return 0;
549   
550   Module *Result = new Module(ModuleName, SourceLocation(), Parent,
551                               /*IsFramework=*/true, /*IsExplicit=*/false);
552   if (LangOpts.CurrentModule == ModuleName) {
553     SourceModule = Result;
554     SourceModuleName = ModuleName;
555   }
556   if (IsSystem)
557     Result->IsSystem = IsSystem;
558   
559   if (!Parent)
560     Modules[ModuleName] = Result;
561   
562   // umbrella header "umbrella-header-name"
563   Result->Umbrella = UmbrellaHeader;
564   Headers[UmbrellaHeader].push_back(KnownHeader(Result, NormalHeader));
565   UmbrellaDirs[UmbrellaHeader->getDir()] = Result;
566   
567   // export *
568   Result->Exports.push_back(Module::ExportDecl(0, true));
569   
570   // module * { export * }
571   Result->InferSubmodules = true;
572   Result->InferExportWildcard = true;
573   
574   // Look for subframeworks.
575   llvm::error_code EC;
576   SmallString<128> SubframeworksDirName
577     = StringRef(FrameworkDir->getName());
578   llvm::sys::path::append(SubframeworksDirName, "Frameworks");
579   llvm::sys::path::native(SubframeworksDirName);
580   for (llvm::sys::fs::directory_iterator 
581          Dir(SubframeworksDirName.str(), EC), DirEnd;
582        Dir != DirEnd && !EC; Dir.increment(EC)) {
583     if (!StringRef(Dir->path()).endswith(".framework"))
584       continue;
585
586     if (const DirectoryEntry *SubframeworkDir
587           = FileMgr.getDirectory(Dir->path())) {
588       // Note: as an egregious but useful hack, we use the real path here and
589       // check whether it is actually a subdirectory of the parent directory.
590       // This will not be the case if the 'subframework' is actually a symlink
591       // out to a top-level framework.
592       StringRef SubframeworkDirName = FileMgr.getCanonicalName(SubframeworkDir);
593       bool FoundParent = false;
594       do {
595         // Get the parent directory name.
596         SubframeworkDirName
597           = llvm::sys::path::parent_path(SubframeworkDirName);
598         if (SubframeworkDirName.empty())
599           break;
600
601         if (FileMgr.getDirectory(SubframeworkDirName) == FrameworkDir) {
602           FoundParent = true;
603           break;
604         }
605       } while (true);
606
607       if (!FoundParent)
608         continue;
609
610       // FIXME: Do we want to warn about subframeworks without umbrella headers?
611       SmallString<32> NameBuf;
612       inferFrameworkModule(sanitizeFilenameAsIdentifier(
613                              llvm::sys::path::stem(Dir->path()), NameBuf),
614                            SubframeworkDir, IsSystem, Result);
615     }
616   }
617
618   // If the module is a top-level framework, automatically link against the
619   // framework.
620   if (!Result->isSubFramework()) {
621     inferFrameworkLink(Result, FrameworkDir, FileMgr);
622   }
623
624   return Result;
625 }
626
627 void ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader){
628   Headers[UmbrellaHeader].push_back(KnownHeader(Mod, NormalHeader));
629   Mod->Umbrella = UmbrellaHeader;
630   UmbrellaDirs[UmbrellaHeader->getDir()] = Mod;
631 }
632
633 void ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir) {
634   Mod->Umbrella = UmbrellaDir;
635   UmbrellaDirs[UmbrellaDir] = Mod;
636 }
637
638 void ModuleMap::addHeader(Module *Mod, const FileEntry *Header,
639                           ModuleHeaderRole Role) {
640   if (Role == ExcludedHeader) {
641     Mod->ExcludedHeaders.push_back(Header);
642   } else {
643     if (Role == PrivateHeader)
644       Mod->PrivateHeaders.push_back(Header);
645     else
646       Mod->NormalHeaders.push_back(Header);
647     bool isCompilingModuleHeader = Mod->getTopLevelModule() == CompilingModule;
648     HeaderInfo.MarkFileModuleHeader(Header, Role, isCompilingModuleHeader);
649   }
650   Headers[Header].push_back(KnownHeader(Mod, Role));
651 }
652
653 const FileEntry *
654 ModuleMap::getContainingModuleMapFile(Module *Module) const {
655   if (Module->DefinitionLoc.isInvalid())
656     return 0;
657
658   return SourceMgr.getFileEntryForID(
659            SourceMgr.getFileID(Module->DefinitionLoc));
660 }
661
662 void ModuleMap::dump() {
663   llvm::errs() << "Modules:";
664   for (llvm::StringMap<Module *>::iterator M = Modules.begin(), 
665                                         MEnd = Modules.end(); 
666        M != MEnd; ++M)
667     M->getValue()->print(llvm::errs(), 2);
668   
669   llvm::errs() << "Headers:";
670   for (HeadersMap::iterator H = Headers.begin(), HEnd = Headers.end();
671        H != HEnd; ++H) {
672     llvm::errs() << "  \"" << H->first->getName() << "\" -> ";
673     for (SmallVectorImpl<KnownHeader>::const_iterator I = H->second.begin(),
674                                                       E = H->second.end();
675          I != E; ++I) {
676       if (I != H->second.begin())
677         llvm::errs() << ",";
678       llvm::errs() << I->getModule()->getFullModuleName();
679     }
680     llvm::errs() << "\n";
681   }
682 }
683
684 bool ModuleMap::resolveExports(Module *Mod, bool Complain) {
685   bool HadError = false;
686   for (unsigned I = 0, N = Mod->UnresolvedExports.size(); I != N; ++I) {
687     Module::ExportDecl Export = resolveExport(Mod, Mod->UnresolvedExports[I], 
688                                               Complain);
689     if (Export.getPointer() || Export.getInt())
690       Mod->Exports.push_back(Export);
691     else
692       HadError = true;
693   }
694   Mod->UnresolvedExports.clear();
695   return HadError;
696 }
697
698 bool ModuleMap::resolveUses(Module *Mod, bool Complain) {
699   bool HadError = false;
700   for (unsigned I = 0, N = Mod->UnresolvedDirectUses.size(); I != N; ++I) {
701     Module *DirectUse =
702         resolveModuleId(Mod->UnresolvedDirectUses[I], Mod, Complain);
703     if (DirectUse)
704       Mod->DirectUses.push_back(DirectUse);
705     else
706       HadError = true;
707   }
708   Mod->UnresolvedDirectUses.clear();
709   return HadError;
710 }
711
712 bool ModuleMap::resolveConflicts(Module *Mod, bool Complain) {
713   bool HadError = false;
714   for (unsigned I = 0, N = Mod->UnresolvedConflicts.size(); I != N; ++I) {
715     Module *OtherMod = resolveModuleId(Mod->UnresolvedConflicts[I].Id,
716                                        Mod, Complain);
717     if (!OtherMod) {
718       HadError = true;
719       continue;
720     }
721
722     Module::Conflict Conflict;
723     Conflict.Other = OtherMod;
724     Conflict.Message = Mod->UnresolvedConflicts[I].Message;
725     Mod->Conflicts.push_back(Conflict);
726   }
727   Mod->UnresolvedConflicts.clear();
728   return HadError;
729 }
730
731 Module *ModuleMap::inferModuleFromLocation(FullSourceLoc Loc) {
732   if (Loc.isInvalid())
733     return 0;
734   
735   // Use the expansion location to determine which module we're in.
736   FullSourceLoc ExpansionLoc = Loc.getExpansionLoc();
737   if (!ExpansionLoc.isFileID())
738     return 0;  
739   
740   
741   const SourceManager &SrcMgr = Loc.getManager();
742   FileID ExpansionFileID = ExpansionLoc.getFileID();
743   
744   while (const FileEntry *ExpansionFile
745            = SrcMgr.getFileEntryForID(ExpansionFileID)) {
746     // Find the module that owns this header (if any).
747     if (Module *Mod = findModuleForHeader(ExpansionFile).getModule())
748       return Mod;
749     
750     // No module owns this header, so look up the inclusion chain to see if
751     // any included header has an associated module.
752     SourceLocation IncludeLoc = SrcMgr.getIncludeLoc(ExpansionFileID);
753     if (IncludeLoc.isInvalid())
754       return 0;
755     
756     ExpansionFileID = SrcMgr.getFileID(IncludeLoc);
757   }
758   
759   return 0;
760 }
761
762 //----------------------------------------------------------------------------//
763 // Module map file parser
764 //----------------------------------------------------------------------------//
765
766 namespace clang {
767   /// \brief A token in a module map file.
768   struct MMToken {
769     enum TokenKind {
770       Comma,
771       ConfigMacros,
772       Conflict,
773       EndOfFile,
774       HeaderKeyword,
775       Identifier,
776       Exclaim,
777       ExcludeKeyword,
778       ExplicitKeyword,
779       ExportKeyword,
780       ExternKeyword,
781       FrameworkKeyword,
782       LinkKeyword,
783       ModuleKeyword,
784       Period,
785       PrivateKeyword,
786       UmbrellaKeyword,
787       UseKeyword,
788       RequiresKeyword,
789       Star,
790       StringLiteral,
791       LBrace,
792       RBrace,
793       LSquare,
794       RSquare
795     } Kind;
796     
797     unsigned Location;
798     unsigned StringLength;
799     const char *StringData;
800     
801     void clear() {
802       Kind = EndOfFile;
803       Location = 0;
804       StringLength = 0;
805       StringData = 0;
806     }
807     
808     bool is(TokenKind K) const { return Kind == K; }
809     
810     SourceLocation getLocation() const {
811       return SourceLocation::getFromRawEncoding(Location);
812     }
813     
814     StringRef getString() const {
815       return StringRef(StringData, StringLength);
816     }
817   };
818
819   /// \brief The set of attributes that can be attached to a module.
820   struct Attributes {
821     Attributes() : IsSystem(), IsExhaustive() { }
822
823     /// \brief Whether this is a system module.
824     unsigned IsSystem : 1;
825
826     /// \brief Whether this is an exhaustive set of configuration macros.
827     unsigned IsExhaustive : 1;
828   };
829   
830
831   class ModuleMapParser {
832     Lexer &L;
833     SourceManager &SourceMgr;
834
835     /// \brief Default target information, used only for string literal
836     /// parsing.
837     const TargetInfo *Target;
838
839     DiagnosticsEngine &Diags;
840     ModuleMap &Map;
841     
842     /// \brief The directory that this module map resides in.
843     const DirectoryEntry *Directory;
844
845     /// \brief The directory containing Clang-supplied headers.
846     const DirectoryEntry *BuiltinIncludeDir;
847
848     /// \brief Whether this module map is in a system header directory.
849     bool IsSystem;
850     
851     /// \brief Whether an error occurred.
852     bool HadError;
853         
854     /// \brief Stores string data for the various string literals referenced
855     /// during parsing.
856     llvm::BumpPtrAllocator StringData;
857     
858     /// \brief The current token.
859     MMToken Tok;
860     
861     /// \brief The active module.
862     Module *ActiveModule;
863     
864     /// \brief Consume the current token and return its location.
865     SourceLocation consumeToken();
866     
867     /// \brief Skip tokens until we reach the a token with the given kind
868     /// (or the end of the file).
869     void skipUntil(MMToken::TokenKind K);
870
871     typedef SmallVector<std::pair<std::string, SourceLocation>, 2> ModuleId;
872     bool parseModuleId(ModuleId &Id);
873     void parseModuleDecl();
874     void parseExternModuleDecl();
875     void parseRequiresDecl();
876     void parseHeaderDecl(clang::MMToken::TokenKind,
877                          SourceLocation LeadingLoc);
878     void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc);
879     void parseExportDecl();
880     void parseUseDecl();
881     void parseLinkDecl();
882     void parseConfigMacros();
883     void parseConflict();
884     void parseInferredModuleDecl(bool Framework, bool Explicit);
885     bool parseOptionalAttributes(Attributes &Attrs);
886
887     const DirectoryEntry *getOverriddenHeaderSearchDir();
888     
889   public:
890     explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr, 
891                              const TargetInfo *Target,
892                              DiagnosticsEngine &Diags,
893                              ModuleMap &Map,
894                              const DirectoryEntry *Directory,
895                              const DirectoryEntry *BuiltinIncludeDir,
896                              bool IsSystem)
897       : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map), 
898         Directory(Directory), BuiltinIncludeDir(BuiltinIncludeDir),
899         IsSystem(IsSystem), HadError(false), ActiveModule(0)
900     {
901       Tok.clear();
902       consumeToken();
903     }
904     
905     bool parseModuleMapFile();
906   };
907 }
908
909 SourceLocation ModuleMapParser::consumeToken() {
910 retry:
911   SourceLocation Result = Tok.getLocation();
912   Tok.clear();
913   
914   Token LToken;
915   L.LexFromRawLexer(LToken);
916   Tok.Location = LToken.getLocation().getRawEncoding();
917   switch (LToken.getKind()) {
918   case tok::raw_identifier:
919     Tok.StringData = LToken.getRawIdentifierData();
920     Tok.StringLength = LToken.getLength();
921     Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(Tok.getString())
922                  .Case("config_macros", MMToken::ConfigMacros)
923                  .Case("conflict", MMToken::Conflict)
924                  .Case("exclude", MMToken::ExcludeKeyword)
925                  .Case("explicit", MMToken::ExplicitKeyword)
926                  .Case("export", MMToken::ExportKeyword)
927                  .Case("extern", MMToken::ExternKeyword)
928                  .Case("framework", MMToken::FrameworkKeyword)
929                  .Case("header", MMToken::HeaderKeyword)
930                  .Case("link", MMToken::LinkKeyword)
931                  .Case("module", MMToken::ModuleKeyword)
932                  .Case("private", MMToken::PrivateKeyword)
933                  .Case("requires", MMToken::RequiresKeyword)
934                  .Case("umbrella", MMToken::UmbrellaKeyword)
935                  .Case("use", MMToken::UseKeyword)
936                  .Default(MMToken::Identifier);
937     break;
938
939   case tok::comma:
940     Tok.Kind = MMToken::Comma;
941     break;
942
943   case tok::eof:
944     Tok.Kind = MMToken::EndOfFile;
945     break;
946       
947   case tok::l_brace:
948     Tok.Kind = MMToken::LBrace;
949     break;
950
951   case tok::l_square:
952     Tok.Kind = MMToken::LSquare;
953     break;
954       
955   case tok::period:
956     Tok.Kind = MMToken::Period;
957     break;
958       
959   case tok::r_brace:
960     Tok.Kind = MMToken::RBrace;
961     break;
962       
963   case tok::r_square:
964     Tok.Kind = MMToken::RSquare;
965     break;
966       
967   case tok::star:
968     Tok.Kind = MMToken::Star;
969     break;
970       
971   case tok::exclaim:
972     Tok.Kind = MMToken::Exclaim;
973     break;
974       
975   case tok::string_literal: {
976     if (LToken.hasUDSuffix()) {
977       Diags.Report(LToken.getLocation(), diag::err_invalid_string_udl);
978       HadError = true;
979       goto retry;
980     }
981
982     // Parse the string literal.
983     LangOptions LangOpts;
984     StringLiteralParser StringLiteral(&LToken, 1, SourceMgr, LangOpts, *Target);
985     if (StringLiteral.hadError)
986       goto retry;
987     
988     // Copy the string literal into our string data allocator.
989     unsigned Length = StringLiteral.GetStringLength();
990     char *Saved = StringData.Allocate<char>(Length + 1);
991     memcpy(Saved, StringLiteral.GetString().data(), Length);
992     Saved[Length] = 0;
993     
994     // Form the token.
995     Tok.Kind = MMToken::StringLiteral;
996     Tok.StringData = Saved;
997     Tok.StringLength = Length;
998     break;
999   }
1000       
1001   case tok::comment:
1002     goto retry;
1003       
1004   default:
1005     Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token);
1006     HadError = true;
1007     goto retry;
1008   }
1009   
1010   return Result;
1011 }
1012
1013 void ModuleMapParser::skipUntil(MMToken::TokenKind K) {
1014   unsigned braceDepth = 0;
1015   unsigned squareDepth = 0;
1016   do {
1017     switch (Tok.Kind) {
1018     case MMToken::EndOfFile:
1019       return;
1020
1021     case MMToken::LBrace:
1022       if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
1023         return;
1024         
1025       ++braceDepth;
1026       break;
1027
1028     case MMToken::LSquare:
1029       if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
1030         return;
1031       
1032       ++squareDepth;
1033       break;
1034
1035     case MMToken::RBrace:
1036       if (braceDepth > 0)
1037         --braceDepth;
1038       else if (Tok.is(K))
1039         return;
1040       break;
1041
1042     case MMToken::RSquare:
1043       if (squareDepth > 0)
1044         --squareDepth;
1045       else if (Tok.is(K))
1046         return;
1047       break;
1048
1049     default:
1050       if (braceDepth == 0 && squareDepth == 0 && Tok.is(K))
1051         return;
1052       break;
1053     }
1054     
1055    consumeToken();
1056   } while (true);
1057 }
1058
1059 /// \brief Parse a module-id.
1060 ///
1061 ///   module-id:
1062 ///     identifier
1063 ///     identifier '.' module-id
1064 ///
1065 /// \returns true if an error occurred, false otherwise.
1066 bool ModuleMapParser::parseModuleId(ModuleId &Id) {
1067   Id.clear();
1068   do {
1069     if (Tok.is(MMToken::Identifier)) {
1070       Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation()));
1071       consumeToken();
1072     } else {
1073       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name);
1074       return true;
1075     }
1076     
1077     if (!Tok.is(MMToken::Period))
1078       break;
1079     
1080     consumeToken();
1081   } while (true);
1082   
1083   return false;
1084 }
1085
1086 namespace {
1087   /// \brief Enumerates the known attributes.
1088   enum AttributeKind {
1089     /// \brief An unknown attribute.
1090     AT_unknown,
1091     /// \brief The 'system' attribute.
1092     AT_system,
1093     /// \brief The 'exhaustive' attribute.
1094     AT_exhaustive
1095   };
1096 }
1097
1098 /// \brief Parse a module declaration.
1099 ///
1100 ///   module-declaration:
1101 ///     'extern' 'module' module-id string-literal
1102 ///     'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt] 
1103 ///       { module-member* }
1104 ///
1105 ///   module-member:
1106 ///     requires-declaration
1107 ///     header-declaration
1108 ///     submodule-declaration
1109 ///     export-declaration
1110 ///     link-declaration
1111 ///
1112 ///   submodule-declaration:
1113 ///     module-declaration
1114 ///     inferred-submodule-declaration
1115 void ModuleMapParser::parseModuleDecl() {
1116   assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) ||
1117          Tok.is(MMToken::FrameworkKeyword) || Tok.is(MMToken::ExternKeyword));
1118   if (Tok.is(MMToken::ExternKeyword)) {
1119     parseExternModuleDecl();
1120     return;
1121   }
1122
1123   // Parse 'explicit' or 'framework' keyword, if present.
1124   SourceLocation ExplicitLoc;
1125   bool Explicit = false;
1126   bool Framework = false;
1127
1128   // Parse 'explicit' keyword, if present.
1129   if (Tok.is(MMToken::ExplicitKeyword)) {
1130     ExplicitLoc = consumeToken();
1131     Explicit = true;
1132   }
1133
1134   // Parse 'framework' keyword, if present.
1135   if (Tok.is(MMToken::FrameworkKeyword)) {
1136     consumeToken();
1137     Framework = true;
1138   } 
1139   
1140   // Parse 'module' keyword.
1141   if (!Tok.is(MMToken::ModuleKeyword)) {
1142     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1143     consumeToken();
1144     HadError = true;
1145     return;
1146   }
1147   consumeToken(); // 'module' keyword
1148
1149   // If we have a wildcard for the module name, this is an inferred submodule.
1150   // Parse it. 
1151   if (Tok.is(MMToken::Star))
1152     return parseInferredModuleDecl(Framework, Explicit);
1153   
1154   // Parse the module name.
1155   ModuleId Id;
1156   if (parseModuleId(Id)) {
1157     HadError = true;
1158     return;
1159   }
1160
1161   if (ActiveModule) {
1162     if (Id.size() > 1) {
1163       Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id)
1164         << SourceRange(Id.front().second, Id.back().second);
1165       
1166       HadError = true;
1167       return;
1168     }
1169   } else if (Id.size() == 1 && Explicit) {
1170     // Top-level modules can't be explicit.
1171     Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level);
1172     Explicit = false;
1173     ExplicitLoc = SourceLocation();
1174     HadError = true;
1175   }
1176   
1177   Module *PreviousActiveModule = ActiveModule;  
1178   if (Id.size() > 1) {
1179     // This module map defines a submodule. Go find the module of which it
1180     // is a submodule.
1181     ActiveModule = 0;
1182     for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) {
1183       if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) {
1184         ActiveModule = Next;
1185         continue;
1186       }
1187       
1188       if (ActiveModule) {
1189         Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified)
1190           << Id[I].first << ActiveModule->getTopLevelModule();
1191       } else {
1192         Diags.Report(Id[I].second, diag::err_mmap_expected_module_name);
1193       }
1194       HadError = true;
1195       return;
1196     }
1197   } 
1198   
1199   StringRef ModuleName = Id.back().first;
1200   SourceLocation ModuleNameLoc = Id.back().second;
1201   
1202   // Parse the optional attribute list.
1203   Attributes Attrs;
1204   parseOptionalAttributes(Attrs);
1205   
1206   // Parse the opening brace.
1207   if (!Tok.is(MMToken::LBrace)) {
1208     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace)
1209       << ModuleName;
1210     HadError = true;
1211     return;
1212   }  
1213   SourceLocation LBraceLoc = consumeToken();
1214   
1215   // Determine whether this (sub)module has already been defined.
1216   if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) {
1217     if (Existing->DefinitionLoc.isInvalid() && !ActiveModule) {
1218       // Skip the module definition.
1219       skipUntil(MMToken::RBrace);
1220       if (Tok.is(MMToken::RBrace))
1221         consumeToken();
1222       else {
1223         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1224         Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1225         HadError = true;        
1226       }
1227       return;
1228     }
1229     
1230     Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition)
1231       << ModuleName;
1232     Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition);
1233     
1234     // Skip the module definition.
1235     skipUntil(MMToken::RBrace);
1236     if (Tok.is(MMToken::RBrace))
1237       consumeToken();
1238     
1239     HadError = true;
1240     return;
1241   }
1242
1243   // Start defining this module.
1244   ActiveModule = Map.findOrCreateModule(ModuleName, ActiveModule, Framework,
1245                                         Explicit).first;
1246   ActiveModule->DefinitionLoc = ModuleNameLoc;
1247   if (Attrs.IsSystem || IsSystem)
1248     ActiveModule->IsSystem = true;
1249   
1250   bool Done = false;
1251   do {
1252     switch (Tok.Kind) {
1253     case MMToken::EndOfFile:
1254     case MMToken::RBrace:
1255       Done = true;
1256       break;
1257
1258     case MMToken::ConfigMacros:
1259       parseConfigMacros();
1260       break;
1261
1262     case MMToken::Conflict:
1263       parseConflict();
1264       break;
1265
1266     case MMToken::ExplicitKeyword:
1267     case MMToken::ExternKeyword:
1268     case MMToken::FrameworkKeyword:
1269     case MMToken::ModuleKeyword:
1270       parseModuleDecl();
1271       break;
1272
1273     case MMToken::ExportKeyword:
1274       parseExportDecl();
1275       break;
1276
1277     case MMToken::UseKeyword:
1278       parseUseDecl();
1279       break;
1280         
1281     case MMToken::RequiresKeyword:
1282       parseRequiresDecl();
1283       break;
1284
1285     case MMToken::UmbrellaKeyword: {
1286       SourceLocation UmbrellaLoc = consumeToken();
1287       if (Tok.is(MMToken::HeaderKeyword))
1288         parseHeaderDecl(MMToken::UmbrellaKeyword, UmbrellaLoc);
1289       else
1290         parseUmbrellaDirDecl(UmbrellaLoc);
1291       break;
1292     }
1293         
1294     case MMToken::ExcludeKeyword: {
1295       SourceLocation ExcludeLoc = consumeToken();
1296       if (Tok.is(MMToken::HeaderKeyword)) {
1297         parseHeaderDecl(MMToken::ExcludeKeyword, ExcludeLoc);
1298       } else {
1299         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1300           << "exclude";
1301       }
1302       break;
1303     }
1304       
1305     case MMToken::PrivateKeyword: {
1306       SourceLocation PrivateLoc = consumeToken();
1307       if (Tok.is(MMToken::HeaderKeyword)) {
1308         parseHeaderDecl(MMToken::PrivateKeyword, PrivateLoc);
1309       } else {
1310         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1311           << "private";
1312       }
1313       break;
1314     }
1315       
1316     case MMToken::HeaderKeyword:
1317       parseHeaderDecl(MMToken::HeaderKeyword, SourceLocation());
1318       break;
1319
1320     case MMToken::LinkKeyword:
1321       parseLinkDecl();
1322       break;
1323
1324     default:
1325       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member);
1326       consumeToken();
1327       break;        
1328     }
1329   } while (!Done);
1330
1331   if (Tok.is(MMToken::RBrace))
1332     consumeToken();
1333   else {
1334     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1335     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1336     HadError = true;
1337   }
1338
1339   // If the active module is a top-level framework, and there are no link
1340   // libraries, automatically link against the framework.
1341   if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() &&
1342       ActiveModule->LinkLibraries.empty()) {
1343     inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager());
1344   }
1345
1346   // We're done parsing this module. Pop back to the previous module.
1347   ActiveModule = PreviousActiveModule;
1348 }
1349
1350 /// \brief Parse an extern module declaration.
1351 ///
1352 ///   extern module-declaration:
1353 ///     'extern' 'module' module-id string-literal
1354 void ModuleMapParser::parseExternModuleDecl() {
1355   assert(Tok.is(MMToken::ExternKeyword));
1356   consumeToken(); // 'extern' keyword
1357
1358   // Parse 'module' keyword.
1359   if (!Tok.is(MMToken::ModuleKeyword)) {
1360     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1361     consumeToken();
1362     HadError = true;
1363     return;
1364   }
1365   consumeToken(); // 'module' keyword
1366
1367   // Parse the module name.
1368   ModuleId Id;
1369   if (parseModuleId(Id)) {
1370     HadError = true;
1371     return;
1372   }
1373
1374   // Parse the referenced module map file name.
1375   if (!Tok.is(MMToken::StringLiteral)) {
1376     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_mmap_file);
1377     HadError = true;
1378     return;
1379   }
1380   std::string FileName = Tok.getString();
1381   consumeToken(); // filename
1382
1383   StringRef FileNameRef = FileName;
1384   SmallString<128> ModuleMapFileName;
1385   if (llvm::sys::path::is_relative(FileNameRef)) {
1386     ModuleMapFileName += Directory->getName();
1387     llvm::sys::path::append(ModuleMapFileName, FileName);
1388     FileNameRef = ModuleMapFileName.str();
1389   }
1390   if (const FileEntry *File = SourceMgr.getFileManager().getFile(FileNameRef))
1391     Map.parseModuleMapFile(File, /*IsSystem=*/false);
1392 }
1393
1394 /// \brief Parse a requires declaration.
1395 ///
1396 ///   requires-declaration:
1397 ///     'requires' feature-list
1398 ///
1399 ///   feature-list:
1400 ///     feature ',' feature-list
1401 ///     feature
1402 ///
1403 ///   feature:
1404 ///     '!'[opt] identifier
1405 void ModuleMapParser::parseRequiresDecl() {
1406   assert(Tok.is(MMToken::RequiresKeyword));
1407
1408   // Parse 'requires' keyword.
1409   consumeToken();
1410
1411   // Parse the feature-list.
1412   do {
1413     bool RequiredState = true;
1414     if (Tok.is(MMToken::Exclaim)) {
1415       RequiredState = false;
1416       consumeToken();
1417     }
1418
1419     if (!Tok.is(MMToken::Identifier)) {
1420       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature);
1421       HadError = true;
1422       return;
1423     }
1424
1425     // Consume the feature name.
1426     std::string Feature = Tok.getString();
1427     consumeToken();
1428
1429     // Add this feature.
1430     ActiveModule->addRequirement(Feature, RequiredState,
1431                                  Map.LangOpts, *Map.Target);
1432
1433     if (!Tok.is(MMToken::Comma))
1434       break;
1435
1436     // Consume the comma.
1437     consumeToken();
1438   } while (true);
1439 }
1440
1441 /// \brief Append to \p Paths the set of paths needed to get to the 
1442 /// subframework in which the given module lives.
1443 static void appendSubframeworkPaths(Module *Mod,
1444                                     SmallVectorImpl<char> &Path) {
1445   // Collect the framework names from the given module to the top-level module.
1446   SmallVector<StringRef, 2> Paths;
1447   for (; Mod; Mod = Mod->Parent) {
1448     if (Mod->IsFramework)
1449       Paths.push_back(Mod->Name);
1450   }
1451   
1452   if (Paths.empty())
1453     return;
1454   
1455   // Add Frameworks/Name.framework for each subframework.
1456   for (unsigned I = Paths.size() - 1; I != 0; --I)
1457     llvm::sys::path::append(Path, "Frameworks", Paths[I-1] + ".framework");
1458 }
1459
1460 /// \brief Parse a header declaration.
1461 ///
1462 ///   header-declaration:
1463 ///     'umbrella'[opt] 'header' string-literal
1464 ///     'exclude'[opt] 'header' string-literal
1465 void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken,
1466                                       SourceLocation LeadingLoc) {
1467   assert(Tok.is(MMToken::HeaderKeyword));
1468   consumeToken();
1469
1470   // Parse the header name.
1471   if (!Tok.is(MMToken::StringLiteral)) {
1472     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 
1473       << "header";
1474     HadError = true;
1475     return;
1476   }
1477   std::string FileName = Tok.getString();
1478   SourceLocation FileNameLoc = consumeToken();
1479   
1480   // Check whether we already have an umbrella.
1481   if (LeadingToken == MMToken::UmbrellaKeyword && ActiveModule->Umbrella) {
1482     Diags.Report(FileNameLoc, diag::err_mmap_umbrella_clash)
1483       << ActiveModule->getFullModuleName();
1484     HadError = true;
1485     return;
1486   }
1487
1488   // Look for this file.
1489   const FileEntry *File = 0;
1490   const FileEntry *BuiltinFile = 0;
1491   SmallString<128> PathName;
1492   if (llvm::sys::path::is_absolute(FileName)) {
1493     PathName = FileName;
1494     File = SourceMgr.getFileManager().getFile(PathName);
1495   } else if (const DirectoryEntry *Dir = getOverriddenHeaderSearchDir()) {
1496     PathName = Dir->getName();
1497     llvm::sys::path::append(PathName, FileName);
1498     File = SourceMgr.getFileManager().getFile(PathName);
1499   } else {
1500     // Search for the header file within the search directory.
1501     PathName = Directory->getName();
1502     unsigned PathLength = PathName.size();
1503     
1504     if (ActiveModule->isPartOfFramework()) {
1505       appendSubframeworkPaths(ActiveModule, PathName);
1506       
1507       // Check whether this file is in the public headers.
1508       llvm::sys::path::append(PathName, "Headers", FileName);
1509       File = SourceMgr.getFileManager().getFile(PathName);
1510       
1511       if (!File) {
1512         // Check whether this file is in the private headers.
1513         PathName.resize(PathLength);
1514         llvm::sys::path::append(PathName, "PrivateHeaders", FileName);
1515         File = SourceMgr.getFileManager().getFile(PathName);
1516       }
1517     } else {
1518       // Lookup for normal headers.
1519       llvm::sys::path::append(PathName, FileName);
1520       File = SourceMgr.getFileManager().getFile(PathName);
1521       
1522       // If this is a system module with a top-level header, this header
1523       // may have a counterpart (or replacement) in the set of headers
1524       // supplied by Clang. Find that builtin header.
1525       if (ActiveModule->IsSystem && LeadingToken != MMToken::UmbrellaKeyword &&
1526           BuiltinIncludeDir && BuiltinIncludeDir != Directory &&
1527           isBuiltinHeader(FileName)) {
1528         SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName());
1529         llvm::sys::path::append(BuiltinPathName, FileName);
1530         BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName);
1531         
1532         // If Clang supplies this header but the underlying system does not,
1533         // just silently swap in our builtin version. Otherwise, we'll end
1534         // up adding both (later).
1535         if (!File && BuiltinFile) {
1536           File = BuiltinFile;
1537           BuiltinFile = 0;
1538         }
1539       }
1540     }
1541   }
1542   
1543   // FIXME: We shouldn't be eagerly stat'ing every file named in a module map.
1544   // Come up with a lazy way to do this.
1545   if (File) {
1546     if (LeadingToken == MMToken::UmbrellaKeyword) {
1547       const DirectoryEntry *UmbrellaDir = File->getDir();
1548       if (Module *UmbrellaModule = Map.UmbrellaDirs[UmbrellaDir]) {
1549         Diags.Report(LeadingLoc, diag::err_mmap_umbrella_clash)
1550           << UmbrellaModule->getFullModuleName();
1551         HadError = true;
1552       } else {
1553         // Record this umbrella header.
1554         Map.setUmbrellaHeader(ActiveModule, File);
1555       }
1556     } else {
1557       // Record this header.
1558       ModuleMap::ModuleHeaderRole Role = ModuleMap::NormalHeader;
1559       if (LeadingToken == MMToken::ExcludeKeyword)
1560         Role = ModuleMap::ExcludedHeader;
1561       else if (LeadingToken == MMToken::PrivateKeyword)
1562         Role = ModuleMap::PrivateHeader;
1563       else
1564         assert(LeadingToken == MMToken::HeaderKeyword);
1565         
1566       Map.addHeader(ActiveModule, File, Role);
1567       
1568       // If there is a builtin counterpart to this file, add it now.
1569       if (BuiltinFile)
1570         Map.addHeader(ActiveModule, BuiltinFile, Role);
1571     }
1572   } else if (LeadingToken != MMToken::ExcludeKeyword) {
1573     // Ignore excluded header files. They're optional anyway.
1574     
1575     Diags.Report(FileNameLoc, diag::err_mmap_header_not_found)
1576       << (LeadingToken == MMToken::UmbrellaKeyword) << FileName;
1577     HadError = true;
1578   }
1579 }
1580
1581 /// \brief Parse an umbrella directory declaration.
1582 ///
1583 ///   umbrella-dir-declaration:
1584 ///     umbrella string-literal
1585 void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) {
1586   // Parse the directory name.
1587   if (!Tok.is(MMToken::StringLiteral)) {
1588     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header) 
1589       << "umbrella";
1590     HadError = true;
1591     return;
1592   }
1593
1594   std::string DirName = Tok.getString();
1595   SourceLocation DirNameLoc = consumeToken();
1596   
1597   // Check whether we already have an umbrella.
1598   if (ActiveModule->Umbrella) {
1599     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash)
1600       << ActiveModule->getFullModuleName();
1601     HadError = true;
1602     return;
1603   }
1604
1605   // Look for this file.
1606   const DirectoryEntry *Dir = 0;
1607   if (llvm::sys::path::is_absolute(DirName))
1608     Dir = SourceMgr.getFileManager().getDirectory(DirName);
1609   else {
1610     SmallString<128> PathName;
1611     PathName = Directory->getName();
1612     llvm::sys::path::append(PathName, DirName);
1613     Dir = SourceMgr.getFileManager().getDirectory(PathName);
1614   }
1615   
1616   if (!Dir) {
1617     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found)
1618       << DirName;
1619     HadError = true;
1620     return;
1621   }
1622   
1623   if (Module *OwningModule = Map.UmbrellaDirs[Dir]) {
1624     Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
1625       << OwningModule->getFullModuleName();
1626     HadError = true;
1627     return;
1628   } 
1629   
1630   // Record this umbrella directory.
1631   Map.setUmbrellaDir(ActiveModule, Dir);
1632 }
1633
1634 /// \brief Parse a module export declaration.
1635 ///
1636 ///   export-declaration:
1637 ///     'export' wildcard-module-id
1638 ///
1639 ///   wildcard-module-id:
1640 ///     identifier
1641 ///     '*'
1642 ///     identifier '.' wildcard-module-id
1643 void ModuleMapParser::parseExportDecl() {
1644   assert(Tok.is(MMToken::ExportKeyword));
1645   SourceLocation ExportLoc = consumeToken();
1646   
1647   // Parse the module-id with an optional wildcard at the end.
1648   ModuleId ParsedModuleId;
1649   bool Wildcard = false;
1650   do {
1651     if (Tok.is(MMToken::Identifier)) {
1652       ParsedModuleId.push_back(std::make_pair(Tok.getString(), 
1653                                               Tok.getLocation()));
1654       consumeToken();
1655       
1656       if (Tok.is(MMToken::Period)) {
1657         consumeToken();
1658         continue;
1659       } 
1660       
1661       break;
1662     }
1663     
1664     if(Tok.is(MMToken::Star)) {
1665       Wildcard = true;
1666       consumeToken();
1667       break;
1668     }
1669     
1670     Diags.Report(Tok.getLocation(), diag::err_mmap_module_id);
1671     HadError = true;
1672     return;
1673   } while (true);
1674   
1675   Module::UnresolvedExportDecl Unresolved = { 
1676     ExportLoc, ParsedModuleId, Wildcard 
1677   };
1678   ActiveModule->UnresolvedExports.push_back(Unresolved);
1679 }
1680
1681 /// \brief Parse a module uses declaration.
1682 ///
1683 ///   uses-declaration:
1684 ///     'uses' wildcard-module-id
1685 void ModuleMapParser::parseUseDecl() {
1686   assert(Tok.is(MMToken::UseKeyword));
1687   consumeToken();
1688   // Parse the module-id.
1689   ModuleId ParsedModuleId;
1690
1691   do {
1692     if (Tok.is(MMToken::Identifier)) {
1693       ParsedModuleId.push_back(
1694           std::make_pair(Tok.getString(), Tok.getLocation()));
1695       consumeToken();
1696
1697       if (Tok.is(MMToken::Period)) {
1698         consumeToken();
1699         continue;
1700       }
1701
1702       break;
1703     }
1704
1705     Diags.Report(Tok.getLocation(), diag::err_mmap_module_id);
1706     HadError = true;
1707     return;
1708   } while (true);
1709
1710   ActiveModule->UnresolvedDirectUses.push_back(ParsedModuleId);
1711 }
1712
1713 /// \brief Parse a link declaration.
1714 ///
1715 ///   module-declaration:
1716 ///     'link' 'framework'[opt] string-literal
1717 void ModuleMapParser::parseLinkDecl() {
1718   assert(Tok.is(MMToken::LinkKeyword));
1719   SourceLocation LinkLoc = consumeToken();
1720
1721   // Parse the optional 'framework' keyword.
1722   bool IsFramework = false;
1723   if (Tok.is(MMToken::FrameworkKeyword)) {
1724     consumeToken();
1725     IsFramework = true;
1726   }
1727
1728   // Parse the library name
1729   if (!Tok.is(MMToken::StringLiteral)) {
1730     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_library_name)
1731       << IsFramework << SourceRange(LinkLoc);
1732     HadError = true;
1733     return;
1734   }
1735
1736   std::string LibraryName = Tok.getString();
1737   consumeToken();
1738   ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName,
1739                                                             IsFramework));
1740 }
1741
1742 /// \brief Parse a configuration macro declaration.
1743 ///
1744 ///   module-declaration:
1745 ///     'config_macros' attributes[opt] config-macro-list?
1746 ///
1747 ///   config-macro-list:
1748 ///     identifier (',' identifier)?
1749 void ModuleMapParser::parseConfigMacros() {
1750   assert(Tok.is(MMToken::ConfigMacros));
1751   SourceLocation ConfigMacrosLoc = consumeToken();
1752
1753   // Only top-level modules can have configuration macros.
1754   if (ActiveModule->Parent) {
1755     Diags.Report(ConfigMacrosLoc, diag::err_mmap_config_macro_submodule);
1756   }
1757
1758   // Parse the optional attributes.
1759   Attributes Attrs;
1760   parseOptionalAttributes(Attrs);
1761   if (Attrs.IsExhaustive && !ActiveModule->Parent) {
1762     ActiveModule->ConfigMacrosExhaustive = true;
1763   }
1764
1765   // If we don't have an identifier, we're done.
1766   if (!Tok.is(MMToken::Identifier))
1767     return;
1768
1769   // Consume the first identifier.
1770   if (!ActiveModule->Parent) {
1771     ActiveModule->ConfigMacros.push_back(Tok.getString().str());
1772   }
1773   consumeToken();
1774
1775   do {
1776     // If there's a comma, consume it.
1777     if (!Tok.is(MMToken::Comma))
1778       break;
1779     consumeToken();
1780
1781     // We expect to see a macro name here.
1782     if (!Tok.is(MMToken::Identifier)) {
1783       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_config_macro);
1784       break;
1785     }
1786
1787     // Consume the macro name.
1788     if (!ActiveModule->Parent) {
1789       ActiveModule->ConfigMacros.push_back(Tok.getString().str());
1790     }
1791     consumeToken();
1792   } while (true);
1793 }
1794
1795 /// \brief Format a module-id into a string.
1796 static std::string formatModuleId(const ModuleId &Id) {
1797   std::string result;
1798   {
1799     llvm::raw_string_ostream OS(result);
1800
1801     for (unsigned I = 0, N = Id.size(); I != N; ++I) {
1802       if (I)
1803         OS << ".";
1804       OS << Id[I].first;
1805     }
1806   }
1807
1808   return result;
1809 }
1810
1811 /// \brief Parse a conflict declaration.
1812 ///
1813 ///   module-declaration:
1814 ///     'conflict' module-id ',' string-literal
1815 void ModuleMapParser::parseConflict() {
1816   assert(Tok.is(MMToken::Conflict));
1817   SourceLocation ConflictLoc = consumeToken();
1818   Module::UnresolvedConflict Conflict;
1819
1820   // Parse the module-id.
1821   if (parseModuleId(Conflict.Id))
1822     return;
1823
1824   // Parse the ','.
1825   if (!Tok.is(MMToken::Comma)) {
1826     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_comma)
1827       << SourceRange(ConflictLoc);
1828     return;
1829   }
1830   consumeToken();
1831
1832   // Parse the message.
1833   if (!Tok.is(MMToken::StringLiteral)) {
1834     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_message)
1835       << formatModuleId(Conflict.Id);
1836     return;
1837   }
1838   Conflict.Message = Tok.getString().str();
1839   consumeToken();
1840
1841   // Add this unresolved conflict.
1842   ActiveModule->UnresolvedConflicts.push_back(Conflict);
1843 }
1844
1845 /// \brief Parse an inferred module declaration (wildcard modules).
1846 ///
1847 ///   module-declaration:
1848 ///     'explicit'[opt] 'framework'[opt] 'module' * attributes[opt]
1849 ///       { inferred-module-member* }
1850 ///
1851 ///   inferred-module-member:
1852 ///     'export' '*'
1853 ///     'exclude' identifier
1854 void ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) {
1855   assert(Tok.is(MMToken::Star));
1856   SourceLocation StarLoc = consumeToken();
1857   bool Failed = false;
1858
1859   // Inferred modules must be submodules.
1860   if (!ActiveModule && !Framework) {
1861     Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule);
1862     Failed = true;
1863   }
1864
1865   if (ActiveModule) {
1866     // Inferred modules must have umbrella directories.
1867     if (!Failed && !ActiveModule->getUmbrellaDir()) {
1868       Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
1869       Failed = true;
1870     }
1871     
1872     // Check for redefinition of an inferred module.
1873     if (!Failed && ActiveModule->InferSubmodules) {
1874       Diags.Report(StarLoc, diag::err_mmap_inferred_redef);
1875       if (ActiveModule->InferredSubmoduleLoc.isValid())
1876         Diags.Report(ActiveModule->InferredSubmoduleLoc,
1877                      diag::note_mmap_prev_definition);
1878       Failed = true;
1879     }
1880
1881     // Check for the 'framework' keyword, which is not permitted here.
1882     if (Framework) {
1883       Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule);
1884       Framework = false;
1885     }
1886   } else if (Explicit) {
1887     Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework);
1888     Explicit = false;
1889   }
1890
1891   // If there were any problems with this inferred submodule, skip its body.
1892   if (Failed) {
1893     if (Tok.is(MMToken::LBrace)) {
1894       consumeToken();
1895       skipUntil(MMToken::RBrace);
1896       if (Tok.is(MMToken::RBrace))
1897         consumeToken();
1898     }
1899     HadError = true;
1900     return;
1901   }
1902
1903   // Parse optional attributes.
1904   Attributes Attrs;
1905   parseOptionalAttributes(Attrs);
1906
1907   if (ActiveModule) {
1908     // Note that we have an inferred submodule.
1909     ActiveModule->InferSubmodules = true;
1910     ActiveModule->InferredSubmoduleLoc = StarLoc;
1911     ActiveModule->InferExplicitSubmodules = Explicit;
1912   } else {
1913     // We'll be inferring framework modules for this directory.
1914     Map.InferredDirectories[Directory].InferModules = true;
1915     Map.InferredDirectories[Directory].InferSystemModules = Attrs.IsSystem;
1916   }
1917
1918   // Parse the opening brace.
1919   if (!Tok.is(MMToken::LBrace)) {
1920     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard);
1921     HadError = true;
1922     return;
1923   }  
1924   SourceLocation LBraceLoc = consumeToken();
1925
1926   // Parse the body of the inferred submodule.
1927   bool Done = false;
1928   do {
1929     switch (Tok.Kind) {
1930     case MMToken::EndOfFile:
1931     case MMToken::RBrace:
1932       Done = true;
1933       break;
1934
1935     case MMToken::ExcludeKeyword: {
1936       if (ActiveModule) {
1937         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
1938           << (ActiveModule != 0);
1939         consumeToken();
1940         break;
1941       }
1942
1943       consumeToken();
1944       if (!Tok.is(MMToken::Identifier)) {
1945         Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name);
1946         break;
1947       }
1948
1949       Map.InferredDirectories[Directory].ExcludedModules
1950         .push_back(Tok.getString());
1951       consumeToken();
1952       break;
1953     }
1954
1955     case MMToken::ExportKeyword:
1956       if (!ActiveModule) {
1957         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
1958           << (ActiveModule != 0);
1959         consumeToken();
1960         break;
1961       }
1962
1963       consumeToken();
1964       if (Tok.is(MMToken::Star)) 
1965         ActiveModule->InferExportWildcard = true;
1966       else
1967         Diags.Report(Tok.getLocation(), 
1968                      diag::err_mmap_expected_export_wildcard);
1969       consumeToken();
1970       break;
1971
1972     case MMToken::ExplicitKeyword:
1973     case MMToken::ModuleKeyword:
1974     case MMToken::HeaderKeyword:
1975     case MMToken::PrivateKeyword:
1976     case MMToken::UmbrellaKeyword:
1977     default:
1978       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
1979           << (ActiveModule != 0);
1980       consumeToken();
1981       break;        
1982     }
1983   } while (!Done);
1984   
1985   if (Tok.is(MMToken::RBrace))
1986     consumeToken();
1987   else {
1988     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1989     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1990     HadError = true;
1991   }
1992 }
1993
1994 /// \brief Parse optional attributes.
1995 ///
1996 ///   attributes:
1997 ///     attribute attributes
1998 ///     attribute
1999 ///
2000 ///   attribute:
2001 ///     [ identifier ]
2002 ///
2003 /// \param Attrs Will be filled in with the parsed attributes.
2004 ///
2005 /// \returns true if an error occurred, false otherwise.
2006 bool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) {
2007   bool HadError = false;
2008   
2009   while (Tok.is(MMToken::LSquare)) {
2010     // Consume the '['.
2011     SourceLocation LSquareLoc = consumeToken();
2012
2013     // Check whether we have an attribute name here.
2014     if (!Tok.is(MMToken::Identifier)) {
2015       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute);
2016       skipUntil(MMToken::RSquare);
2017       if (Tok.is(MMToken::RSquare))
2018         consumeToken();
2019       HadError = true;
2020     }
2021
2022     // Decode the attribute name.
2023     AttributeKind Attribute
2024       = llvm::StringSwitch<AttributeKind>(Tok.getString())
2025           .Case("exhaustive", AT_exhaustive)
2026           .Case("system", AT_system)
2027           .Default(AT_unknown);
2028     switch (Attribute) {
2029     case AT_unknown:
2030       Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute)
2031         << Tok.getString();
2032       break;
2033
2034     case AT_system:
2035       Attrs.IsSystem = true;
2036       break;
2037
2038     case AT_exhaustive:
2039       Attrs.IsExhaustive = true;
2040       break;
2041     }
2042     consumeToken();
2043
2044     // Consume the ']'.
2045     if (!Tok.is(MMToken::RSquare)) {
2046       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare);
2047       Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match);
2048       skipUntil(MMToken::RSquare);
2049       HadError = true;
2050     }
2051
2052     if (Tok.is(MMToken::RSquare))
2053       consumeToken();
2054   }
2055
2056   return HadError;
2057 }
2058
2059 /// \brief If there is a specific header search directory due the presence
2060 /// of an umbrella directory, retrieve that directory. Otherwise, returns null.
2061 const DirectoryEntry *ModuleMapParser::getOverriddenHeaderSearchDir() {
2062   for (Module *Mod = ActiveModule; Mod; Mod = Mod->Parent) {
2063     // If we have an umbrella directory, use that.
2064     if (Mod->hasUmbrellaDir())
2065       return Mod->getUmbrellaDir();
2066     
2067     // If we have a framework directory, stop looking.
2068     if (Mod->IsFramework)
2069       return 0;
2070   }
2071   
2072   return 0;
2073 }
2074
2075 /// \brief Parse a module map file.
2076 ///
2077 ///   module-map-file:
2078 ///     module-declaration*
2079 bool ModuleMapParser::parseModuleMapFile() {
2080   do {
2081     switch (Tok.Kind) {
2082     case MMToken::EndOfFile:
2083       return HadError;
2084       
2085     case MMToken::ExplicitKeyword:
2086     case MMToken::ExternKeyword:
2087     case MMToken::ModuleKeyword:
2088     case MMToken::FrameworkKeyword:
2089       parseModuleDecl();
2090       break;
2091
2092     case MMToken::Comma:
2093     case MMToken::ConfigMacros:
2094     case MMToken::Conflict:
2095     case MMToken::Exclaim:
2096     case MMToken::ExcludeKeyword:
2097     case MMToken::ExportKeyword:
2098     case MMToken::HeaderKeyword:
2099     case MMToken::Identifier:
2100     case MMToken::LBrace:
2101     case MMToken::LinkKeyword:
2102     case MMToken::LSquare:
2103     case MMToken::Period:
2104     case MMToken::PrivateKeyword:
2105     case MMToken::RBrace:
2106     case MMToken::RSquare:
2107     case MMToken::RequiresKeyword:
2108     case MMToken::Star:
2109     case MMToken::StringLiteral:
2110     case MMToken::UmbrellaKeyword:
2111     case MMToken::UseKeyword:
2112       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
2113       HadError = true;
2114       consumeToken();
2115       break;
2116     }
2117   } while (true);
2118 }
2119
2120 bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem) {
2121   llvm::DenseMap<const FileEntry *, bool>::iterator Known
2122     = ParsedModuleMap.find(File);
2123   if (Known != ParsedModuleMap.end())
2124     return Known->second;
2125
2126   assert(Target != 0 && "Missing target information");
2127   FileID ID = SourceMgr.createFileID(File, SourceLocation(), SrcMgr::C_User);
2128   const llvm::MemoryBuffer *Buffer = SourceMgr.getBuffer(ID);
2129   if (!Buffer)
2130     return ParsedModuleMap[File] = true;
2131   
2132   // Parse this module map file.
2133   Lexer L(ID, SourceMgr.getBuffer(ID), SourceMgr, MMapLangOpts);
2134   Diags->getClient()->BeginSourceFile(MMapLangOpts);
2135   ModuleMapParser Parser(L, SourceMgr, Target, *Diags, *this, File->getDir(),
2136                          BuiltinIncludeDir, IsSystem);
2137   bool Result = Parser.parseModuleMapFile();
2138   Diags->getClient()->EndSourceFile();
2139   ParsedModuleMap[File] = Result;
2140   return Result;
2141 }