xref: /freebsd/contrib/llvm-project/clang/lib/Basic/Module.cpp (revision 9f23cbd6cae82fd77edfad7173432fa8dccd0a95)
1 //===- Module.cpp - Describe a module -------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines the Module class, which describes a module in the source
10 // code.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "clang/Basic/Module.h"
15 #include "clang/Basic/CharInfo.h"
16 #include "clang/Basic/FileManager.h"
17 #include "clang/Basic/LangOptions.h"
18 #include "clang/Basic/SourceLocation.h"
19 #include "clang/Basic/TargetInfo.h"
20 #include "llvm/ADT/ArrayRef.h"
21 #include "llvm/ADT/SmallVector.h"
22 #include "llvm/ADT/StringMap.h"
23 #include "llvm/ADT/StringRef.h"
24 #include "llvm/ADT/StringSwitch.h"
25 #include "llvm/Support/Compiler.h"
26 #include "llvm/Support/ErrorHandling.h"
27 #include "llvm/Support/raw_ostream.h"
28 #include <algorithm>
29 #include <cassert>
30 #include <functional>
31 #include <string>
32 #include <utility>
33 #include <vector>
34 
35 using namespace clang;
36 
37 Module::Module(StringRef Name, SourceLocation DefinitionLoc, Module *Parent,
38                bool IsFramework, bool IsExplicit, unsigned VisibilityID)
39     : Name(Name), DefinitionLoc(DefinitionLoc), Parent(Parent),
40       VisibilityID(VisibilityID), IsUnimportable(false),
41       HasIncompatibleModuleFile(false), IsAvailable(true),
42       IsFromModuleFile(false), IsFramework(IsFramework), IsExplicit(IsExplicit),
43       IsSystem(false), IsExternC(false), IsInferred(false),
44       InferSubmodules(false), InferExplicitSubmodules(false),
45       InferExportWildcard(false), ConfigMacrosExhaustive(false),
46       NoUndeclaredIncludes(false), ModuleMapIsPrivate(false),
47       NameVisibility(Hidden) {
48   if (Parent) {
49     IsAvailable = Parent->isAvailable();
50     IsUnimportable = Parent->isUnimportable();
51     IsSystem = Parent->IsSystem;
52     IsExternC = Parent->IsExternC;
53     NoUndeclaredIncludes = Parent->NoUndeclaredIncludes;
54     ModuleMapIsPrivate = Parent->ModuleMapIsPrivate;
55 
56     Parent->SubModuleIndex[Name] = Parent->SubModules.size();
57     Parent->SubModules.push_back(this);
58   }
59 }
60 
61 Module::~Module() {
62   for (submodule_iterator I = submodule_begin(), IEnd = submodule_end();
63        I != IEnd; ++I) {
64     delete *I;
65   }
66 }
67 
68 static bool isPlatformEnvironment(const TargetInfo &Target, StringRef Feature) {
69   StringRef Platform = Target.getPlatformName();
70   StringRef Env = Target.getTriple().getEnvironmentName();
71 
72   // Attempt to match platform and environment.
73   if (Platform == Feature || Target.getTriple().getOSName() == Feature ||
74       Env == Feature)
75     return true;
76 
77   auto CmpPlatformEnv = [](StringRef LHS, StringRef RHS) {
78     auto Pos = LHS.find('-');
79     if (Pos == StringRef::npos)
80       return false;
81     SmallString<128> NewLHS = LHS.slice(0, Pos);
82     NewLHS += LHS.slice(Pos+1, LHS.size());
83     return NewLHS == RHS;
84   };
85 
86   SmallString<128> PlatformEnv = Target.getTriple().getOSAndEnvironmentName();
87   // Darwin has different but equivalent variants for simulators, example:
88   //   1. x86_64-apple-ios-simulator
89   //   2. x86_64-apple-iossimulator
90   // where both are valid examples of the same platform+environment but in the
91   // variant (2) the simulator is hardcoded as part of the platform name. Both
92   // forms above should match for "iossimulator" requirement.
93   if (Target.getTriple().isOSDarwin() && PlatformEnv.endswith("simulator"))
94     return PlatformEnv == Feature || CmpPlatformEnv(PlatformEnv, Feature);
95 
96   return PlatformEnv == Feature;
97 }
98 
99 /// Determine whether a translation unit built using the current
100 /// language options has the given feature.
101 static bool hasFeature(StringRef Feature, const LangOptions &LangOpts,
102                        const TargetInfo &Target) {
103   bool HasFeature = llvm::StringSwitch<bool>(Feature)
104                         .Case("altivec", LangOpts.AltiVec)
105                         .Case("blocks", LangOpts.Blocks)
106                         .Case("coroutines", LangOpts.Coroutines)
107                         .Case("cplusplus", LangOpts.CPlusPlus)
108                         .Case("cplusplus11", LangOpts.CPlusPlus11)
109                         .Case("cplusplus14", LangOpts.CPlusPlus14)
110                         .Case("cplusplus17", LangOpts.CPlusPlus17)
111                         .Case("c99", LangOpts.C99)
112                         .Case("c11", LangOpts.C11)
113                         .Case("c17", LangOpts.C17)
114                         .Case("freestanding", LangOpts.Freestanding)
115                         .Case("gnuinlineasm", LangOpts.GNUAsm)
116                         .Case("objc", LangOpts.ObjC)
117                         .Case("objc_arc", LangOpts.ObjCAutoRefCount)
118                         .Case("opencl", LangOpts.OpenCL)
119                         .Case("tls", Target.isTLSSupported())
120                         .Case("zvector", LangOpts.ZVector)
121                         .Default(Target.hasFeature(Feature) ||
122                                  isPlatformEnvironment(Target, Feature));
123   if (!HasFeature)
124     HasFeature = llvm::is_contained(LangOpts.ModuleFeatures, Feature);
125   return HasFeature;
126 }
127 
128 bool Module::isUnimportable(const LangOptions &LangOpts,
129                             const TargetInfo &Target, Requirement &Req,
130                             Module *&ShadowingModule) const {
131   if (!IsUnimportable)
132     return false;
133 
134   for (const Module *Current = this; Current; Current = Current->Parent) {
135     if (Current->ShadowingModule) {
136       ShadowingModule = Current->ShadowingModule;
137       return true;
138     }
139     for (unsigned I = 0, N = Current->Requirements.size(); I != N; ++I) {
140       if (hasFeature(Current->Requirements[I].first, LangOpts, Target) !=
141               Current->Requirements[I].second) {
142         Req = Current->Requirements[I];
143         return true;
144       }
145     }
146   }
147 
148   llvm_unreachable("could not find a reason why module is unimportable");
149 }
150 
151 // The -fmodule-name option tells the compiler to textually include headers in
152 // the specified module, meaning Clang won't build the specified module. This
153 // is useful in a number of situations, for instance, when building a library
154 // that vends a module map, one might want to avoid hitting intermediate build
155 // products containing the module map or avoid finding the system installed
156 // modulemap for that library.
157 bool Module::isForBuilding(const LangOptions &LangOpts) const {
158   StringRef TopLevelName = getTopLevelModuleName();
159   StringRef CurrentModule = LangOpts.CurrentModule;
160 
161   // When building framework Foo, we want to make sure that Foo *and*
162   // Foo_Private are textually included and no modules are built for both.
163   if (getTopLevelModule()->IsFramework &&
164       CurrentModule == LangOpts.ModuleName &&
165       !CurrentModule.endswith("_Private") && TopLevelName.endswith("_Private"))
166     TopLevelName = TopLevelName.drop_back(8);
167 
168   return TopLevelName == CurrentModule;
169 }
170 
171 bool Module::isAvailable(const LangOptions &LangOpts, const TargetInfo &Target,
172                          Requirement &Req,
173                          UnresolvedHeaderDirective &MissingHeader,
174                          Module *&ShadowingModule) const {
175   if (IsAvailable)
176     return true;
177 
178   if (isUnimportable(LangOpts, Target, Req, ShadowingModule))
179     return false;
180 
181   // FIXME: All missing headers are listed on the top-level module. Should we
182   // just look there?
183   for (const Module *Current = this; Current; Current = Current->Parent) {
184     if (!Current->MissingHeaders.empty()) {
185       MissingHeader = Current->MissingHeaders.front();
186       return false;
187     }
188   }
189 
190   llvm_unreachable("could not find a reason why module is unavailable");
191 }
192 
193 bool Module::isSubModuleOf(const Module *Other) const {
194   for (auto *Parent = this; Parent; Parent = Parent->Parent) {
195     if (Parent == Other)
196       return true;
197   }
198   return false;
199 }
200 
201 const Module *Module::getTopLevelModule() const {
202   const Module *Result = this;
203   while (Result->Parent)
204     Result = Result->Parent;
205 
206   return Result;
207 }
208 
209 static StringRef getModuleNameFromComponent(
210     const std::pair<std::string, SourceLocation> &IdComponent) {
211   return IdComponent.first;
212 }
213 
214 static StringRef getModuleNameFromComponent(StringRef R) { return R; }
215 
216 template<typename InputIter>
217 static void printModuleId(raw_ostream &OS, InputIter Begin, InputIter End,
218                           bool AllowStringLiterals = true) {
219   for (InputIter It = Begin; It != End; ++It) {
220     if (It != Begin)
221       OS << ".";
222 
223     StringRef Name = getModuleNameFromComponent(*It);
224     if (!AllowStringLiterals || isValidAsciiIdentifier(Name))
225       OS << Name;
226     else {
227       OS << '"';
228       OS.write_escaped(Name);
229       OS << '"';
230     }
231   }
232 }
233 
234 template<typename Container>
235 static void printModuleId(raw_ostream &OS, const Container &C) {
236   return printModuleId(OS, C.begin(), C.end());
237 }
238 
239 std::string Module::getFullModuleName(bool AllowStringLiterals) const {
240   SmallVector<StringRef, 2> Names;
241 
242   // Build up the set of module names (from innermost to outermost).
243   for (const Module *M = this; M; M = M->Parent)
244     Names.push_back(M->Name);
245 
246   std::string Result;
247 
248   llvm::raw_string_ostream Out(Result);
249   printModuleId(Out, Names.rbegin(), Names.rend(), AllowStringLiterals);
250   Out.flush();
251 
252   return Result;
253 }
254 
255 bool Module::fullModuleNameIs(ArrayRef<StringRef> nameParts) const {
256   for (const Module *M = this; M; M = M->Parent) {
257     if (nameParts.empty() || M->Name != nameParts.back())
258       return false;
259     nameParts = nameParts.drop_back();
260   }
261   return nameParts.empty();
262 }
263 
264 Module::DirectoryName Module::getUmbrellaDir() const {
265   if (Header U = getUmbrellaHeader())
266     return {"", "", U.Entry->getDir()};
267 
268   return {UmbrellaAsWritten, UmbrellaRelativeToRootModuleDirectory,
269           Umbrella.dyn_cast<const DirectoryEntry *>()};
270 }
271 
272 void Module::addTopHeader(const FileEntry *File) {
273   assert(File);
274   TopHeaders.insert(File);
275 }
276 
277 ArrayRef<const FileEntry *> Module::getTopHeaders(FileManager &FileMgr) {
278   if (!TopHeaderNames.empty()) {
279     for (std::vector<std::string>::iterator
280            I = TopHeaderNames.begin(), E = TopHeaderNames.end(); I != E; ++I) {
281       if (auto FE = FileMgr.getFile(*I))
282         TopHeaders.insert(*FE);
283     }
284     TopHeaderNames.clear();
285   }
286 
287   return llvm::ArrayRef(TopHeaders.begin(), TopHeaders.end());
288 }
289 
290 bool Module::directlyUses(const Module *Requested) {
291   auto *Top = getTopLevelModule();
292 
293   // A top-level module implicitly uses itself.
294   if (Requested->isSubModuleOf(Top))
295     return true;
296 
297   for (auto *Use : Top->DirectUses)
298     if (Requested->isSubModuleOf(Use))
299       return true;
300 
301   // Anyone is allowed to use our builtin stddef.h and its accompanying module.
302   if (!Requested->Parent && Requested->Name == "_Builtin_stddef_max_align_t")
303     return true;
304 
305   if (NoUndeclaredIncludes)
306     UndeclaredUses.insert(Requested);
307 
308   return false;
309 }
310 
311 void Module::addRequirement(StringRef Feature, bool RequiredState,
312                             const LangOptions &LangOpts,
313                             const TargetInfo &Target) {
314   Requirements.push_back(Requirement(std::string(Feature), RequiredState));
315 
316   // If this feature is currently available, we're done.
317   if (hasFeature(Feature, LangOpts, Target) == RequiredState)
318     return;
319 
320   markUnavailable(/*Unimportable*/true);
321 }
322 
323 void Module::markUnavailable(bool Unimportable) {
324   auto needUpdate = [Unimportable](Module *M) {
325     return M->IsAvailable || (!M->IsUnimportable && Unimportable);
326   };
327 
328   if (!needUpdate(this))
329     return;
330 
331   SmallVector<Module *, 2> Stack;
332   Stack.push_back(this);
333   while (!Stack.empty()) {
334     Module *Current = Stack.back();
335     Stack.pop_back();
336 
337     if (!needUpdate(Current))
338       continue;
339 
340     Current->IsAvailable = false;
341     Current->IsUnimportable |= Unimportable;
342     for (submodule_iterator Sub = Current->submodule_begin(),
343                          SubEnd = Current->submodule_end();
344          Sub != SubEnd; ++Sub) {
345       if (needUpdate(*Sub))
346         Stack.push_back(*Sub);
347     }
348   }
349 }
350 
351 Module *Module::findSubmodule(StringRef Name) const {
352   llvm::StringMap<unsigned>::const_iterator Pos = SubModuleIndex.find(Name);
353   if (Pos == SubModuleIndex.end())
354     return nullptr;
355 
356   return SubModules[Pos->getValue()];
357 }
358 
359 Module *Module::findOrInferSubmodule(StringRef Name) {
360   llvm::StringMap<unsigned>::const_iterator Pos = SubModuleIndex.find(Name);
361   if (Pos != SubModuleIndex.end())
362     return SubModules[Pos->getValue()];
363   if (!InferSubmodules)
364     return nullptr;
365   Module *Result = new Module(Name, SourceLocation(), this, false, InferExplicitSubmodules, 0);
366   Result->InferExplicitSubmodules = InferExplicitSubmodules;
367   Result->InferSubmodules = InferSubmodules;
368   Result->InferExportWildcard = InferExportWildcard;
369   if (Result->InferExportWildcard)
370     Result->Exports.push_back(Module::ExportDecl(nullptr, true));
371   return Result;
372 }
373 
374 void Module::getExportedModules(SmallVectorImpl<Module *> &Exported) const {
375   // All non-explicit submodules are exported.
376   for (std::vector<Module *>::const_iterator I = SubModules.begin(),
377                                              E = SubModules.end();
378        I != E; ++I) {
379     Module *Mod = *I;
380     if (!Mod->IsExplicit)
381       Exported.push_back(Mod);
382   }
383 
384   // Find re-exported modules by filtering the list of imported modules.
385   bool AnyWildcard = false;
386   bool UnrestrictedWildcard = false;
387   SmallVector<Module *, 4> WildcardRestrictions;
388   for (unsigned I = 0, N = Exports.size(); I != N; ++I) {
389     Module *Mod = Exports[I].getPointer();
390     if (!Exports[I].getInt()) {
391       // Export a named module directly; no wildcards involved.
392       Exported.push_back(Mod);
393 
394       continue;
395     }
396 
397     // Wildcard export: export all of the imported modules that match
398     // the given pattern.
399     AnyWildcard = true;
400     if (UnrestrictedWildcard)
401       continue;
402 
403     if (Module *Restriction = Exports[I].getPointer())
404       WildcardRestrictions.push_back(Restriction);
405     else {
406       WildcardRestrictions.clear();
407       UnrestrictedWildcard = true;
408     }
409   }
410 
411   // If there were any wildcards, push any imported modules that were
412   // re-exported by the wildcard restriction.
413   if (!AnyWildcard)
414     return;
415 
416   for (unsigned I = 0, N = Imports.size(); I != N; ++I) {
417     Module *Mod = Imports[I];
418     bool Acceptable = UnrestrictedWildcard;
419     if (!Acceptable) {
420       // Check whether this module meets one of the restrictions.
421       for (unsigned R = 0, NR = WildcardRestrictions.size(); R != NR; ++R) {
422         Module *Restriction = WildcardRestrictions[R];
423         if (Mod == Restriction || Mod->isSubModuleOf(Restriction)) {
424           Acceptable = true;
425           break;
426         }
427       }
428     }
429 
430     if (!Acceptable)
431       continue;
432 
433     Exported.push_back(Mod);
434   }
435 }
436 
437 void Module::buildVisibleModulesCache() const {
438   assert(VisibleModulesCache.empty() && "cache does not need building");
439 
440   // This module is visible to itself.
441   VisibleModulesCache.insert(this);
442 
443   // Every imported module is visible.
444   SmallVector<Module *, 16> Stack(Imports.begin(), Imports.end());
445   while (!Stack.empty()) {
446     Module *CurrModule = Stack.pop_back_val();
447 
448     // Every module transitively exported by an imported module is visible.
449     if (VisibleModulesCache.insert(CurrModule).second)
450       CurrModule->getExportedModules(Stack);
451   }
452 }
453 
454 void Module::print(raw_ostream &OS, unsigned Indent, bool Dump) const {
455   OS.indent(Indent);
456   if (IsFramework)
457     OS << "framework ";
458   if (IsExplicit)
459     OS << "explicit ";
460   OS << "module ";
461   printModuleId(OS, &Name, &Name + 1);
462 
463   if (IsSystem || IsExternC) {
464     OS.indent(Indent + 2);
465     if (IsSystem)
466       OS << " [system]";
467     if (IsExternC)
468       OS << " [extern_c]";
469   }
470 
471   OS << " {\n";
472 
473   if (!Requirements.empty()) {
474     OS.indent(Indent + 2);
475     OS << "requires ";
476     for (unsigned I = 0, N = Requirements.size(); I != N; ++I) {
477       if (I)
478         OS << ", ";
479       if (!Requirements[I].second)
480         OS << "!";
481       OS << Requirements[I].first;
482     }
483     OS << "\n";
484   }
485 
486   if (Header H = getUmbrellaHeader()) {
487     OS.indent(Indent + 2);
488     OS << "umbrella header \"";
489     OS.write_escaped(H.NameAsWritten);
490     OS << "\"\n";
491   } else if (DirectoryName D = getUmbrellaDir()) {
492     OS.indent(Indent + 2);
493     OS << "umbrella \"";
494     OS.write_escaped(D.NameAsWritten);
495     OS << "\"\n";
496   }
497 
498   if (!ConfigMacros.empty() || ConfigMacrosExhaustive) {
499     OS.indent(Indent + 2);
500     OS << "config_macros ";
501     if (ConfigMacrosExhaustive)
502       OS << "[exhaustive]";
503     for (unsigned I = 0, N = ConfigMacros.size(); I != N; ++I) {
504       if (I)
505         OS << ", ";
506       OS << ConfigMacros[I];
507     }
508     OS << "\n";
509   }
510 
511   struct {
512     StringRef Prefix;
513     HeaderKind Kind;
514   } Kinds[] = {{"", HK_Normal},
515                {"textual ", HK_Textual},
516                {"private ", HK_Private},
517                {"private textual ", HK_PrivateTextual},
518                {"exclude ", HK_Excluded}};
519 
520   for (auto &K : Kinds) {
521     assert(&K == &Kinds[K.Kind] && "kinds in wrong order");
522     for (auto &H : Headers[K.Kind]) {
523       OS.indent(Indent + 2);
524       OS << K.Prefix << "header \"";
525       OS.write_escaped(H.NameAsWritten);
526       OS << "\" { size " << H.Entry->getSize()
527          << " mtime " << H.Entry->getModificationTime() << " }\n";
528     }
529   }
530   for (auto *Unresolved : {&UnresolvedHeaders, &MissingHeaders}) {
531     for (auto &U : *Unresolved) {
532       OS.indent(Indent + 2);
533       OS << Kinds[U.Kind].Prefix << "header \"";
534       OS.write_escaped(U.FileName);
535       OS << "\"";
536       if (U.Size || U.ModTime) {
537         OS << " {";
538         if (U.Size)
539           OS << " size " << *U.Size;
540         if (U.ModTime)
541           OS << " mtime " << *U.ModTime;
542         OS << " }";
543       }
544       OS << "\n";
545     }
546   }
547 
548   if (!ExportAsModule.empty()) {
549     OS.indent(Indent + 2);
550     OS << "export_as" << ExportAsModule << "\n";
551   }
552 
553   for (submodule_const_iterator MI = submodule_begin(), MIEnd = submodule_end();
554        MI != MIEnd; ++MI)
555     // Print inferred subframework modules so that we don't need to re-infer
556     // them (requires expensive directory iteration + stat calls) when we build
557     // the module. Regular inferred submodules are OK, as we need to look at all
558     // those header files anyway.
559     if (!(*MI)->IsInferred || (*MI)->IsFramework)
560       (*MI)->print(OS, Indent + 2, Dump);
561 
562   for (unsigned I = 0, N = Exports.size(); I != N; ++I) {
563     OS.indent(Indent + 2);
564     OS << "export ";
565     if (Module *Restriction = Exports[I].getPointer()) {
566       OS << Restriction->getFullModuleName(true);
567       if (Exports[I].getInt())
568         OS << ".*";
569     } else {
570       OS << "*";
571     }
572     OS << "\n";
573   }
574 
575   for (unsigned I = 0, N = UnresolvedExports.size(); I != N; ++I) {
576     OS.indent(Indent + 2);
577     OS << "export ";
578     printModuleId(OS, UnresolvedExports[I].Id);
579     if (UnresolvedExports[I].Wildcard)
580       OS << (UnresolvedExports[I].Id.empty() ? "*" : ".*");
581     OS << "\n";
582   }
583 
584   if (Dump) {
585     for (Module *M : Imports) {
586       OS.indent(Indent + 2);
587       llvm::errs() << "import " << M->getFullModuleName() << "\n";
588     }
589   }
590 
591   for (unsigned I = 0, N = DirectUses.size(); I != N; ++I) {
592     OS.indent(Indent + 2);
593     OS << "use ";
594     OS << DirectUses[I]->getFullModuleName(true);
595     OS << "\n";
596   }
597 
598   for (unsigned I = 0, N = UnresolvedDirectUses.size(); I != N; ++I) {
599     OS.indent(Indent + 2);
600     OS << "use ";
601     printModuleId(OS, UnresolvedDirectUses[I]);
602     OS << "\n";
603   }
604 
605   for (unsigned I = 0, N = LinkLibraries.size(); I != N; ++I) {
606     OS.indent(Indent + 2);
607     OS << "link ";
608     if (LinkLibraries[I].IsFramework)
609       OS << "framework ";
610     OS << "\"";
611     OS.write_escaped(LinkLibraries[I].Library);
612     OS << "\"";
613   }
614 
615   for (unsigned I = 0, N = UnresolvedConflicts.size(); I != N; ++I) {
616     OS.indent(Indent + 2);
617     OS << "conflict ";
618     printModuleId(OS, UnresolvedConflicts[I].Id);
619     OS << ", \"";
620     OS.write_escaped(UnresolvedConflicts[I].Message);
621     OS << "\"\n";
622   }
623 
624   for (unsigned I = 0, N = Conflicts.size(); I != N; ++I) {
625     OS.indent(Indent + 2);
626     OS << "conflict ";
627     OS << Conflicts[I].Other->getFullModuleName(true);
628     OS << ", \"";
629     OS.write_escaped(Conflicts[I].Message);
630     OS << "\"\n";
631   }
632 
633   if (InferSubmodules) {
634     OS.indent(Indent + 2);
635     if (InferExplicitSubmodules)
636       OS << "explicit ";
637     OS << "module * {\n";
638     if (InferExportWildcard) {
639       OS.indent(Indent + 4);
640       OS << "export *\n";
641     }
642     OS.indent(Indent + 2);
643     OS << "}\n";
644   }
645 
646   OS.indent(Indent);
647   OS << "}\n";
648 }
649 
650 LLVM_DUMP_METHOD void Module::dump() const {
651   print(llvm::errs(), 0, true);
652 }
653 
654 void VisibleModuleSet::setVisible(Module *M, SourceLocation Loc,
655                                   VisibleCallback Vis, ConflictCallback Cb) {
656   // We can't import a global module fragment so the location can be invalid.
657   assert((M->isGlobalModule() || Loc.isValid()) &&
658          "setVisible expects a valid import location");
659   if (isVisible(M))
660     return;
661 
662   ++Generation;
663 
664   struct Visiting {
665     Module *M;
666     Visiting *ExportedBy;
667   };
668 
669   std::function<void(Visiting)> VisitModule = [&](Visiting V) {
670     // Nothing to do for a module that's already visible.
671     unsigned ID = V.M->getVisibilityID();
672     if (ImportLocs.size() <= ID)
673       ImportLocs.resize(ID + 1);
674     else if (ImportLocs[ID].isValid())
675       return;
676 
677     ImportLocs[ID] = Loc;
678     Vis(V.M);
679 
680     // Make any exported modules visible.
681     SmallVector<Module *, 16> Exports;
682     V.M->getExportedModules(Exports);
683     for (Module *E : Exports) {
684       // Don't import non-importable modules.
685       if (!E->isUnimportable())
686         VisitModule({E, &V});
687     }
688 
689     for (auto &C : V.M->Conflicts) {
690       if (isVisible(C.Other)) {
691         llvm::SmallVector<Module*, 8> Path;
692         for (Visiting *I = &V; I; I = I->ExportedBy)
693           Path.push_back(I->M);
694         Cb(Path, C.Other, C.Message);
695       }
696     }
697   };
698   VisitModule({M, nullptr});
699 }
700 
701 ASTSourceDescriptor::ASTSourceDescriptor(Module &M)
702     : Signature(M.Signature), ClangModule(&M) {
703   if (M.Directory)
704     Path = M.Directory->getName();
705   if (auto File = M.getASTFile())
706     ASTFile = File->getName();
707 }
708 
709 std::string ASTSourceDescriptor::getModuleName() const {
710   if (ClangModule)
711     return ClangModule->Name;
712   else
713     return std::string(PCHModuleName);
714 }
715