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