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