13a02247dSChandler Carruth //===--- Module.cpp - Describe a module -----------------------------------===// 2de3ef502SDouglas Gregor // 3de3ef502SDouglas Gregor // The LLVM Compiler Infrastructure 4de3ef502SDouglas Gregor // 5de3ef502SDouglas Gregor // This file is distributed under the University of Illinois Open Source 6de3ef502SDouglas Gregor // License. See LICENSE.TXT for details. 7de3ef502SDouglas Gregor // 8de3ef502SDouglas Gregor //===----------------------------------------------------------------------===// 9de3ef502SDouglas Gregor // 10de3ef502SDouglas Gregor // This file defines the Module class, which describes a module in the source 11de3ef502SDouglas Gregor // code. 12de3ef502SDouglas Gregor // 13de3ef502SDouglas Gregor //===----------------------------------------------------------------------===// 14a3feee2aSRichard Smith 15de3ef502SDouglas Gregor #include "clang/Basic/Module.h" 16de3ef502SDouglas Gregor #include "clang/Basic/FileManager.h" 171fb5c3a6SDouglas Gregor #include "clang/Basic/LangOptions.h" 180070c0bfSDouglas Gregor #include "clang/Basic/TargetInfo.h" 193c5305c1SArgyrios Kyrtzidis #include "llvm/ADT/ArrayRef.h" 201fb5c3a6SDouglas Gregor #include "llvm/ADT/SmallVector.h" 211fb5c3a6SDouglas Gregor #include "llvm/ADT/StringSwitch.h" 223a02247dSChandler Carruth #include "llvm/Support/ErrorHandling.h" 233a02247dSChandler Carruth #include "llvm/Support/raw_ostream.h" 24a3feee2aSRichard Smith 25de3ef502SDouglas Gregor using namespace clang; 26de3ef502SDouglas Gregor 27eb90e830SDouglas Gregor Module::Module(StringRef Name, SourceLocation DefinitionLoc, Module *Parent, 28a7e2cc68SRichard Smith bool IsFramework, bool IsExplicit, unsigned VisibilityID) 293c1a41adSRichard Smith : Name(Name), DefinitionLoc(DefinitionLoc), Parent(Parent), Directory(), 3015bcf70cSAdrian Prantl Umbrella(), Signature(0), ASTFile(nullptr), VisibilityID(VisibilityID), 318a308ec2SRichard Smith IsMissingRequirement(false), HasIncompatibleModuleFile(false), 328a308ec2SRichard Smith IsAvailable(true), IsFromModuleFile(false), IsFramework(IsFramework), 338a308ec2SRichard Smith IsExplicit(IsExplicit), IsSystem(false), IsExternC(false), 348a308ec2SRichard Smith IsInferred(false), InferSubmodules(false), InferExplicitSubmodules(false), 358a308ec2SRichard Smith InferExportWildcard(false), ConfigMacrosExhaustive(false), 368a308ec2SRichard Smith NameVisibility(Hidden) { 37eb90e830SDouglas Gregor if (Parent) { 38eb90e830SDouglas Gregor if (!Parent->isAvailable()) 39eb90e830SDouglas Gregor IsAvailable = false; 403ec6663bSDouglas Gregor if (Parent->IsSystem) 413ec6663bSDouglas Gregor IsSystem = true; 429bca298fSRichard Smith if (Parent->IsExternC) 439bca298fSRichard Smith IsExternC = true; 44993055f8SBen Langmuir IsMissingRequirement = Parent->IsMissingRequirement; 45eb90e830SDouglas Gregor 46eb90e830SDouglas Gregor Parent->SubModuleIndex[Name] = Parent->SubModules.size(); 47eb90e830SDouglas Gregor Parent->SubModules.push_back(this); 48eb90e830SDouglas Gregor } 49eb90e830SDouglas Gregor } 50eb90e830SDouglas Gregor 51de3ef502SDouglas Gregor Module::~Module() { 52eb90e830SDouglas Gregor for (submodule_iterator I = submodule_begin(), IEnd = submodule_end(); 53de3ef502SDouglas Gregor I != IEnd; ++I) { 54eb90e830SDouglas Gregor delete *I; 55de3ef502SDouglas Gregor } 56de3ef502SDouglas Gregor } 57de3ef502SDouglas Gregor 581fb5c3a6SDouglas Gregor /// \brief Determine whether a translation unit built using the current 591fb5c3a6SDouglas Gregor /// language options has the given feature. 6089929282SDouglas Gregor static bool hasFeature(StringRef Feature, const LangOptions &LangOpts, 6189929282SDouglas Gregor const TargetInfo &Target) { 62532d2104SBen Langmuir bool HasFeature = llvm::StringSwitch<bool>(Feature) 630070c0bfSDouglas Gregor .Case("altivec", LangOpts.AltiVec) 641fb5c3a6SDouglas Gregor .Case("blocks", LangOpts.Blocks) 651fb5c3a6SDouglas Gregor .Case("cplusplus", LangOpts.CPlusPlus) 662bf7fdb7SRichard Smith .Case("cplusplus11", LangOpts.CPlusPlus11) 67*6736e199SBruno Cardoso Lopes .Case("gnuinlineasm", LangOpts.GNUAsm) 681fb5c3a6SDouglas Gregor .Case("objc", LangOpts.ObjC1) 691fb5c3a6SDouglas Gregor .Case("objc_arc", LangOpts.ObjCAutoRefCount) 700070c0bfSDouglas Gregor .Case("opencl", LangOpts.OpenCL) 710070c0bfSDouglas Gregor .Case("tls", Target.isTLSSupported()) 723c5038a5SUlrich Weigand .Case("zvector", LangOpts.ZVector) 730070c0bfSDouglas Gregor .Default(Target.hasFeature(Feature)); 74532d2104SBen Langmuir if (!HasFeature) 75532d2104SBen Langmuir HasFeature = std::find(LangOpts.ModuleFeatures.begin(), 76532d2104SBen Langmuir LangOpts.ModuleFeatures.end(), 77532d2104SBen Langmuir Feature) != LangOpts.ModuleFeatures.end(); 78532d2104SBen Langmuir return HasFeature; 791fb5c3a6SDouglas Gregor } 801fb5c3a6SDouglas Gregor 813c1a41adSRichard Smith bool Module::isAvailable(const LangOptions &LangOpts, const TargetInfo &Target, 823c1a41adSRichard Smith Requirement &Req, 833c1a41adSRichard Smith UnresolvedHeaderDirective &MissingHeader) const { 841fb5c3a6SDouglas Gregor if (IsAvailable) 851fb5c3a6SDouglas Gregor return true; 861fb5c3a6SDouglas Gregor 871fb5c3a6SDouglas Gregor for (const Module *Current = this; Current; Current = Current->Parent) { 88a3feee2aSRichard Smith for (unsigned I = 0, N = Current->Requirements.size(); I != N; ++I) { 89a3feee2aSRichard Smith if (hasFeature(Current->Requirements[I].first, LangOpts, Target) != 90a3feee2aSRichard Smith Current->Requirements[I].second) { 91a3feee2aSRichard Smith Req = Current->Requirements[I]; 921fb5c3a6SDouglas Gregor return false; 931fb5c3a6SDouglas Gregor } 941fb5c3a6SDouglas Gregor } 9575a7e435SBen Langmuir if (!Current->MissingHeaders.empty()) { 9675a7e435SBen Langmuir MissingHeader = Current->MissingHeaders.front(); 9775a7e435SBen Langmuir return false; 9875a7e435SBen Langmuir } 991fb5c3a6SDouglas Gregor } 1001fb5c3a6SDouglas Gregor 1011fb5c3a6SDouglas Gregor llvm_unreachable("could not find a reason why module is unavailable"); 1021fb5c3a6SDouglas Gregor } 1031fb5c3a6SDouglas Gregor 10462bcd925SDmitri Gribenko bool Module::isSubModuleOf(const Module *Other) const { 105f5eedd05SDouglas Gregor const Module *This = this; 106f5eedd05SDouglas Gregor do { 107f5eedd05SDouglas Gregor if (This == Other) 108f5eedd05SDouglas Gregor return true; 109f5eedd05SDouglas Gregor 110f5eedd05SDouglas Gregor This = This->Parent; 111f5eedd05SDouglas Gregor } while (This); 112f5eedd05SDouglas Gregor 113f5eedd05SDouglas Gregor return false; 114f5eedd05SDouglas Gregor } 115f5eedd05SDouglas Gregor 11673441091SDouglas Gregor const Module *Module::getTopLevelModule() const { 11773441091SDouglas Gregor const Module *Result = this; 11873441091SDouglas Gregor while (Result->Parent) 11973441091SDouglas Gregor Result = Result->Parent; 12073441091SDouglas Gregor 12173441091SDouglas Gregor return Result; 12273441091SDouglas Gregor } 12373441091SDouglas Gregor 124de3ef502SDouglas Gregor std::string Module::getFullModuleName() const { 125f857950dSDmitri Gribenko SmallVector<StringRef, 2> Names; 126de3ef502SDouglas Gregor 127de3ef502SDouglas Gregor // Build up the set of module names (from innermost to outermost). 128de3ef502SDouglas Gregor for (const Module *M = this; M; M = M->Parent) 129de3ef502SDouglas Gregor Names.push_back(M->Name); 130de3ef502SDouglas Gregor 131de3ef502SDouglas Gregor std::string Result; 13261ac906bSCraig Topper for (SmallVectorImpl<StringRef>::reverse_iterator I = Names.rbegin(), 133de3ef502SDouglas Gregor IEnd = Names.rend(); 134de3ef502SDouglas Gregor I != IEnd; ++I) { 135de3ef502SDouglas Gregor if (!Result.empty()) 136de3ef502SDouglas Gregor Result += '.'; 137de3ef502SDouglas Gregor 138de3ef502SDouglas Gregor Result += *I; 139de3ef502SDouglas Gregor } 140de3ef502SDouglas Gregor 141de3ef502SDouglas Gregor return Result; 142de3ef502SDouglas Gregor } 143de3ef502SDouglas Gregor 1447ff29148SBen Langmuir bool Module::fullModuleNameIs(ArrayRef<StringRef> nameParts) const { 1457ff29148SBen Langmuir for (const Module *M = this; M; M = M->Parent) { 1467ff29148SBen Langmuir if (nameParts.empty() || M->Name != nameParts.back()) 1477ff29148SBen Langmuir return false; 1487ff29148SBen Langmuir nameParts = nameParts.drop_back(); 1497ff29148SBen Langmuir } 1507ff29148SBen Langmuir return nameParts.empty(); 1517ff29148SBen Langmuir } 1527ff29148SBen Langmuir 1532b63d15fSRichard Smith Module::DirectoryName Module::getUmbrellaDir() const { 1542b63d15fSRichard Smith if (Header U = getUmbrellaHeader()) 1552b63d15fSRichard Smith return {"", U.Entry->getDir()}; 15673141fa9SDouglas Gregor 1572b63d15fSRichard Smith return {UmbrellaAsWritten, Umbrella.dyn_cast<const DirectoryEntry *>()}; 15873141fa9SDouglas Gregor } 15973141fa9SDouglas Gregor 1603c5305c1SArgyrios Kyrtzidis ArrayRef<const FileEntry *> Module::getTopHeaders(FileManager &FileMgr) { 1613c5305c1SArgyrios Kyrtzidis if (!TopHeaderNames.empty()) { 1623c5305c1SArgyrios Kyrtzidis for (std::vector<std::string>::iterator 1633c5305c1SArgyrios Kyrtzidis I = TopHeaderNames.begin(), E = TopHeaderNames.end(); I != E; ++I) { 1643c5305c1SArgyrios Kyrtzidis if (const FileEntry *FE = FileMgr.getFile(*I)) 1653c5305c1SArgyrios Kyrtzidis TopHeaders.insert(FE); 1663c5305c1SArgyrios Kyrtzidis } 1673c5305c1SArgyrios Kyrtzidis TopHeaderNames.clear(); 1683c5305c1SArgyrios Kyrtzidis } 1693c5305c1SArgyrios Kyrtzidis 1703c5305c1SArgyrios Kyrtzidis return llvm::makeArrayRef(TopHeaders.begin(), TopHeaders.end()); 1713c5305c1SArgyrios Kyrtzidis } 1723c5305c1SArgyrios Kyrtzidis 1738f4d3ff1SRichard Smith bool Module::directlyUses(const Module *Requested) const { 1748f4d3ff1SRichard Smith auto *Top = getTopLevelModule(); 1758f4d3ff1SRichard Smith 1768f4d3ff1SRichard Smith // A top-level module implicitly uses itself. 1778f4d3ff1SRichard Smith if (Requested->isSubModuleOf(Top)) 1788f4d3ff1SRichard Smith return true; 1798f4d3ff1SRichard Smith 1808f4d3ff1SRichard Smith for (auto *Use : Top->DirectUses) 1818f4d3ff1SRichard Smith if (Requested->isSubModuleOf(Use)) 1828f4d3ff1SRichard Smith return true; 1838f4d3ff1SRichard Smith return false; 1848f4d3ff1SRichard Smith } 1858f4d3ff1SRichard Smith 186a3feee2aSRichard Smith void Module::addRequirement(StringRef Feature, bool RequiredState, 187a3feee2aSRichard Smith const LangOptions &LangOpts, 18889929282SDouglas Gregor const TargetInfo &Target) { 189a3feee2aSRichard Smith Requirements.push_back(Requirement(Feature, RequiredState)); 1901fb5c3a6SDouglas Gregor 1911fb5c3a6SDouglas Gregor // If this feature is currently available, we're done. 192a3feee2aSRichard Smith if (hasFeature(Feature, LangOpts, Target) == RequiredState) 1931fb5c3a6SDouglas Gregor return; 1941fb5c3a6SDouglas Gregor 195993055f8SBen Langmuir markUnavailable(/*MissingRequirement*/true); 196ec8c9752SBen Langmuir } 197ec8c9752SBen Langmuir 198993055f8SBen Langmuir void Module::markUnavailable(bool MissingRequirement) { 19975a7e435SBen Langmuir auto needUpdate = [MissingRequirement](Module *M) { 20075a7e435SBen Langmuir return M->IsAvailable || (!M->IsMissingRequirement && MissingRequirement); 20175a7e435SBen Langmuir }; 20275a7e435SBen Langmuir 20375a7e435SBen Langmuir if (!needUpdate(this)) 2041fb5c3a6SDouglas Gregor return; 2051fb5c3a6SDouglas Gregor 206f857950dSDmitri Gribenko SmallVector<Module *, 2> Stack; 2071fb5c3a6SDouglas Gregor Stack.push_back(this); 2081fb5c3a6SDouglas Gregor while (!Stack.empty()) { 2091fb5c3a6SDouglas Gregor Module *Current = Stack.back(); 2101fb5c3a6SDouglas Gregor Stack.pop_back(); 2111fb5c3a6SDouglas Gregor 21275a7e435SBen Langmuir if (!needUpdate(Current)) 2131fb5c3a6SDouglas Gregor continue; 2141fb5c3a6SDouglas Gregor 2151fb5c3a6SDouglas Gregor Current->IsAvailable = false; 216993055f8SBen Langmuir Current->IsMissingRequirement |= MissingRequirement; 217eb90e830SDouglas Gregor for (submodule_iterator Sub = Current->submodule_begin(), 218eb90e830SDouglas Gregor SubEnd = Current->submodule_end(); 2191fb5c3a6SDouglas Gregor Sub != SubEnd; ++Sub) { 22075a7e435SBen Langmuir if (needUpdate(*Sub)) 221eb90e830SDouglas Gregor Stack.push_back(*Sub); 2221fb5c3a6SDouglas Gregor } 2231fb5c3a6SDouglas Gregor } 2241fb5c3a6SDouglas Gregor } 2251fb5c3a6SDouglas Gregor 226eb90e830SDouglas Gregor Module *Module::findSubmodule(StringRef Name) const { 227eb90e830SDouglas Gregor llvm::StringMap<unsigned>::const_iterator Pos = SubModuleIndex.find(Name); 228eb90e830SDouglas Gregor if (Pos == SubModuleIndex.end()) 229f1186c5aSCraig Topper return nullptr; 230eb90e830SDouglas Gregor 231eb90e830SDouglas Gregor return SubModules[Pos->getValue()]; 232eb90e830SDouglas Gregor } 233eb90e830SDouglas Gregor 234f857950dSDmitri Gribenko static void printModuleId(raw_ostream &OS, const ModuleId &Id) { 23524bb923aSDouglas Gregor for (unsigned I = 0, N = Id.size(); I != N; ++I) { 23624bb923aSDouglas Gregor if (I) 23724bb923aSDouglas Gregor OS << "."; 23824bb923aSDouglas Gregor OS << Id[I].first; 23924bb923aSDouglas Gregor } 24024bb923aSDouglas Gregor } 24124bb923aSDouglas Gregor 2428739f7b7SArgyrios Kyrtzidis void Module::getExportedModules(SmallVectorImpl<Module *> &Exported) const { 243e9bcf5b7SDmitri Gribenko // All non-explicit submodules are exported. 244e9bcf5b7SDmitri Gribenko for (std::vector<Module *>::const_iterator I = SubModules.begin(), 245e9bcf5b7SDmitri Gribenko E = SubModules.end(); 246e9bcf5b7SDmitri Gribenko I != E; ++I) { 247e9bcf5b7SDmitri Gribenko Module *Mod = *I; 248e9bcf5b7SDmitri Gribenko if (!Mod->IsExplicit) 249e9bcf5b7SDmitri Gribenko Exported.push_back(Mod); 250e9bcf5b7SDmitri Gribenko } 251e9bcf5b7SDmitri Gribenko 252e9bcf5b7SDmitri Gribenko // Find re-exported modules by filtering the list of imported modules. 2538739f7b7SArgyrios Kyrtzidis bool AnyWildcard = false; 2548739f7b7SArgyrios Kyrtzidis bool UnrestrictedWildcard = false; 2558739f7b7SArgyrios Kyrtzidis SmallVector<Module *, 4> WildcardRestrictions; 2568739f7b7SArgyrios Kyrtzidis for (unsigned I = 0, N = Exports.size(); I != N; ++I) { 2578739f7b7SArgyrios Kyrtzidis Module *Mod = Exports[I].getPointer(); 2588739f7b7SArgyrios Kyrtzidis if (!Exports[I].getInt()) { 2598739f7b7SArgyrios Kyrtzidis // Export a named module directly; no wildcards involved. 2608739f7b7SArgyrios Kyrtzidis Exported.push_back(Mod); 2618739f7b7SArgyrios Kyrtzidis 2628739f7b7SArgyrios Kyrtzidis continue; 2638739f7b7SArgyrios Kyrtzidis } 2648739f7b7SArgyrios Kyrtzidis 2658739f7b7SArgyrios Kyrtzidis // Wildcard export: export all of the imported modules that match 2668739f7b7SArgyrios Kyrtzidis // the given pattern. 2678739f7b7SArgyrios Kyrtzidis AnyWildcard = true; 2688739f7b7SArgyrios Kyrtzidis if (UnrestrictedWildcard) 2698739f7b7SArgyrios Kyrtzidis continue; 2708739f7b7SArgyrios Kyrtzidis 2718739f7b7SArgyrios Kyrtzidis if (Module *Restriction = Exports[I].getPointer()) 2728739f7b7SArgyrios Kyrtzidis WildcardRestrictions.push_back(Restriction); 2738739f7b7SArgyrios Kyrtzidis else { 2748739f7b7SArgyrios Kyrtzidis WildcardRestrictions.clear(); 2758739f7b7SArgyrios Kyrtzidis UnrestrictedWildcard = true; 2768739f7b7SArgyrios Kyrtzidis } 2778739f7b7SArgyrios Kyrtzidis } 2788739f7b7SArgyrios Kyrtzidis 2798739f7b7SArgyrios Kyrtzidis // If there were any wildcards, push any imported modules that were 2808739f7b7SArgyrios Kyrtzidis // re-exported by the wildcard restriction. 2818739f7b7SArgyrios Kyrtzidis if (!AnyWildcard) 2828739f7b7SArgyrios Kyrtzidis return; 2838739f7b7SArgyrios Kyrtzidis 2848739f7b7SArgyrios Kyrtzidis for (unsigned I = 0, N = Imports.size(); I != N; ++I) { 2858739f7b7SArgyrios Kyrtzidis Module *Mod = Imports[I]; 2868739f7b7SArgyrios Kyrtzidis bool Acceptable = UnrestrictedWildcard; 2878739f7b7SArgyrios Kyrtzidis if (!Acceptable) { 2888739f7b7SArgyrios Kyrtzidis // Check whether this module meets one of the restrictions. 2898739f7b7SArgyrios Kyrtzidis for (unsigned R = 0, NR = WildcardRestrictions.size(); R != NR; ++R) { 2908739f7b7SArgyrios Kyrtzidis Module *Restriction = WildcardRestrictions[R]; 2918739f7b7SArgyrios Kyrtzidis if (Mod == Restriction || Mod->isSubModuleOf(Restriction)) { 2928739f7b7SArgyrios Kyrtzidis Acceptable = true; 2938739f7b7SArgyrios Kyrtzidis break; 2948739f7b7SArgyrios Kyrtzidis } 2958739f7b7SArgyrios Kyrtzidis } 2968739f7b7SArgyrios Kyrtzidis } 2978739f7b7SArgyrios Kyrtzidis 2988739f7b7SArgyrios Kyrtzidis if (!Acceptable) 2998739f7b7SArgyrios Kyrtzidis continue; 3008739f7b7SArgyrios Kyrtzidis 3018739f7b7SArgyrios Kyrtzidis Exported.push_back(Mod); 3028739f7b7SArgyrios Kyrtzidis } 3038739f7b7SArgyrios Kyrtzidis } 3048739f7b7SArgyrios Kyrtzidis 3050e5d7b8cSRichard Smith void Module::buildVisibleModulesCache() const { 3060e5d7b8cSRichard Smith assert(VisibleModulesCache.empty() && "cache does not need building"); 3070e5d7b8cSRichard Smith 3080e5d7b8cSRichard Smith // This module is visible to itself. 3090e5d7b8cSRichard Smith VisibleModulesCache.insert(this); 3100e5d7b8cSRichard Smith 3110e5d7b8cSRichard Smith // Every imported module is visible. 312dde17e74SRichard Smith SmallVector<Module *, 16> Stack(Imports.begin(), Imports.end()); 313dc360d57SDmitri Gribenko while (!Stack.empty()) { 314dc360d57SDmitri Gribenko Module *CurrModule = Stack.pop_back_val(); 315dc360d57SDmitri Gribenko 316dde17e74SRichard Smith // Every module transitively exported by an imported module is visible. 317dde17e74SRichard Smith if (VisibleModulesCache.insert(CurrModule).second) 318dde17e74SRichard Smith CurrModule->getExportedModules(Stack); 3190e5d7b8cSRichard Smith } 3200e5d7b8cSRichard Smith } 3210e5d7b8cSRichard Smith 322f857950dSDmitri Gribenko void Module::print(raw_ostream &OS, unsigned Indent) const { 323de3ef502SDouglas Gregor OS.indent(Indent); 324de3ef502SDouglas Gregor if (IsFramework) 325de3ef502SDouglas Gregor OS << "framework "; 326de3ef502SDouglas Gregor if (IsExplicit) 327de3ef502SDouglas Gregor OS << "explicit "; 328a686e1b0SDouglas Gregor OS << "module " << Name; 329a686e1b0SDouglas Gregor 3307615f00eSBen Langmuir if (IsSystem || IsExternC) { 331a686e1b0SDouglas Gregor OS.indent(Indent + 2); 3327615f00eSBen Langmuir if (IsSystem) 333a686e1b0SDouglas Gregor OS << " [system]"; 3347615f00eSBen Langmuir if (IsExternC) 3357615f00eSBen Langmuir OS << " [extern_c]"; 336a686e1b0SDouglas Gregor } 337a686e1b0SDouglas Gregor 338a686e1b0SDouglas Gregor OS << " {\n"; 339de3ef502SDouglas Gregor 340a3feee2aSRichard Smith if (!Requirements.empty()) { 3411fb5c3a6SDouglas Gregor OS.indent(Indent + 2); 3421fb5c3a6SDouglas Gregor OS << "requires "; 343a3feee2aSRichard Smith for (unsigned I = 0, N = Requirements.size(); I != N; ++I) { 3441fb5c3a6SDouglas Gregor if (I) 3451fb5c3a6SDouglas Gregor OS << ", "; 346a3feee2aSRichard Smith if (!Requirements[I].second) 347a3feee2aSRichard Smith OS << "!"; 348a3feee2aSRichard Smith OS << Requirements[I].first; 3491fb5c3a6SDouglas Gregor } 3501fb5c3a6SDouglas Gregor OS << "\n"; 3511fb5c3a6SDouglas Gregor } 3521fb5c3a6SDouglas Gregor 3532b63d15fSRichard Smith if (Header H = getUmbrellaHeader()) { 354de3ef502SDouglas Gregor OS.indent(Indent + 2); 355322f633cSDouglas Gregor OS << "umbrella header \""; 3562b63d15fSRichard Smith OS.write_escaped(H.NameAsWritten); 357de3ef502SDouglas Gregor OS << "\"\n"; 3582b63d15fSRichard Smith } else if (DirectoryName D = getUmbrellaDir()) { 359322f633cSDouglas Gregor OS.indent(Indent + 2); 360322f633cSDouglas Gregor OS << "umbrella \""; 3612b63d15fSRichard Smith OS.write_escaped(D.NameAsWritten); 362322f633cSDouglas Gregor OS << "\"\n"; 363de3ef502SDouglas Gregor } 364de3ef502SDouglas Gregor 36535b13eceSDouglas Gregor if (!ConfigMacros.empty() || ConfigMacrosExhaustive) { 36635b13eceSDouglas Gregor OS.indent(Indent + 2); 36735b13eceSDouglas Gregor OS << "config_macros "; 36835b13eceSDouglas Gregor if (ConfigMacrosExhaustive) 3698d932427SDouglas Gregor OS << "[exhaustive]"; 37035b13eceSDouglas Gregor for (unsigned I = 0, N = ConfigMacros.size(); I != N; ++I) { 37135b13eceSDouglas Gregor if (I) 37235b13eceSDouglas Gregor OS << ", "; 37335b13eceSDouglas Gregor OS << ConfigMacros[I]; 37435b13eceSDouglas Gregor } 3758d932427SDouglas Gregor OS << "\n"; 37635b13eceSDouglas Gregor } 37735b13eceSDouglas Gregor 3783c1a41adSRichard Smith struct { 379306d8920SRichard Smith StringRef Prefix; 3803c1a41adSRichard Smith HeaderKind Kind; 3813c1a41adSRichard Smith } Kinds[] = {{"", HK_Normal}, 3823c1a41adSRichard Smith {"textual ", HK_Textual}, 3833c1a41adSRichard Smith {"private ", HK_Private}, 3843c1a41adSRichard Smith {"private textual ", HK_PrivateTextual}, 3853c1a41adSRichard Smith {"exclude ", HK_Excluded}}; 386306d8920SRichard Smith 387306d8920SRichard Smith for (auto &K : Kinds) { 3883c1a41adSRichard Smith for (auto &H : Headers[K.Kind]) { 389de3ef502SDouglas Gregor OS.indent(Indent + 2); 390306d8920SRichard Smith OS << K.Prefix << "header \""; 3913c1a41adSRichard Smith OS.write_escaped(H.NameAsWritten); 392de3ef502SDouglas Gregor OS << "\"\n"; 393de3ef502SDouglas Gregor } 394b53e5483SLawrence Crowl } 395b53e5483SLawrence Crowl 396eb90e830SDouglas Gregor for (submodule_const_iterator MI = submodule_begin(), MIEnd = submodule_end(); 397de3ef502SDouglas Gregor MI != MIEnd; ++MI) 3989d6448b1SBen Langmuir // Print inferred subframework modules so that we don't need to re-infer 3999d6448b1SBen Langmuir // them (requires expensive directory iteration + stat calls) when we build 4009d6448b1SBen Langmuir // the module. Regular inferred submodules are OK, as we need to look at all 4019d6448b1SBen Langmuir // those header files anyway. 4029d6448b1SBen Langmuir if (!(*MI)->IsInferred || (*MI)->IsFramework) 403eb90e830SDouglas Gregor (*MI)->print(OS, Indent + 2); 404de3ef502SDouglas Gregor 40524bb923aSDouglas Gregor for (unsigned I = 0, N = Exports.size(); I != N; ++I) { 40624bb923aSDouglas Gregor OS.indent(Indent + 2); 4078c7c8352SDouglas Gregor OS << "export "; 4088c7c8352SDouglas Gregor if (Module *Restriction = Exports[I].getPointer()) { 4098c7c8352SDouglas Gregor OS << Restriction->getFullModuleName(); 41024bb923aSDouglas Gregor if (Exports[I].getInt()) 41124bb923aSDouglas Gregor OS << ".*"; 4128c7c8352SDouglas Gregor } else { 4138c7c8352SDouglas Gregor OS << "*"; 4148c7c8352SDouglas Gregor } 41524bb923aSDouglas Gregor OS << "\n"; 41624bb923aSDouglas Gregor } 41724bb923aSDouglas Gregor 41824bb923aSDouglas Gregor for (unsigned I = 0, N = UnresolvedExports.size(); I != N; ++I) { 41924bb923aSDouglas Gregor OS.indent(Indent + 2); 42024bb923aSDouglas Gregor OS << "export "; 42124bb923aSDouglas Gregor printModuleId(OS, UnresolvedExports[I].Id); 4227f96b391SDavide Italiano if (UnresolvedExports[I].Wildcard) 4237f96b391SDavide Italiano OS << (UnresolvedExports[I].Id.empty() ? "*" : ".*"); 42424bb923aSDouglas Gregor OS << "\n"; 42524bb923aSDouglas Gregor } 42624bb923aSDouglas Gregor 427ba7f2f71SDaniel Jasper for (unsigned I = 0, N = DirectUses.size(); I != N; ++I) { 428ba7f2f71SDaniel Jasper OS.indent(Indent + 2); 429ba7f2f71SDaniel Jasper OS << "use "; 430ba7f2f71SDaniel Jasper OS << DirectUses[I]->getFullModuleName(); 431ba7f2f71SDaniel Jasper OS << "\n"; 432ba7f2f71SDaniel Jasper } 433ba7f2f71SDaniel Jasper 434ba7f2f71SDaniel Jasper for (unsigned I = 0, N = UnresolvedDirectUses.size(); I != N; ++I) { 435ba7f2f71SDaniel Jasper OS.indent(Indent + 2); 436ba7f2f71SDaniel Jasper OS << "use "; 437ba7f2f71SDaniel Jasper printModuleId(OS, UnresolvedDirectUses[I]); 438ba7f2f71SDaniel Jasper OS << "\n"; 439ba7f2f71SDaniel Jasper } 440ba7f2f71SDaniel Jasper 4416ddfca91SDouglas Gregor for (unsigned I = 0, N = LinkLibraries.size(); I != N; ++I) { 4426ddfca91SDouglas Gregor OS.indent(Indent + 2); 4436ddfca91SDouglas Gregor OS << "link "; 4446ddfca91SDouglas Gregor if (LinkLibraries[I].IsFramework) 4456ddfca91SDouglas Gregor OS << "framework "; 4466ddfca91SDouglas Gregor OS << "\""; 4476ddfca91SDouglas Gregor OS.write_escaped(LinkLibraries[I].Library); 4486ddfca91SDouglas Gregor OS << "\""; 4496ddfca91SDouglas Gregor } 4506ddfca91SDouglas Gregor 451fb912657SDouglas Gregor for (unsigned I = 0, N = UnresolvedConflicts.size(); I != N; ++I) { 452fb912657SDouglas Gregor OS.indent(Indent + 2); 453fb912657SDouglas Gregor OS << "conflict "; 454fb912657SDouglas Gregor printModuleId(OS, UnresolvedConflicts[I].Id); 455fb912657SDouglas Gregor OS << ", \""; 456fb912657SDouglas Gregor OS.write_escaped(UnresolvedConflicts[I].Message); 457fb912657SDouglas Gregor OS << "\"\n"; 458fb912657SDouglas Gregor } 459fb912657SDouglas Gregor 460fb912657SDouglas Gregor for (unsigned I = 0, N = Conflicts.size(); I != N; ++I) { 461fb912657SDouglas Gregor OS.indent(Indent + 2); 462fb912657SDouglas Gregor OS << "conflict "; 463fb912657SDouglas Gregor OS << Conflicts[I].Other->getFullModuleName(); 464fb912657SDouglas Gregor OS << ", \""; 465fb912657SDouglas Gregor OS.write_escaped(Conflicts[I].Message); 466fb912657SDouglas Gregor OS << "\"\n"; 467fb912657SDouglas Gregor } 468fb912657SDouglas Gregor 46973441091SDouglas Gregor if (InferSubmodules) { 47073441091SDouglas Gregor OS.indent(Indent + 2); 47173441091SDouglas Gregor if (InferExplicitSubmodules) 47273441091SDouglas Gregor OS << "explicit "; 47373441091SDouglas Gregor OS << "module * {\n"; 47473441091SDouglas Gregor if (InferExportWildcard) { 47573441091SDouglas Gregor OS.indent(Indent + 4); 47673441091SDouglas Gregor OS << "export *\n"; 47773441091SDouglas Gregor } 47873441091SDouglas Gregor OS.indent(Indent + 2); 47973441091SDouglas Gregor OS << "}\n"; 48073441091SDouglas Gregor } 48173441091SDouglas Gregor 482de3ef502SDouglas Gregor OS.indent(Indent); 483de3ef502SDouglas Gregor OS << "}\n"; 484de3ef502SDouglas Gregor } 485de3ef502SDouglas Gregor 486cdae941eSYaron Keren LLVM_DUMP_METHOD void Module::dump() const { 487de3ef502SDouglas Gregor print(llvm::errs()); 488de3ef502SDouglas Gregor } 489de3ef502SDouglas Gregor 490a7e2cc68SRichard Smith void VisibleModuleSet::setVisible(Module *M, SourceLocation Loc, 491a7e2cc68SRichard Smith VisibleCallback Vis, ConflictCallback Cb) { 4926d25fdc4SBen Langmuir assert(Loc.isValid() && "setVisible expects a valid import location"); 493a7e2cc68SRichard Smith if (isVisible(M)) 494a7e2cc68SRichard Smith return; 495de3ef502SDouglas Gregor 496a7e2cc68SRichard Smith ++Generation; 497a7e2cc68SRichard Smith 498a7e2cc68SRichard Smith struct Visiting { 499a7e2cc68SRichard Smith Module *M; 500a7e2cc68SRichard Smith Visiting *ExportedBy; 501a7e2cc68SRichard Smith }; 502a7e2cc68SRichard Smith 503a7e2cc68SRichard Smith std::function<void(Visiting)> VisitModule = [&](Visiting V) { 504a7e2cc68SRichard Smith // Modules that aren't available cannot be made visible. 505a7e2cc68SRichard Smith if (!V.M->isAvailable()) 506a7e2cc68SRichard Smith return; 507a7e2cc68SRichard Smith 508a7e2cc68SRichard Smith // Nothing to do for a module that's already visible. 509a7e2cc68SRichard Smith unsigned ID = V.M->getVisibilityID(); 510a7e2cc68SRichard Smith if (ImportLocs.size() <= ID) 511a7e2cc68SRichard Smith ImportLocs.resize(ID + 1); 512a7e2cc68SRichard Smith else if (ImportLocs[ID].isValid()) 513a7e2cc68SRichard Smith return; 514a7e2cc68SRichard Smith 515a7e2cc68SRichard Smith ImportLocs[ID] = Loc; 516a7e2cc68SRichard Smith Vis(M); 517a7e2cc68SRichard Smith 518a7e2cc68SRichard Smith // Make any exported modules visible. 519a7e2cc68SRichard Smith SmallVector<Module *, 16> Exports; 520a7e2cc68SRichard Smith V.M->getExportedModules(Exports); 521a7e2cc68SRichard Smith for (Module *E : Exports) 522a7e2cc68SRichard Smith VisitModule({E, &V}); 523a7e2cc68SRichard Smith 524a7e2cc68SRichard Smith for (auto &C : V.M->Conflicts) { 525a7e2cc68SRichard Smith if (isVisible(C.Other)) { 526a7e2cc68SRichard Smith llvm::SmallVector<Module*, 8> Path; 527a7e2cc68SRichard Smith for (Visiting *I = &V; I; I = I->ExportedBy) 528a7e2cc68SRichard Smith Path.push_back(I->M); 529a7e2cc68SRichard Smith Cb(Path, C.Other, C.Message); 530a7e2cc68SRichard Smith } 531a7e2cc68SRichard Smith } 532a7e2cc68SRichard Smith }; 533a7e2cc68SRichard Smith VisitModule({M, nullptr}); 534a7e2cc68SRichard Smith } 535