xref: /aosp_15_r20/external/clang/lib/Basic/Module.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- Module.cpp - Describe a module -----------------------------------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This file defines the Module class, which describes a module in the source
11*67e74705SXin Li // code.
12*67e74705SXin Li //
13*67e74705SXin Li //===----------------------------------------------------------------------===//
14*67e74705SXin Li 
15*67e74705SXin Li #include "clang/Basic/Module.h"
16*67e74705SXin Li #include "clang/Basic/FileManager.h"
17*67e74705SXin Li #include "clang/Basic/LangOptions.h"
18*67e74705SXin Li #include "clang/Basic/TargetInfo.h"
19*67e74705SXin Li #include "llvm/ADT/ArrayRef.h"
20*67e74705SXin Li #include "llvm/ADT/SmallVector.h"
21*67e74705SXin Li #include "llvm/ADT/StringSwitch.h"
22*67e74705SXin Li #include "llvm/Support/ErrorHandling.h"
23*67e74705SXin Li #include "llvm/Support/raw_ostream.h"
24*67e74705SXin Li 
25*67e74705SXin Li using namespace clang;
26*67e74705SXin Li 
Module(StringRef Name,SourceLocation DefinitionLoc,Module * Parent,bool IsFramework,bool IsExplicit,unsigned VisibilityID)27*67e74705SXin Li Module::Module(StringRef Name, SourceLocation DefinitionLoc, Module *Parent,
28*67e74705SXin Li                bool IsFramework, bool IsExplicit, unsigned VisibilityID)
29*67e74705SXin Li     : Name(Name), DefinitionLoc(DefinitionLoc), Parent(Parent), Directory(),
30*67e74705SXin Li       Umbrella(), Signature(0), ASTFile(nullptr), VisibilityID(VisibilityID),
31*67e74705SXin Li       IsMissingRequirement(false), HasIncompatibleModuleFile(false),
32*67e74705SXin Li       IsAvailable(true), IsFromModuleFile(false), IsFramework(IsFramework),
33*67e74705SXin Li       IsExplicit(IsExplicit), IsSystem(false), IsExternC(false),
34*67e74705SXin Li       IsInferred(false), InferSubmodules(false), InferExplicitSubmodules(false),
35*67e74705SXin Li       InferExportWildcard(false), ConfigMacrosExhaustive(false),
36*67e74705SXin Li       NameVisibility(Hidden) {
37*67e74705SXin Li   if (Parent) {
38*67e74705SXin Li     if (!Parent->isAvailable())
39*67e74705SXin Li       IsAvailable = false;
40*67e74705SXin Li     if (Parent->IsSystem)
41*67e74705SXin Li       IsSystem = true;
42*67e74705SXin Li     if (Parent->IsExternC)
43*67e74705SXin Li       IsExternC = true;
44*67e74705SXin Li     IsMissingRequirement = Parent->IsMissingRequirement;
45*67e74705SXin Li 
46*67e74705SXin Li     Parent->SubModuleIndex[Name] = Parent->SubModules.size();
47*67e74705SXin Li     Parent->SubModules.push_back(this);
48*67e74705SXin Li   }
49*67e74705SXin Li }
50*67e74705SXin Li 
~Module()51*67e74705SXin Li Module::~Module() {
52*67e74705SXin Li   for (submodule_iterator I = submodule_begin(), IEnd = submodule_end();
53*67e74705SXin Li        I != IEnd; ++I) {
54*67e74705SXin Li     delete *I;
55*67e74705SXin Li   }
56*67e74705SXin Li }
57*67e74705SXin Li 
58*67e74705SXin Li /// \brief Determine whether a translation unit built using the current
59*67e74705SXin Li /// language options has the given feature.
hasFeature(StringRef Feature,const LangOptions & LangOpts,const TargetInfo & Target)60*67e74705SXin Li static bool hasFeature(StringRef Feature, const LangOptions &LangOpts,
61*67e74705SXin Li                        const TargetInfo &Target) {
62*67e74705SXin Li   bool HasFeature = llvm::StringSwitch<bool>(Feature)
63*67e74705SXin Li                         .Case("altivec", LangOpts.AltiVec)
64*67e74705SXin Li                         .Case("blocks", LangOpts.Blocks)
65*67e74705SXin Li                         .Case("cplusplus", LangOpts.CPlusPlus)
66*67e74705SXin Li                         .Case("cplusplus11", LangOpts.CPlusPlus11)
67*67e74705SXin Li                         .Case("objc", LangOpts.ObjC1)
68*67e74705SXin Li                         .Case("objc_arc", LangOpts.ObjCAutoRefCount)
69*67e74705SXin Li                         .Case("opencl", LangOpts.OpenCL)
70*67e74705SXin Li                         .Case("tls", Target.isTLSSupported())
71*67e74705SXin Li                         .Case("zvector", LangOpts.ZVector)
72*67e74705SXin Li                         .Default(Target.hasFeature(Feature));
73*67e74705SXin Li   if (!HasFeature)
74*67e74705SXin Li     HasFeature = std::find(LangOpts.ModuleFeatures.begin(),
75*67e74705SXin Li                            LangOpts.ModuleFeatures.end(),
76*67e74705SXin Li                            Feature) != LangOpts.ModuleFeatures.end();
77*67e74705SXin Li   return HasFeature;
78*67e74705SXin Li }
79*67e74705SXin Li 
isAvailable(const LangOptions & LangOpts,const TargetInfo & Target,Requirement & Req,UnresolvedHeaderDirective & MissingHeader) const80*67e74705SXin Li bool Module::isAvailable(const LangOptions &LangOpts, const TargetInfo &Target,
81*67e74705SXin Li                          Requirement &Req,
82*67e74705SXin Li                          UnresolvedHeaderDirective &MissingHeader) const {
83*67e74705SXin Li   if (IsAvailable)
84*67e74705SXin Li     return true;
85*67e74705SXin Li 
86*67e74705SXin Li   for (const Module *Current = this; Current; Current = Current->Parent) {
87*67e74705SXin Li     for (unsigned I = 0, N = Current->Requirements.size(); I != N; ++I) {
88*67e74705SXin Li       if (hasFeature(Current->Requirements[I].first, LangOpts, Target) !=
89*67e74705SXin Li               Current->Requirements[I].second) {
90*67e74705SXin Li         Req = Current->Requirements[I];
91*67e74705SXin Li         return false;
92*67e74705SXin Li       }
93*67e74705SXin Li     }
94*67e74705SXin Li     if (!Current->MissingHeaders.empty()) {
95*67e74705SXin Li       MissingHeader = Current->MissingHeaders.front();
96*67e74705SXin Li       return false;
97*67e74705SXin Li     }
98*67e74705SXin Li   }
99*67e74705SXin Li 
100*67e74705SXin Li   llvm_unreachable("could not find a reason why module is unavailable");
101*67e74705SXin Li }
102*67e74705SXin Li 
isSubModuleOf(const Module * Other) const103*67e74705SXin Li bool Module::isSubModuleOf(const Module *Other) const {
104*67e74705SXin Li   const Module *This = this;
105*67e74705SXin Li   do {
106*67e74705SXin Li     if (This == Other)
107*67e74705SXin Li       return true;
108*67e74705SXin Li 
109*67e74705SXin Li     This = This->Parent;
110*67e74705SXin Li   } while (This);
111*67e74705SXin Li 
112*67e74705SXin Li   return false;
113*67e74705SXin Li }
114*67e74705SXin Li 
getTopLevelModule() const115*67e74705SXin Li const Module *Module::getTopLevelModule() const {
116*67e74705SXin Li   const Module *Result = this;
117*67e74705SXin Li   while (Result->Parent)
118*67e74705SXin Li     Result = Result->Parent;
119*67e74705SXin Li 
120*67e74705SXin Li   return Result;
121*67e74705SXin Li }
122*67e74705SXin Li 
getFullModuleName() const123*67e74705SXin Li std::string Module::getFullModuleName() const {
124*67e74705SXin Li   SmallVector<StringRef, 2> Names;
125*67e74705SXin Li 
126*67e74705SXin Li   // Build up the set of module names (from innermost to outermost).
127*67e74705SXin Li   for (const Module *M = this; M; M = M->Parent)
128*67e74705SXin Li     Names.push_back(M->Name);
129*67e74705SXin Li 
130*67e74705SXin Li   std::string Result;
131*67e74705SXin Li   for (SmallVectorImpl<StringRef>::reverse_iterator I = Names.rbegin(),
132*67e74705SXin Li                                                  IEnd = Names.rend();
133*67e74705SXin Li        I != IEnd; ++I) {
134*67e74705SXin Li     if (!Result.empty())
135*67e74705SXin Li       Result += '.';
136*67e74705SXin Li 
137*67e74705SXin Li     Result += *I;
138*67e74705SXin Li   }
139*67e74705SXin Li 
140*67e74705SXin Li   return Result;
141*67e74705SXin Li }
142*67e74705SXin Li 
fullModuleNameIs(ArrayRef<StringRef> nameParts) const143*67e74705SXin Li bool Module::fullModuleNameIs(ArrayRef<StringRef> nameParts) const {
144*67e74705SXin Li   for (const Module *M = this; M; M = M->Parent) {
145*67e74705SXin Li     if (nameParts.empty() || M->Name != nameParts.back())
146*67e74705SXin Li       return false;
147*67e74705SXin Li     nameParts = nameParts.drop_back();
148*67e74705SXin Li   }
149*67e74705SXin Li   return nameParts.empty();
150*67e74705SXin Li }
151*67e74705SXin Li 
getUmbrellaDir() const152*67e74705SXin Li Module::DirectoryName Module::getUmbrellaDir() const {
153*67e74705SXin Li   if (Header U = getUmbrellaHeader())
154*67e74705SXin Li     return {"", U.Entry->getDir()};
155*67e74705SXin Li 
156*67e74705SXin Li   return {UmbrellaAsWritten, Umbrella.dyn_cast<const DirectoryEntry *>()};
157*67e74705SXin Li }
158*67e74705SXin Li 
getTopHeaders(FileManager & FileMgr)159*67e74705SXin Li ArrayRef<const FileEntry *> Module::getTopHeaders(FileManager &FileMgr) {
160*67e74705SXin Li   if (!TopHeaderNames.empty()) {
161*67e74705SXin Li     for (std::vector<std::string>::iterator
162*67e74705SXin Li            I = TopHeaderNames.begin(), E = TopHeaderNames.end(); I != E; ++I) {
163*67e74705SXin Li       if (const FileEntry *FE = FileMgr.getFile(*I))
164*67e74705SXin Li         TopHeaders.insert(FE);
165*67e74705SXin Li     }
166*67e74705SXin Li     TopHeaderNames.clear();
167*67e74705SXin Li   }
168*67e74705SXin Li 
169*67e74705SXin Li   return llvm::makeArrayRef(TopHeaders.begin(), TopHeaders.end());
170*67e74705SXin Li }
171*67e74705SXin Li 
directlyUses(const Module * Requested) const172*67e74705SXin Li bool Module::directlyUses(const Module *Requested) const {
173*67e74705SXin Li   auto *Top = getTopLevelModule();
174*67e74705SXin Li 
175*67e74705SXin Li   // A top-level module implicitly uses itself.
176*67e74705SXin Li   if (Requested->isSubModuleOf(Top))
177*67e74705SXin Li     return true;
178*67e74705SXin Li 
179*67e74705SXin Li   for (auto *Use : Top->DirectUses)
180*67e74705SXin Li     if (Requested->isSubModuleOf(Use))
181*67e74705SXin Li       return true;
182*67e74705SXin Li   return false;
183*67e74705SXin Li }
184*67e74705SXin Li 
addRequirement(StringRef Feature,bool RequiredState,const LangOptions & LangOpts,const TargetInfo & Target)185*67e74705SXin Li void Module::addRequirement(StringRef Feature, bool RequiredState,
186*67e74705SXin Li                             const LangOptions &LangOpts,
187*67e74705SXin Li                             const TargetInfo &Target) {
188*67e74705SXin Li   Requirements.push_back(Requirement(Feature, RequiredState));
189*67e74705SXin Li 
190*67e74705SXin Li   // If this feature is currently available, we're done.
191*67e74705SXin Li   if (hasFeature(Feature, LangOpts, Target) == RequiredState)
192*67e74705SXin Li     return;
193*67e74705SXin Li 
194*67e74705SXin Li   markUnavailable(/*MissingRequirement*/true);
195*67e74705SXin Li }
196*67e74705SXin Li 
markUnavailable(bool MissingRequirement)197*67e74705SXin Li void Module::markUnavailable(bool MissingRequirement) {
198*67e74705SXin Li   auto needUpdate = [MissingRequirement](Module *M) {
199*67e74705SXin Li     return M->IsAvailable || (!M->IsMissingRequirement && MissingRequirement);
200*67e74705SXin Li   };
201*67e74705SXin Li 
202*67e74705SXin Li   if (!needUpdate(this))
203*67e74705SXin Li     return;
204*67e74705SXin Li 
205*67e74705SXin Li   SmallVector<Module *, 2> Stack;
206*67e74705SXin Li   Stack.push_back(this);
207*67e74705SXin Li   while (!Stack.empty()) {
208*67e74705SXin Li     Module *Current = Stack.back();
209*67e74705SXin Li     Stack.pop_back();
210*67e74705SXin Li 
211*67e74705SXin Li     if (!needUpdate(Current))
212*67e74705SXin Li       continue;
213*67e74705SXin Li 
214*67e74705SXin Li     Current->IsAvailable = false;
215*67e74705SXin Li     Current->IsMissingRequirement |= MissingRequirement;
216*67e74705SXin Li     for (submodule_iterator Sub = Current->submodule_begin(),
217*67e74705SXin Li                          SubEnd = Current->submodule_end();
218*67e74705SXin Li          Sub != SubEnd; ++Sub) {
219*67e74705SXin Li       if (needUpdate(*Sub))
220*67e74705SXin Li         Stack.push_back(*Sub);
221*67e74705SXin Li     }
222*67e74705SXin Li   }
223*67e74705SXin Li }
224*67e74705SXin Li 
findSubmodule(StringRef Name) const225*67e74705SXin Li Module *Module::findSubmodule(StringRef Name) const {
226*67e74705SXin Li   llvm::StringMap<unsigned>::const_iterator Pos = SubModuleIndex.find(Name);
227*67e74705SXin Li   if (Pos == SubModuleIndex.end())
228*67e74705SXin Li     return nullptr;
229*67e74705SXin Li 
230*67e74705SXin Li   return SubModules[Pos->getValue()];
231*67e74705SXin Li }
232*67e74705SXin Li 
printModuleId(raw_ostream & OS,const ModuleId & Id)233*67e74705SXin Li static void printModuleId(raw_ostream &OS, const ModuleId &Id) {
234*67e74705SXin Li   for (unsigned I = 0, N = Id.size(); I != N; ++I) {
235*67e74705SXin Li     if (I)
236*67e74705SXin Li       OS << ".";
237*67e74705SXin Li     OS << Id[I].first;
238*67e74705SXin Li   }
239*67e74705SXin Li }
240*67e74705SXin Li 
getExportedModules(SmallVectorImpl<Module * > & Exported) const241*67e74705SXin Li void Module::getExportedModules(SmallVectorImpl<Module *> &Exported) const {
242*67e74705SXin Li   // All non-explicit submodules are exported.
243*67e74705SXin Li   for (std::vector<Module *>::const_iterator I = SubModules.begin(),
244*67e74705SXin Li                                              E = SubModules.end();
245*67e74705SXin Li        I != E; ++I) {
246*67e74705SXin Li     Module *Mod = *I;
247*67e74705SXin Li     if (!Mod->IsExplicit)
248*67e74705SXin Li       Exported.push_back(Mod);
249*67e74705SXin Li   }
250*67e74705SXin Li 
251*67e74705SXin Li   // Find re-exported modules by filtering the list of imported modules.
252*67e74705SXin Li   bool AnyWildcard = false;
253*67e74705SXin Li   bool UnrestrictedWildcard = false;
254*67e74705SXin Li   SmallVector<Module *, 4> WildcardRestrictions;
255*67e74705SXin Li   for (unsigned I = 0, N = Exports.size(); I != N; ++I) {
256*67e74705SXin Li     Module *Mod = Exports[I].getPointer();
257*67e74705SXin Li     if (!Exports[I].getInt()) {
258*67e74705SXin Li       // Export a named module directly; no wildcards involved.
259*67e74705SXin Li       Exported.push_back(Mod);
260*67e74705SXin Li 
261*67e74705SXin Li       continue;
262*67e74705SXin Li     }
263*67e74705SXin Li 
264*67e74705SXin Li     // Wildcard export: export all of the imported modules that match
265*67e74705SXin Li     // the given pattern.
266*67e74705SXin Li     AnyWildcard = true;
267*67e74705SXin Li     if (UnrestrictedWildcard)
268*67e74705SXin Li       continue;
269*67e74705SXin Li 
270*67e74705SXin Li     if (Module *Restriction = Exports[I].getPointer())
271*67e74705SXin Li       WildcardRestrictions.push_back(Restriction);
272*67e74705SXin Li     else {
273*67e74705SXin Li       WildcardRestrictions.clear();
274*67e74705SXin Li       UnrestrictedWildcard = true;
275*67e74705SXin Li     }
276*67e74705SXin Li   }
277*67e74705SXin Li 
278*67e74705SXin Li   // If there were any wildcards, push any imported modules that were
279*67e74705SXin Li   // re-exported by the wildcard restriction.
280*67e74705SXin Li   if (!AnyWildcard)
281*67e74705SXin Li     return;
282*67e74705SXin Li 
283*67e74705SXin Li   for (unsigned I = 0, N = Imports.size(); I != N; ++I) {
284*67e74705SXin Li     Module *Mod = Imports[I];
285*67e74705SXin Li     bool Acceptable = UnrestrictedWildcard;
286*67e74705SXin Li     if (!Acceptable) {
287*67e74705SXin Li       // Check whether this module meets one of the restrictions.
288*67e74705SXin Li       for (unsigned R = 0, NR = WildcardRestrictions.size(); R != NR; ++R) {
289*67e74705SXin Li         Module *Restriction = WildcardRestrictions[R];
290*67e74705SXin Li         if (Mod == Restriction || Mod->isSubModuleOf(Restriction)) {
291*67e74705SXin Li           Acceptable = true;
292*67e74705SXin Li           break;
293*67e74705SXin Li         }
294*67e74705SXin Li       }
295*67e74705SXin Li     }
296*67e74705SXin Li 
297*67e74705SXin Li     if (!Acceptable)
298*67e74705SXin Li       continue;
299*67e74705SXin Li 
300*67e74705SXin Li     Exported.push_back(Mod);
301*67e74705SXin Li   }
302*67e74705SXin Li }
303*67e74705SXin Li 
buildVisibleModulesCache() const304*67e74705SXin Li void Module::buildVisibleModulesCache() const {
305*67e74705SXin Li   assert(VisibleModulesCache.empty() && "cache does not need building");
306*67e74705SXin Li 
307*67e74705SXin Li   // This module is visible to itself.
308*67e74705SXin Li   VisibleModulesCache.insert(this);
309*67e74705SXin Li 
310*67e74705SXin Li   // Every imported module is visible.
311*67e74705SXin Li   SmallVector<Module *, 16> Stack(Imports.begin(), Imports.end());
312*67e74705SXin Li   while (!Stack.empty()) {
313*67e74705SXin Li     Module *CurrModule = Stack.pop_back_val();
314*67e74705SXin Li 
315*67e74705SXin Li     // Every module transitively exported by an imported module is visible.
316*67e74705SXin Li     if (VisibleModulesCache.insert(CurrModule).second)
317*67e74705SXin Li       CurrModule->getExportedModules(Stack);
318*67e74705SXin Li   }
319*67e74705SXin Li }
320*67e74705SXin Li 
print(raw_ostream & OS,unsigned Indent) const321*67e74705SXin Li void Module::print(raw_ostream &OS, unsigned Indent) const {
322*67e74705SXin Li   OS.indent(Indent);
323*67e74705SXin Li   if (IsFramework)
324*67e74705SXin Li     OS << "framework ";
325*67e74705SXin Li   if (IsExplicit)
326*67e74705SXin Li     OS << "explicit ";
327*67e74705SXin Li   OS << "module " << Name;
328*67e74705SXin Li 
329*67e74705SXin Li   if (IsSystem || IsExternC) {
330*67e74705SXin Li     OS.indent(Indent + 2);
331*67e74705SXin Li     if (IsSystem)
332*67e74705SXin Li       OS << " [system]";
333*67e74705SXin Li     if (IsExternC)
334*67e74705SXin Li       OS << " [extern_c]";
335*67e74705SXin Li   }
336*67e74705SXin Li 
337*67e74705SXin Li   OS << " {\n";
338*67e74705SXin Li 
339*67e74705SXin Li   if (!Requirements.empty()) {
340*67e74705SXin Li     OS.indent(Indent + 2);
341*67e74705SXin Li     OS << "requires ";
342*67e74705SXin Li     for (unsigned I = 0, N = Requirements.size(); I != N; ++I) {
343*67e74705SXin Li       if (I)
344*67e74705SXin Li         OS << ", ";
345*67e74705SXin Li       if (!Requirements[I].second)
346*67e74705SXin Li         OS << "!";
347*67e74705SXin Li       OS << Requirements[I].first;
348*67e74705SXin Li     }
349*67e74705SXin Li     OS << "\n";
350*67e74705SXin Li   }
351*67e74705SXin Li 
352*67e74705SXin Li   if (Header H = getUmbrellaHeader()) {
353*67e74705SXin Li     OS.indent(Indent + 2);
354*67e74705SXin Li     OS << "umbrella header \"";
355*67e74705SXin Li     OS.write_escaped(H.NameAsWritten);
356*67e74705SXin Li     OS << "\"\n";
357*67e74705SXin Li   } else if (DirectoryName D = getUmbrellaDir()) {
358*67e74705SXin Li     OS.indent(Indent + 2);
359*67e74705SXin Li     OS << "umbrella \"";
360*67e74705SXin Li     OS.write_escaped(D.NameAsWritten);
361*67e74705SXin Li     OS << "\"\n";
362*67e74705SXin Li   }
363*67e74705SXin Li 
364*67e74705SXin Li   if (!ConfigMacros.empty() || ConfigMacrosExhaustive) {
365*67e74705SXin Li     OS.indent(Indent + 2);
366*67e74705SXin Li     OS << "config_macros ";
367*67e74705SXin Li     if (ConfigMacrosExhaustive)
368*67e74705SXin Li       OS << "[exhaustive]";
369*67e74705SXin Li     for (unsigned I = 0, N = ConfigMacros.size(); I != N; ++I) {
370*67e74705SXin Li       if (I)
371*67e74705SXin Li         OS << ", ";
372*67e74705SXin Li       OS << ConfigMacros[I];
373*67e74705SXin Li     }
374*67e74705SXin Li     OS << "\n";
375*67e74705SXin Li   }
376*67e74705SXin Li 
377*67e74705SXin Li   struct {
378*67e74705SXin Li     StringRef Prefix;
379*67e74705SXin Li     HeaderKind Kind;
380*67e74705SXin Li   } Kinds[] = {{"", HK_Normal},
381*67e74705SXin Li                {"textual ", HK_Textual},
382*67e74705SXin Li                {"private ", HK_Private},
383*67e74705SXin Li                {"private textual ", HK_PrivateTextual},
384*67e74705SXin Li                {"exclude ", HK_Excluded}};
385*67e74705SXin Li 
386*67e74705SXin Li   for (auto &K : Kinds) {
387*67e74705SXin Li     for (auto &H : Headers[K.Kind]) {
388*67e74705SXin Li       OS.indent(Indent + 2);
389*67e74705SXin Li       OS << K.Prefix << "header \"";
390*67e74705SXin Li       OS.write_escaped(H.NameAsWritten);
391*67e74705SXin Li       OS << "\"\n";
392*67e74705SXin Li     }
393*67e74705SXin Li   }
394*67e74705SXin Li 
395*67e74705SXin Li   for (submodule_const_iterator MI = submodule_begin(), MIEnd = submodule_end();
396*67e74705SXin Li        MI != MIEnd; ++MI)
397*67e74705SXin Li     // Print inferred subframework modules so that we don't need to re-infer
398*67e74705SXin Li     // them (requires expensive directory iteration + stat calls) when we build
399*67e74705SXin Li     // the module. Regular inferred submodules are OK, as we need to look at all
400*67e74705SXin Li     // those header files anyway.
401*67e74705SXin Li     if (!(*MI)->IsInferred || (*MI)->IsFramework)
402*67e74705SXin Li       (*MI)->print(OS, Indent + 2);
403*67e74705SXin Li 
404*67e74705SXin Li   for (unsigned I = 0, N = Exports.size(); I != N; ++I) {
405*67e74705SXin Li     OS.indent(Indent + 2);
406*67e74705SXin Li     OS << "export ";
407*67e74705SXin Li     if (Module *Restriction = Exports[I].getPointer()) {
408*67e74705SXin Li       OS << Restriction->getFullModuleName();
409*67e74705SXin Li       if (Exports[I].getInt())
410*67e74705SXin Li         OS << ".*";
411*67e74705SXin Li     } else {
412*67e74705SXin Li       OS << "*";
413*67e74705SXin Li     }
414*67e74705SXin Li     OS << "\n";
415*67e74705SXin Li   }
416*67e74705SXin Li 
417*67e74705SXin Li   for (unsigned I = 0, N = UnresolvedExports.size(); I != N; ++I) {
418*67e74705SXin Li     OS.indent(Indent + 2);
419*67e74705SXin Li     OS << "export ";
420*67e74705SXin Li     printModuleId(OS, UnresolvedExports[I].Id);
421*67e74705SXin Li     if (UnresolvedExports[I].Wildcard)
422*67e74705SXin Li       OS << (UnresolvedExports[I].Id.empty() ? "*" : ".*");
423*67e74705SXin Li     OS << "\n";
424*67e74705SXin Li   }
425*67e74705SXin Li 
426*67e74705SXin Li   for (unsigned I = 0, N = DirectUses.size(); I != N; ++I) {
427*67e74705SXin Li     OS.indent(Indent + 2);
428*67e74705SXin Li     OS << "use ";
429*67e74705SXin Li     OS << DirectUses[I]->getFullModuleName();
430*67e74705SXin Li     OS << "\n";
431*67e74705SXin Li   }
432*67e74705SXin Li 
433*67e74705SXin Li   for (unsigned I = 0, N = UnresolvedDirectUses.size(); I != N; ++I) {
434*67e74705SXin Li     OS.indent(Indent + 2);
435*67e74705SXin Li     OS << "use ";
436*67e74705SXin Li     printModuleId(OS, UnresolvedDirectUses[I]);
437*67e74705SXin Li     OS << "\n";
438*67e74705SXin Li   }
439*67e74705SXin Li 
440*67e74705SXin Li   for (unsigned I = 0, N = LinkLibraries.size(); I != N; ++I) {
441*67e74705SXin Li     OS.indent(Indent + 2);
442*67e74705SXin Li     OS << "link ";
443*67e74705SXin Li     if (LinkLibraries[I].IsFramework)
444*67e74705SXin Li       OS << "framework ";
445*67e74705SXin Li     OS << "\"";
446*67e74705SXin Li     OS.write_escaped(LinkLibraries[I].Library);
447*67e74705SXin Li     OS << "\"";
448*67e74705SXin Li   }
449*67e74705SXin Li 
450*67e74705SXin Li   for (unsigned I = 0, N = UnresolvedConflicts.size(); I != N; ++I) {
451*67e74705SXin Li     OS.indent(Indent + 2);
452*67e74705SXin Li     OS << "conflict ";
453*67e74705SXin Li     printModuleId(OS, UnresolvedConflicts[I].Id);
454*67e74705SXin Li     OS << ", \"";
455*67e74705SXin Li     OS.write_escaped(UnresolvedConflicts[I].Message);
456*67e74705SXin Li     OS << "\"\n";
457*67e74705SXin Li   }
458*67e74705SXin Li 
459*67e74705SXin Li   for (unsigned I = 0, N = Conflicts.size(); I != N; ++I) {
460*67e74705SXin Li     OS.indent(Indent + 2);
461*67e74705SXin Li     OS << "conflict ";
462*67e74705SXin Li     OS << Conflicts[I].Other->getFullModuleName();
463*67e74705SXin Li     OS << ", \"";
464*67e74705SXin Li     OS.write_escaped(Conflicts[I].Message);
465*67e74705SXin Li     OS << "\"\n";
466*67e74705SXin Li   }
467*67e74705SXin Li 
468*67e74705SXin Li   if (InferSubmodules) {
469*67e74705SXin Li     OS.indent(Indent + 2);
470*67e74705SXin Li     if (InferExplicitSubmodules)
471*67e74705SXin Li       OS << "explicit ";
472*67e74705SXin Li     OS << "module * {\n";
473*67e74705SXin Li     if (InferExportWildcard) {
474*67e74705SXin Li       OS.indent(Indent + 4);
475*67e74705SXin Li       OS << "export *\n";
476*67e74705SXin Li     }
477*67e74705SXin Li     OS.indent(Indent + 2);
478*67e74705SXin Li     OS << "}\n";
479*67e74705SXin Li   }
480*67e74705SXin Li 
481*67e74705SXin Li   OS.indent(Indent);
482*67e74705SXin Li   OS << "}\n";
483*67e74705SXin Li }
484*67e74705SXin Li 
dump() const485*67e74705SXin Li LLVM_DUMP_METHOD void Module::dump() const {
486*67e74705SXin Li   print(llvm::errs());
487*67e74705SXin Li }
488*67e74705SXin Li 
setVisible(Module * M,SourceLocation Loc,VisibleCallback Vis,ConflictCallback Cb)489*67e74705SXin Li void VisibleModuleSet::setVisible(Module *M, SourceLocation Loc,
490*67e74705SXin Li                                   VisibleCallback Vis, ConflictCallback Cb) {
491*67e74705SXin Li   assert(Loc.isValid() && "setVisible expects a valid import location");
492*67e74705SXin Li   if (isVisible(M))
493*67e74705SXin Li     return;
494*67e74705SXin Li 
495*67e74705SXin Li   ++Generation;
496*67e74705SXin Li 
497*67e74705SXin Li   struct Visiting {
498*67e74705SXin Li     Module *M;
499*67e74705SXin Li     Visiting *ExportedBy;
500*67e74705SXin Li   };
501*67e74705SXin Li 
502*67e74705SXin Li   std::function<void(Visiting)> VisitModule = [&](Visiting V) {
503*67e74705SXin Li     // Modules that aren't available cannot be made visible.
504*67e74705SXin Li     if (!V.M->isAvailable())
505*67e74705SXin Li       return;
506*67e74705SXin Li 
507*67e74705SXin Li     // Nothing to do for a module that's already visible.
508*67e74705SXin Li     unsigned ID = V.M->getVisibilityID();
509*67e74705SXin Li     if (ImportLocs.size() <= ID)
510*67e74705SXin Li       ImportLocs.resize(ID + 1);
511*67e74705SXin Li     else if (ImportLocs[ID].isValid())
512*67e74705SXin Li       return;
513*67e74705SXin Li 
514*67e74705SXin Li     ImportLocs[ID] = Loc;
515*67e74705SXin Li     Vis(M);
516*67e74705SXin Li 
517*67e74705SXin Li     // Make any exported modules visible.
518*67e74705SXin Li     SmallVector<Module *, 16> Exports;
519*67e74705SXin Li     V.M->getExportedModules(Exports);
520*67e74705SXin Li     for (Module *E : Exports)
521*67e74705SXin Li       VisitModule({E, &V});
522*67e74705SXin Li 
523*67e74705SXin Li     for (auto &C : V.M->Conflicts) {
524*67e74705SXin Li       if (isVisible(C.Other)) {
525*67e74705SXin Li         llvm::SmallVector<Module*, 8> Path;
526*67e74705SXin Li         for (Visiting *I = &V; I; I = I->ExportedBy)
527*67e74705SXin Li           Path.push_back(I->M);
528*67e74705SXin Li         Cb(Path, C.Other, C.Message);
529*67e74705SXin Li       }
530*67e74705SXin Li     }
531*67e74705SXin Li   };
532*67e74705SXin Li   VisitModule({M, nullptr});
533*67e74705SXin Li }
534