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