xref: /llvm-project/clang/lib/Lex/ModuleMap.cpp (revision 963c5535649dc049547853ebd3ad33ea17d2ae04)
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, IsSystem);
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 this module map is in a system header directory.
793     bool IsSystem;
794 
795     /// \brief Whether an error occurred.
796     bool HadError;
797 
798     /// \brief Stores string data for the various string literals referenced
799     /// during parsing.
800     llvm::BumpPtrAllocator StringData;
801 
802     /// \brief The current token.
803     MMToken Tok;
804 
805     /// \brief The active module.
806     Module *ActiveModule;
807 
808     /// \brief Consume the current token and return its location.
809     SourceLocation consumeToken();
810 
811     /// \brief Skip tokens until we reach the a token with the given kind
812     /// (or the end of the file).
813     void skipUntil(MMToken::TokenKind K);
814 
815     typedef SmallVector<std::pair<std::string, SourceLocation>, 2> ModuleId;
816     bool parseModuleId(ModuleId &Id);
817     void parseModuleDecl();
818     void parseRequiresDecl();
819     void parseHeaderDecl(clang::MMToken::TokenKind,
820                          SourceLocation LeadingLoc);
821     void parseUmbrellaDirDecl(SourceLocation UmbrellaLoc);
822     void parseExportDecl();
823     void parseLinkDecl();
824     void parseConfigMacros();
825     void parseConflict();
826     void parseInferredModuleDecl(bool Framework, bool Explicit);
827     bool parseOptionalAttributes(Attributes &Attrs);
828 
829     const DirectoryEntry *getOverriddenHeaderSearchDir();
830 
831   public:
832     explicit ModuleMapParser(Lexer &L, SourceManager &SourceMgr,
833                              const TargetInfo *Target,
834                              DiagnosticsEngine &Diags,
835                              ModuleMap &Map,
836                              const DirectoryEntry *Directory,
837                              const DirectoryEntry *BuiltinIncludeDir,
838                              bool IsSystem)
839       : L(L), SourceMgr(SourceMgr), Target(Target), Diags(Diags), Map(Map),
840         Directory(Directory), BuiltinIncludeDir(BuiltinIncludeDir),
841         IsSystem(IsSystem), HadError(false), ActiveModule(0)
842     {
843       Tok.clear();
844       consumeToken();
845     }
846 
847     bool parseModuleMapFile();
848   };
849 }
850 
851 SourceLocation ModuleMapParser::consumeToken() {
852 retry:
853   SourceLocation Result = Tok.getLocation();
854   Tok.clear();
855 
856   Token LToken;
857   L.LexFromRawLexer(LToken);
858   Tok.Location = LToken.getLocation().getRawEncoding();
859   switch (LToken.getKind()) {
860   case tok::raw_identifier:
861     Tok.StringData = LToken.getRawIdentifierData();
862     Tok.StringLength = LToken.getLength();
863     Tok.Kind = llvm::StringSwitch<MMToken::TokenKind>(Tok.getString())
864                  .Case("config_macros", MMToken::ConfigMacros)
865                  .Case("conflict", MMToken::Conflict)
866                  .Case("exclude", MMToken::ExcludeKeyword)
867                  .Case("explicit", MMToken::ExplicitKeyword)
868                  .Case("export", MMToken::ExportKeyword)
869                  .Case("framework", MMToken::FrameworkKeyword)
870                  .Case("header", MMToken::HeaderKeyword)
871                  .Case("link", MMToken::LinkKeyword)
872                  .Case("module", MMToken::ModuleKeyword)
873                  .Case("private", MMToken::PrivateKeyword)
874                  .Case("requires", MMToken::RequiresKeyword)
875                  .Case("umbrella", MMToken::UmbrellaKeyword)
876                  .Default(MMToken::Identifier);
877     break;
878 
879   case tok::comma:
880     Tok.Kind = MMToken::Comma;
881     break;
882 
883   case tok::eof:
884     Tok.Kind = MMToken::EndOfFile;
885     break;
886 
887   case tok::l_brace:
888     Tok.Kind = MMToken::LBrace;
889     break;
890 
891   case tok::l_square:
892     Tok.Kind = MMToken::LSquare;
893     break;
894 
895   case tok::period:
896     Tok.Kind = MMToken::Period;
897     break;
898 
899   case tok::r_brace:
900     Tok.Kind = MMToken::RBrace;
901     break;
902 
903   case tok::r_square:
904     Tok.Kind = MMToken::RSquare;
905     break;
906 
907   case tok::star:
908     Tok.Kind = MMToken::Star;
909     break;
910 
911   case tok::string_literal: {
912     if (LToken.hasUDSuffix()) {
913       Diags.Report(LToken.getLocation(), diag::err_invalid_string_udl);
914       HadError = true;
915       goto retry;
916     }
917 
918     // Parse the string literal.
919     LangOptions LangOpts;
920     StringLiteralParser StringLiteral(&LToken, 1, SourceMgr, LangOpts, *Target);
921     if (StringLiteral.hadError)
922       goto retry;
923 
924     // Copy the string literal into our string data allocator.
925     unsigned Length = StringLiteral.GetStringLength();
926     char *Saved = StringData.Allocate<char>(Length + 1);
927     memcpy(Saved, StringLiteral.GetString().data(), Length);
928     Saved[Length] = 0;
929 
930     // Form the token.
931     Tok.Kind = MMToken::StringLiteral;
932     Tok.StringData = Saved;
933     Tok.StringLength = Length;
934     break;
935   }
936 
937   case tok::comment:
938     goto retry;
939 
940   default:
941     Diags.Report(LToken.getLocation(), diag::err_mmap_unknown_token);
942     HadError = true;
943     goto retry;
944   }
945 
946   return Result;
947 }
948 
949 void ModuleMapParser::skipUntil(MMToken::TokenKind K) {
950   unsigned braceDepth = 0;
951   unsigned squareDepth = 0;
952   do {
953     switch (Tok.Kind) {
954     case MMToken::EndOfFile:
955       return;
956 
957     case MMToken::LBrace:
958       if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
959         return;
960 
961       ++braceDepth;
962       break;
963 
964     case MMToken::LSquare:
965       if (Tok.is(K) && braceDepth == 0 && squareDepth == 0)
966         return;
967 
968       ++squareDepth;
969       break;
970 
971     case MMToken::RBrace:
972       if (braceDepth > 0)
973         --braceDepth;
974       else if (Tok.is(K))
975         return;
976       break;
977 
978     case MMToken::RSquare:
979       if (squareDepth > 0)
980         --squareDepth;
981       else if (Tok.is(K))
982         return;
983       break;
984 
985     default:
986       if (braceDepth == 0 && squareDepth == 0 && Tok.is(K))
987         return;
988       break;
989     }
990 
991    consumeToken();
992   } while (true);
993 }
994 
995 /// \brief Parse a module-id.
996 ///
997 ///   module-id:
998 ///     identifier
999 ///     identifier '.' module-id
1000 ///
1001 /// \returns true if an error occurred, false otherwise.
1002 bool ModuleMapParser::parseModuleId(ModuleId &Id) {
1003   Id.clear();
1004   do {
1005     if (Tok.is(MMToken::Identifier)) {
1006       Id.push_back(std::make_pair(Tok.getString(), Tok.getLocation()));
1007       consumeToken();
1008     } else {
1009       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module_name);
1010       return true;
1011     }
1012 
1013     if (!Tok.is(MMToken::Period))
1014       break;
1015 
1016     consumeToken();
1017   } while (true);
1018 
1019   return false;
1020 }
1021 
1022 namespace {
1023   /// \brief Enumerates the known attributes.
1024   enum AttributeKind {
1025     /// \brief An unknown attribute.
1026     AT_unknown,
1027     /// \brief The 'system' attribute.
1028     AT_system,
1029     /// \brief The 'exhaustive' attribute.
1030     AT_exhaustive
1031   };
1032 }
1033 
1034 /// \brief Parse a module declaration.
1035 ///
1036 ///   module-declaration:
1037 ///     'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt]
1038 ///       { module-member* }
1039 ///
1040 ///   module-member:
1041 ///     requires-declaration
1042 ///     header-declaration
1043 ///     submodule-declaration
1044 ///     export-declaration
1045 ///     link-declaration
1046 ///
1047 ///   submodule-declaration:
1048 ///     module-declaration
1049 ///     inferred-submodule-declaration
1050 void ModuleMapParser::parseModuleDecl() {
1051   assert(Tok.is(MMToken::ExplicitKeyword) || Tok.is(MMToken::ModuleKeyword) ||
1052          Tok.is(MMToken::FrameworkKeyword));
1053   // Parse 'explicit' or 'framework' keyword, if present.
1054   SourceLocation ExplicitLoc;
1055   bool Explicit = false;
1056   bool Framework = false;
1057 
1058   // Parse 'explicit' keyword, if present.
1059   if (Tok.is(MMToken::ExplicitKeyword)) {
1060     ExplicitLoc = consumeToken();
1061     Explicit = true;
1062   }
1063 
1064   // Parse 'framework' keyword, if present.
1065   if (Tok.is(MMToken::FrameworkKeyword)) {
1066     consumeToken();
1067     Framework = true;
1068   }
1069 
1070   // Parse 'module' keyword.
1071   if (!Tok.is(MMToken::ModuleKeyword)) {
1072     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1073     consumeToken();
1074     HadError = true;
1075     return;
1076   }
1077   consumeToken(); // 'module' keyword
1078 
1079   // If we have a wildcard for the module name, this is an inferred submodule.
1080   // Parse it.
1081   if (Tok.is(MMToken::Star))
1082     return parseInferredModuleDecl(Framework, Explicit);
1083 
1084   // Parse the module name.
1085   ModuleId Id;
1086   if (parseModuleId(Id)) {
1087     HadError = true;
1088     return;
1089   }
1090 
1091   if (ActiveModule) {
1092     if (Id.size() > 1) {
1093       Diags.Report(Id.front().second, diag::err_mmap_nested_submodule_id)
1094         << SourceRange(Id.front().second, Id.back().second);
1095 
1096       HadError = true;
1097       return;
1098     }
1099   } else if (Id.size() == 1 && Explicit) {
1100     // Top-level modules can't be explicit.
1101     Diags.Report(ExplicitLoc, diag::err_mmap_explicit_top_level);
1102     Explicit = false;
1103     ExplicitLoc = SourceLocation();
1104     HadError = true;
1105   }
1106 
1107   Module *PreviousActiveModule = ActiveModule;
1108   if (Id.size() > 1) {
1109     // This module map defines a submodule. Go find the module of which it
1110     // is a submodule.
1111     ActiveModule = 0;
1112     for (unsigned I = 0, N = Id.size() - 1; I != N; ++I) {
1113       if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) {
1114         ActiveModule = Next;
1115         continue;
1116       }
1117 
1118       if (ActiveModule) {
1119         Diags.Report(Id[I].second, diag::err_mmap_missing_module_qualified)
1120           << Id[I].first << ActiveModule->getTopLevelModule();
1121       } else {
1122         Diags.Report(Id[I].second, diag::err_mmap_expected_module_name);
1123       }
1124       HadError = true;
1125       return;
1126     }
1127   }
1128 
1129   StringRef ModuleName = Id.back().first;
1130   SourceLocation ModuleNameLoc = Id.back().second;
1131 
1132   // Parse the optional attribute list.
1133   Attributes Attrs;
1134   parseOptionalAttributes(Attrs);
1135 
1136   // Parse the opening brace.
1137   if (!Tok.is(MMToken::LBrace)) {
1138     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace)
1139       << ModuleName;
1140     HadError = true;
1141     return;
1142   }
1143   SourceLocation LBraceLoc = consumeToken();
1144 
1145   // Determine whether this (sub)module has already been defined.
1146   if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) {
1147     if (Existing->DefinitionLoc.isInvalid() && !ActiveModule) {
1148       // Skip the module definition.
1149       skipUntil(MMToken::RBrace);
1150       if (Tok.is(MMToken::RBrace))
1151         consumeToken();
1152       else {
1153         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1154         Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1155         HadError = true;
1156       }
1157       return;
1158     }
1159 
1160     Diags.Report(ModuleNameLoc, diag::err_mmap_module_redefinition)
1161       << ModuleName;
1162     Diags.Report(Existing->DefinitionLoc, diag::note_mmap_prev_definition);
1163 
1164     // Skip the module definition.
1165     skipUntil(MMToken::RBrace);
1166     if (Tok.is(MMToken::RBrace))
1167       consumeToken();
1168 
1169     HadError = true;
1170     return;
1171   }
1172 
1173   // Start defining this module.
1174   ActiveModule = Map.findOrCreateModule(ModuleName, ActiveModule, Framework,
1175                                         Explicit).first;
1176   ActiveModule->DefinitionLoc = ModuleNameLoc;
1177   if (Attrs.IsSystem || IsSystem)
1178     ActiveModule->IsSystem = true;
1179 
1180   bool Done = false;
1181   do {
1182     switch (Tok.Kind) {
1183     case MMToken::EndOfFile:
1184     case MMToken::RBrace:
1185       Done = true;
1186       break;
1187 
1188     case MMToken::ConfigMacros:
1189       parseConfigMacros();
1190       break;
1191 
1192     case MMToken::Conflict:
1193       parseConflict();
1194       break;
1195 
1196     case MMToken::ExplicitKeyword:
1197     case MMToken::FrameworkKeyword:
1198     case MMToken::ModuleKeyword:
1199       parseModuleDecl();
1200       break;
1201 
1202     case MMToken::ExportKeyword:
1203       parseExportDecl();
1204       break;
1205 
1206     case MMToken::RequiresKeyword:
1207       parseRequiresDecl();
1208       break;
1209 
1210     case MMToken::UmbrellaKeyword: {
1211       SourceLocation UmbrellaLoc = consumeToken();
1212       if (Tok.is(MMToken::HeaderKeyword))
1213         parseHeaderDecl(MMToken::UmbrellaKeyword, UmbrellaLoc);
1214       else
1215         parseUmbrellaDirDecl(UmbrellaLoc);
1216       break;
1217     }
1218 
1219     case MMToken::ExcludeKeyword: {
1220       SourceLocation ExcludeLoc = consumeToken();
1221       if (Tok.is(MMToken::HeaderKeyword)) {
1222         parseHeaderDecl(MMToken::ExcludeKeyword, ExcludeLoc);
1223       } else {
1224         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1225           << "exclude";
1226       }
1227       break;
1228     }
1229 
1230     case MMToken::PrivateKeyword: {
1231       SourceLocation PrivateLoc = consumeToken();
1232       if (Tok.is(MMToken::HeaderKeyword)) {
1233         parseHeaderDecl(MMToken::PrivateKeyword, PrivateLoc);
1234       } else {
1235         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1236           << "private";
1237       }
1238       break;
1239     }
1240 
1241     case MMToken::HeaderKeyword:
1242       parseHeaderDecl(MMToken::HeaderKeyword, SourceLocation());
1243       break;
1244 
1245     case MMToken::LinkKeyword:
1246       parseLinkDecl();
1247       break;
1248 
1249     default:
1250       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_member);
1251       consumeToken();
1252       break;
1253     }
1254   } while (!Done);
1255 
1256   if (Tok.is(MMToken::RBrace))
1257     consumeToken();
1258   else {
1259     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1260     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1261     HadError = true;
1262   }
1263 
1264   // If the active module is a top-level framework, and there are no link
1265   // libraries, automatically link against the framework.
1266   if (ActiveModule->IsFramework && !ActiveModule->isSubFramework() &&
1267       ActiveModule->LinkLibraries.empty()) {
1268     inferFrameworkLink(ActiveModule, Directory, SourceMgr.getFileManager());
1269   }
1270 
1271   // We're done parsing this module. Pop back to the previous module.
1272   ActiveModule = PreviousActiveModule;
1273 }
1274 
1275 /// \brief Parse a requires declaration.
1276 ///
1277 ///   requires-declaration:
1278 ///     'requires' feature-list
1279 ///
1280 ///   feature-list:
1281 ///     identifier ',' feature-list
1282 ///     identifier
1283 void ModuleMapParser::parseRequiresDecl() {
1284   assert(Tok.is(MMToken::RequiresKeyword));
1285 
1286   // Parse 'requires' keyword.
1287   consumeToken();
1288 
1289   // Parse the feature-list.
1290   do {
1291     if (!Tok.is(MMToken::Identifier)) {
1292       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_feature);
1293       HadError = true;
1294       return;
1295     }
1296 
1297     // Consume the feature name.
1298     std::string Feature = Tok.getString();
1299     consumeToken();
1300 
1301     // Add this feature.
1302     ActiveModule->addRequirement(Feature, Map.LangOpts, *Map.Target);
1303 
1304     if (!Tok.is(MMToken::Comma))
1305       break;
1306 
1307     // Consume the comma.
1308     consumeToken();
1309   } while (true);
1310 }
1311 
1312 /// \brief Append to \p Paths the set of paths needed to get to the
1313 /// subframework in which the given module lives.
1314 static void appendSubframeworkPaths(Module *Mod,
1315                                     SmallVectorImpl<char> &Path) {
1316   // Collect the framework names from the given module to the top-level module.
1317   SmallVector<StringRef, 2> Paths;
1318   for (; Mod; Mod = Mod->Parent) {
1319     if (Mod->IsFramework)
1320       Paths.push_back(Mod->Name);
1321   }
1322 
1323   if (Paths.empty())
1324     return;
1325 
1326   // Add Frameworks/Name.framework for each subframework.
1327   for (unsigned I = Paths.size() - 1; I != 0; --I) {
1328     llvm::sys::path::append(Path, "Frameworks");
1329     llvm::sys::path::append(Path, Paths[I-1] + ".framework");
1330   }
1331 }
1332 
1333 /// \brief Parse a header declaration.
1334 ///
1335 ///   header-declaration:
1336 ///     'umbrella'[opt] 'header' string-literal
1337 ///     'exclude'[opt] 'header' string-literal
1338 void ModuleMapParser::parseHeaderDecl(MMToken::TokenKind LeadingToken,
1339                                       SourceLocation LeadingLoc) {
1340   assert(Tok.is(MMToken::HeaderKeyword));
1341   consumeToken();
1342 
1343   // Parse the header name.
1344   if (!Tok.is(MMToken::StringLiteral)) {
1345     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1346       << "header";
1347     HadError = true;
1348     return;
1349   }
1350   std::string FileName = Tok.getString();
1351   SourceLocation FileNameLoc = consumeToken();
1352 
1353   // Check whether we already have an umbrella.
1354   if (LeadingToken == MMToken::UmbrellaKeyword && ActiveModule->Umbrella) {
1355     Diags.Report(FileNameLoc, diag::err_mmap_umbrella_clash)
1356       << ActiveModule->getFullModuleName();
1357     HadError = true;
1358     return;
1359   }
1360 
1361   // Look for this file.
1362   const FileEntry *File = 0;
1363   const FileEntry *BuiltinFile = 0;
1364   SmallString<128> PathName;
1365   if (llvm::sys::path::is_absolute(FileName)) {
1366     PathName = FileName;
1367     File = SourceMgr.getFileManager().getFile(PathName);
1368   } else if (const DirectoryEntry *Dir = getOverriddenHeaderSearchDir()) {
1369     PathName = Dir->getName();
1370     llvm::sys::path::append(PathName, FileName);
1371     File = SourceMgr.getFileManager().getFile(PathName);
1372   } else {
1373     // Search for the header file within the search directory.
1374     PathName = Directory->getName();
1375     unsigned PathLength = PathName.size();
1376 
1377     if (ActiveModule->isPartOfFramework()) {
1378       appendSubframeworkPaths(ActiveModule, PathName);
1379 
1380       // Check whether this file is in the public headers.
1381       llvm::sys::path::append(PathName, "Headers");
1382       llvm::sys::path::append(PathName, FileName);
1383       File = SourceMgr.getFileManager().getFile(PathName);
1384 
1385       if (!File) {
1386         // Check whether this file is in the private headers.
1387         PathName.resize(PathLength);
1388         llvm::sys::path::append(PathName, "PrivateHeaders");
1389         llvm::sys::path::append(PathName, FileName);
1390         File = SourceMgr.getFileManager().getFile(PathName);
1391       }
1392     } else {
1393       // Lookup for normal headers.
1394       llvm::sys::path::append(PathName, FileName);
1395       File = SourceMgr.getFileManager().getFile(PathName);
1396 
1397       // If this is a system module with a top-level header, this header
1398       // may have a counterpart (or replacement) in the set of headers
1399       // supplied by Clang. Find that builtin header.
1400       if (ActiveModule->IsSystem && LeadingToken != MMToken::UmbrellaKeyword &&
1401           BuiltinIncludeDir && BuiltinIncludeDir != Directory &&
1402           isBuiltinHeader(FileName)) {
1403         SmallString<128> BuiltinPathName(BuiltinIncludeDir->getName());
1404         llvm::sys::path::append(BuiltinPathName, FileName);
1405         BuiltinFile = SourceMgr.getFileManager().getFile(BuiltinPathName);
1406 
1407         // If Clang supplies this header but the underlying system does not,
1408         // just silently swap in our builtin version. Otherwise, we'll end
1409         // up adding both (later).
1410         if (!File && BuiltinFile) {
1411           File = BuiltinFile;
1412           BuiltinFile = 0;
1413         }
1414       }
1415     }
1416   }
1417 
1418   // FIXME: We shouldn't be eagerly stat'ing every file named in a module map.
1419   // Come up with a lazy way to do this.
1420   if (File) {
1421     if (ModuleMap::KnownHeader OwningModule = Map.Headers[File]) {
1422       Diags.Report(FileNameLoc, diag::err_mmap_header_conflict)
1423         << FileName << OwningModule.getModule()->getFullModuleName();
1424       HadError = true;
1425     } else if (LeadingToken == MMToken::UmbrellaKeyword) {
1426       const DirectoryEntry *UmbrellaDir = File->getDir();
1427       if (Module *UmbrellaModule = Map.UmbrellaDirs[UmbrellaDir]) {
1428         Diags.Report(LeadingLoc, diag::err_mmap_umbrella_clash)
1429           << UmbrellaModule->getFullModuleName();
1430         HadError = true;
1431       } else {
1432         // Record this umbrella header.
1433         Map.setUmbrellaHeader(ActiveModule, File);
1434       }
1435     } else {
1436       // Record this header.
1437       ModuleMap::ModuleHeaderRole Role = ModuleMap::NormalHeader;
1438       if (LeadingToken == MMToken::ExcludeKeyword)
1439         Role = ModuleMap::ExcludedHeader;
1440       else if (LeadingToken == MMToken::PrivateKeyword)
1441         Role = ModuleMap::PrivateHeader;
1442       else
1443         assert(LeadingToken == MMToken::HeaderKeyword);
1444 
1445       Map.addHeader(ActiveModule, File, Role);
1446 
1447       // If there is a builtin counterpart to this file, add it now.
1448       if (BuiltinFile)
1449         Map.addHeader(ActiveModule, BuiltinFile, Role);
1450     }
1451   } else if (LeadingToken != MMToken::ExcludeKeyword) {
1452     // Ignore excluded header files. They're optional anyway.
1453 
1454     Diags.Report(FileNameLoc, diag::err_mmap_header_not_found)
1455       << (LeadingToken == MMToken::UmbrellaKeyword) << FileName;
1456     HadError = true;
1457   }
1458 }
1459 
1460 /// \brief Parse an umbrella directory declaration.
1461 ///
1462 ///   umbrella-dir-declaration:
1463 ///     umbrella string-literal
1464 void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) {
1465   // Parse the directory name.
1466   if (!Tok.is(MMToken::StringLiteral)) {
1467     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_header)
1468       << "umbrella";
1469     HadError = true;
1470     return;
1471   }
1472 
1473   std::string DirName = Tok.getString();
1474   SourceLocation DirNameLoc = consumeToken();
1475 
1476   // Check whether we already have an umbrella.
1477   if (ActiveModule->Umbrella) {
1478     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_clash)
1479       << ActiveModule->getFullModuleName();
1480     HadError = true;
1481     return;
1482   }
1483 
1484   // Look for this file.
1485   const DirectoryEntry *Dir = 0;
1486   if (llvm::sys::path::is_absolute(DirName))
1487     Dir = SourceMgr.getFileManager().getDirectory(DirName);
1488   else {
1489     SmallString<128> PathName;
1490     PathName = Directory->getName();
1491     llvm::sys::path::append(PathName, DirName);
1492     Dir = SourceMgr.getFileManager().getDirectory(PathName);
1493   }
1494 
1495   if (!Dir) {
1496     Diags.Report(DirNameLoc, diag::err_mmap_umbrella_dir_not_found)
1497       << DirName;
1498     HadError = true;
1499     return;
1500   }
1501 
1502   if (Module *OwningModule = Map.UmbrellaDirs[Dir]) {
1503     Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash)
1504       << OwningModule->getFullModuleName();
1505     HadError = true;
1506     return;
1507   }
1508 
1509   // Record this umbrella directory.
1510   Map.setUmbrellaDir(ActiveModule, Dir);
1511 }
1512 
1513 /// \brief Parse a module export declaration.
1514 ///
1515 ///   export-declaration:
1516 ///     'export' wildcard-module-id
1517 ///
1518 ///   wildcard-module-id:
1519 ///     identifier
1520 ///     '*'
1521 ///     identifier '.' wildcard-module-id
1522 void ModuleMapParser::parseExportDecl() {
1523   assert(Tok.is(MMToken::ExportKeyword));
1524   SourceLocation ExportLoc = consumeToken();
1525 
1526   // Parse the module-id with an optional wildcard at the end.
1527   ModuleId ParsedModuleId;
1528   bool Wildcard = false;
1529   do {
1530     if (Tok.is(MMToken::Identifier)) {
1531       ParsedModuleId.push_back(std::make_pair(Tok.getString(),
1532                                               Tok.getLocation()));
1533       consumeToken();
1534 
1535       if (Tok.is(MMToken::Period)) {
1536         consumeToken();
1537         continue;
1538       }
1539 
1540       break;
1541     }
1542 
1543     if(Tok.is(MMToken::Star)) {
1544       Wildcard = true;
1545       consumeToken();
1546       break;
1547     }
1548 
1549     Diags.Report(Tok.getLocation(), diag::err_mmap_export_module_id);
1550     HadError = true;
1551     return;
1552   } while (true);
1553 
1554   Module::UnresolvedExportDecl Unresolved = {
1555     ExportLoc, ParsedModuleId, Wildcard
1556   };
1557   ActiveModule->UnresolvedExports.push_back(Unresolved);
1558 }
1559 
1560 /// \brief Parse a link declaration.
1561 ///
1562 ///   module-declaration:
1563 ///     'link' 'framework'[opt] string-literal
1564 void ModuleMapParser::parseLinkDecl() {
1565   assert(Tok.is(MMToken::LinkKeyword));
1566   SourceLocation LinkLoc = consumeToken();
1567 
1568   // Parse the optional 'framework' keyword.
1569   bool IsFramework = false;
1570   if (Tok.is(MMToken::FrameworkKeyword)) {
1571     consumeToken();
1572     IsFramework = true;
1573   }
1574 
1575   // Parse the library name
1576   if (!Tok.is(MMToken::StringLiteral)) {
1577     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_library_name)
1578       << IsFramework << SourceRange(LinkLoc);
1579     HadError = true;
1580     return;
1581   }
1582 
1583   std::string LibraryName = Tok.getString();
1584   consumeToken();
1585   ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName,
1586                                                             IsFramework));
1587 }
1588 
1589 /// \brief Parse a configuration macro declaration.
1590 ///
1591 ///   module-declaration:
1592 ///     'config_macros' attributes[opt] config-macro-list?
1593 ///
1594 ///   config-macro-list:
1595 ///     identifier (',' identifier)?
1596 void ModuleMapParser::parseConfigMacros() {
1597   assert(Tok.is(MMToken::ConfigMacros));
1598   SourceLocation ConfigMacrosLoc = consumeToken();
1599 
1600   // Only top-level modules can have configuration macros.
1601   if (ActiveModule->Parent) {
1602     Diags.Report(ConfigMacrosLoc, diag::err_mmap_config_macro_submodule);
1603   }
1604 
1605   // Parse the optional attributes.
1606   Attributes Attrs;
1607   parseOptionalAttributes(Attrs);
1608   if (Attrs.IsExhaustive && !ActiveModule->Parent) {
1609     ActiveModule->ConfigMacrosExhaustive = true;
1610   }
1611 
1612   // If we don't have an identifier, we're done.
1613   if (!Tok.is(MMToken::Identifier))
1614     return;
1615 
1616   // Consume the first identifier.
1617   if (!ActiveModule->Parent) {
1618     ActiveModule->ConfigMacros.push_back(Tok.getString().str());
1619   }
1620   consumeToken();
1621 
1622   do {
1623     // If there's a comma, consume it.
1624     if (!Tok.is(MMToken::Comma))
1625       break;
1626     consumeToken();
1627 
1628     // We expect to see a macro name here.
1629     if (!Tok.is(MMToken::Identifier)) {
1630       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_config_macro);
1631       break;
1632     }
1633 
1634     // Consume the macro name.
1635     if (!ActiveModule->Parent) {
1636       ActiveModule->ConfigMacros.push_back(Tok.getString().str());
1637     }
1638     consumeToken();
1639   } while (true);
1640 }
1641 
1642 /// \brief Format a module-id into a string.
1643 static std::string formatModuleId(const ModuleId &Id) {
1644   std::string result;
1645   {
1646     llvm::raw_string_ostream OS(result);
1647 
1648     for (unsigned I = 0, N = Id.size(); I != N; ++I) {
1649       if (I)
1650         OS << ".";
1651       OS << Id[I].first;
1652     }
1653   }
1654 
1655   return result;
1656 }
1657 
1658 /// \brief Parse a conflict declaration.
1659 ///
1660 ///   module-declaration:
1661 ///     'conflict' module-id ',' string-literal
1662 void ModuleMapParser::parseConflict() {
1663   assert(Tok.is(MMToken::Conflict));
1664   SourceLocation ConflictLoc = consumeToken();
1665   Module::UnresolvedConflict Conflict;
1666 
1667   // Parse the module-id.
1668   if (parseModuleId(Conflict.Id))
1669     return;
1670 
1671   // Parse the ','.
1672   if (!Tok.is(MMToken::Comma)) {
1673     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_comma)
1674       << SourceRange(ConflictLoc);
1675     return;
1676   }
1677   consumeToken();
1678 
1679   // Parse the message.
1680   if (!Tok.is(MMToken::StringLiteral)) {
1681     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_conflicts_message)
1682       << formatModuleId(Conflict.Id);
1683     return;
1684   }
1685   Conflict.Message = Tok.getString().str();
1686   consumeToken();
1687 
1688   // Add this unresolved conflict.
1689   ActiveModule->UnresolvedConflicts.push_back(Conflict);
1690 }
1691 
1692 /// \brief Parse an inferred module declaration (wildcard modules).
1693 ///
1694 ///   module-declaration:
1695 ///     'explicit'[opt] 'framework'[opt] 'module' * attributes[opt]
1696 ///       { inferred-module-member* }
1697 ///
1698 ///   inferred-module-member:
1699 ///     'export' '*'
1700 ///     'exclude' identifier
1701 void ModuleMapParser::parseInferredModuleDecl(bool Framework, bool Explicit) {
1702   assert(Tok.is(MMToken::Star));
1703   SourceLocation StarLoc = consumeToken();
1704   bool Failed = false;
1705 
1706   // Inferred modules must be submodules.
1707   if (!ActiveModule && !Framework) {
1708     Diags.Report(StarLoc, diag::err_mmap_top_level_inferred_submodule);
1709     Failed = true;
1710   }
1711 
1712   if (ActiveModule) {
1713     // Inferred modules must have umbrella directories.
1714     if (!Failed && !ActiveModule->getUmbrellaDir()) {
1715       Diags.Report(StarLoc, diag::err_mmap_inferred_no_umbrella);
1716       Failed = true;
1717     }
1718 
1719     // Check for redefinition of an inferred module.
1720     if (!Failed && ActiveModule->InferSubmodules) {
1721       Diags.Report(StarLoc, diag::err_mmap_inferred_redef);
1722       if (ActiveModule->InferredSubmoduleLoc.isValid())
1723         Diags.Report(ActiveModule->InferredSubmoduleLoc,
1724                      diag::note_mmap_prev_definition);
1725       Failed = true;
1726     }
1727 
1728     // Check for the 'framework' keyword, which is not permitted here.
1729     if (Framework) {
1730       Diags.Report(StarLoc, diag::err_mmap_inferred_framework_submodule);
1731       Framework = false;
1732     }
1733   } else if (Explicit) {
1734     Diags.Report(StarLoc, diag::err_mmap_explicit_inferred_framework);
1735     Explicit = false;
1736   }
1737 
1738   // If there were any problems with this inferred submodule, skip its body.
1739   if (Failed) {
1740     if (Tok.is(MMToken::LBrace)) {
1741       consumeToken();
1742       skipUntil(MMToken::RBrace);
1743       if (Tok.is(MMToken::RBrace))
1744         consumeToken();
1745     }
1746     HadError = true;
1747     return;
1748   }
1749 
1750   // Parse optional attributes.
1751   Attributes Attrs;
1752   parseOptionalAttributes(Attrs);
1753 
1754   if (ActiveModule) {
1755     // Note that we have an inferred submodule.
1756     ActiveModule->InferSubmodules = true;
1757     ActiveModule->InferredSubmoduleLoc = StarLoc;
1758     ActiveModule->InferExplicitSubmodules = Explicit;
1759   } else {
1760     // We'll be inferring framework modules for this directory.
1761     Map.InferredDirectories[Directory].InferModules = true;
1762     Map.InferredDirectories[Directory].InferSystemModules = Attrs.IsSystem;
1763   }
1764 
1765   // Parse the opening brace.
1766   if (!Tok.is(MMToken::LBrace)) {
1767     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_lbrace_wildcard);
1768     HadError = true;
1769     return;
1770   }
1771   SourceLocation LBraceLoc = consumeToken();
1772 
1773   // Parse the body of the inferred submodule.
1774   bool Done = false;
1775   do {
1776     switch (Tok.Kind) {
1777     case MMToken::EndOfFile:
1778     case MMToken::RBrace:
1779       Done = true;
1780       break;
1781 
1782     case MMToken::ExcludeKeyword: {
1783       if (ActiveModule) {
1784         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
1785           << (ActiveModule != 0);
1786         consumeToken();
1787         break;
1788       }
1789 
1790       consumeToken();
1791       if (!Tok.is(MMToken::Identifier)) {
1792         Diags.Report(Tok.getLocation(), diag::err_mmap_missing_exclude_name);
1793         break;
1794       }
1795 
1796       Map.InferredDirectories[Directory].ExcludedModules
1797         .push_back(Tok.getString());
1798       consumeToken();
1799       break;
1800     }
1801 
1802     case MMToken::ExportKeyword:
1803       if (!ActiveModule) {
1804         Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
1805           << (ActiveModule != 0);
1806         consumeToken();
1807         break;
1808       }
1809 
1810       consumeToken();
1811       if (Tok.is(MMToken::Star))
1812         ActiveModule->InferExportWildcard = true;
1813       else
1814         Diags.Report(Tok.getLocation(),
1815                      diag::err_mmap_expected_export_wildcard);
1816       consumeToken();
1817       break;
1818 
1819     case MMToken::ExplicitKeyword:
1820     case MMToken::ModuleKeyword:
1821     case MMToken::HeaderKeyword:
1822     case MMToken::PrivateKeyword:
1823     case MMToken::UmbrellaKeyword:
1824     default:
1825       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_inferred_member)
1826           << (ActiveModule != 0);
1827       consumeToken();
1828       break;
1829     }
1830   } while (!Done);
1831 
1832   if (Tok.is(MMToken::RBrace))
1833     consumeToken();
1834   else {
1835     Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rbrace);
1836     Diags.Report(LBraceLoc, diag::note_mmap_lbrace_match);
1837     HadError = true;
1838   }
1839 }
1840 
1841 /// \brief Parse optional attributes.
1842 ///
1843 ///   attributes:
1844 ///     attribute attributes
1845 ///     attribute
1846 ///
1847 ///   attribute:
1848 ///     [ identifier ]
1849 ///
1850 /// \param Attrs Will be filled in with the parsed attributes.
1851 ///
1852 /// \returns true if an error occurred, false otherwise.
1853 bool ModuleMapParser::parseOptionalAttributes(Attributes &Attrs) {
1854   bool HadError = false;
1855 
1856   while (Tok.is(MMToken::LSquare)) {
1857     // Consume the '['.
1858     SourceLocation LSquareLoc = consumeToken();
1859 
1860     // Check whether we have an attribute name here.
1861     if (!Tok.is(MMToken::Identifier)) {
1862       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_attribute);
1863       skipUntil(MMToken::RSquare);
1864       if (Tok.is(MMToken::RSquare))
1865         consumeToken();
1866       HadError = true;
1867     }
1868 
1869     // Decode the attribute name.
1870     AttributeKind Attribute
1871       = llvm::StringSwitch<AttributeKind>(Tok.getString())
1872           .Case("exhaustive", AT_exhaustive)
1873           .Case("system", AT_system)
1874           .Default(AT_unknown);
1875     switch (Attribute) {
1876     case AT_unknown:
1877       Diags.Report(Tok.getLocation(), diag::warn_mmap_unknown_attribute)
1878         << Tok.getString();
1879       break;
1880 
1881     case AT_system:
1882       Attrs.IsSystem = true;
1883       break;
1884 
1885     case AT_exhaustive:
1886       Attrs.IsExhaustive = true;
1887       break;
1888     }
1889     consumeToken();
1890 
1891     // Consume the ']'.
1892     if (!Tok.is(MMToken::RSquare)) {
1893       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_rsquare);
1894       Diags.Report(LSquareLoc, diag::note_mmap_lsquare_match);
1895       skipUntil(MMToken::RSquare);
1896       HadError = true;
1897     }
1898 
1899     if (Tok.is(MMToken::RSquare))
1900       consumeToken();
1901   }
1902 
1903   return HadError;
1904 }
1905 
1906 /// \brief If there is a specific header search directory due the presence
1907 /// of an umbrella directory, retrieve that directory. Otherwise, returns null.
1908 const DirectoryEntry *ModuleMapParser::getOverriddenHeaderSearchDir() {
1909   for (Module *Mod = ActiveModule; Mod; Mod = Mod->Parent) {
1910     // If we have an umbrella directory, use that.
1911     if (Mod->hasUmbrellaDir())
1912       return Mod->getUmbrellaDir();
1913 
1914     // If we have a framework directory, stop looking.
1915     if (Mod->IsFramework)
1916       return 0;
1917   }
1918 
1919   return 0;
1920 }
1921 
1922 /// \brief Parse a module map file.
1923 ///
1924 ///   module-map-file:
1925 ///     module-declaration*
1926 bool ModuleMapParser::parseModuleMapFile() {
1927   do {
1928     switch (Tok.Kind) {
1929     case MMToken::EndOfFile:
1930       return HadError;
1931 
1932     case MMToken::ExplicitKeyword:
1933     case MMToken::ModuleKeyword:
1934     case MMToken::FrameworkKeyword:
1935       parseModuleDecl();
1936       break;
1937 
1938     case MMToken::Comma:
1939     case MMToken::ConfigMacros:
1940     case MMToken::Conflict:
1941     case MMToken::ExcludeKeyword:
1942     case MMToken::ExportKeyword:
1943     case MMToken::HeaderKeyword:
1944     case MMToken::Identifier:
1945     case MMToken::LBrace:
1946     case MMToken::LinkKeyword:
1947     case MMToken::LSquare:
1948     case MMToken::Period:
1949     case MMToken::PrivateKeyword:
1950     case MMToken::RBrace:
1951     case MMToken::RSquare:
1952     case MMToken::RequiresKeyword:
1953     case MMToken::Star:
1954     case MMToken::StringLiteral:
1955     case MMToken::UmbrellaKeyword:
1956       Diags.Report(Tok.getLocation(), diag::err_mmap_expected_module);
1957       HadError = true;
1958       consumeToken();
1959       break;
1960     }
1961   } while (true);
1962 }
1963 
1964 bool ModuleMap::parseModuleMapFile(const FileEntry *File, bool IsSystem) {
1965   llvm::DenseMap<const FileEntry *, bool>::iterator Known
1966     = ParsedModuleMap.find(File);
1967   if (Known != ParsedModuleMap.end())
1968     return Known->second;
1969 
1970   assert(Target != 0 && "Missing target information");
1971   FileID ID = SourceMgr->createFileID(File, SourceLocation(), SrcMgr::C_User);
1972   const llvm::MemoryBuffer *Buffer = SourceMgr->getBuffer(ID);
1973   if (!Buffer)
1974     return ParsedModuleMap[File] = true;
1975 
1976   // Parse this module map file.
1977   Lexer L(ID, SourceMgr->getBuffer(ID), *SourceMgr, MMapLangOpts);
1978   Diags->getClient()->BeginSourceFile(MMapLangOpts);
1979   ModuleMapParser Parser(L, *SourceMgr, Target, *Diags, *this, File->getDir(),
1980                          BuiltinIncludeDir, IsSystem);
1981   bool Result = Parser.parseModuleMapFile();
1982   Diags->getClient()->EndSourceFile();
1983   ParsedModuleMap[File] = Result;
1984   return Result;
1985 }
1986