Lines Matching full:module

10 // of a module as it relates to headers.
20 #include "clang/Basic/Module.h"
58 void ModuleMap::resolveLinkAsDependencies(Module *Mod) { in resolveLinkAsDependencies()
69 void ModuleMap::addLinkAsDependency(Module *Mod) { in addLinkAsDependency()
76 Module::HeaderKind ModuleMap::headerRoleToKind(ModuleHeaderRole Role) { in headerRoleToKind()
79 return Module::HK_Normal; in headerRoleToKind()
81 return Module::HK_Private; in headerRoleToKind()
83 return Module::HK_Textual; in headerRoleToKind()
85 return Module::HK_PrivateTextual; in headerRoleToKind()
87 return Module::HK_Excluded; in headerRoleToKind()
93 ModuleMap::headerKindToRole(Module::HeaderKind Kind) { in headerKindToRole()
95 case Module::HK_Normal: in headerKindToRole()
97 case Module::HK_Private: in headerKindToRole()
99 case Module::HK_Textual: in headerKindToRole()
101 case Module::HK_PrivateTextual: in headerKindToRole()
103 case Module::HK_Excluded: in headerKindToRole()
113 Module::ExportDecl
114 ModuleMap::resolveExport(Module *Mod, in resolveExport()
115 const Module::UnresolvedExportDecl &Unresolved, in resolveExport()
120 return Module::ExportDecl(nullptr, true); in resolveExport()
123 // Resolve the module-id. in resolveExport()
124 Module *Context = resolveModuleId(Unresolved.Id, Mod, Complain); in resolveExport()
128 return Module::ExportDecl(Context, Unresolved.Wildcard); in resolveExport()
131 Module *ModuleMap::resolveModuleId(const ModuleId &Id, Module *Mod, in resolveModuleId()
133 // Find the starting module. in resolveModuleId()
134 Module *Context = lookupModuleUnqualified(Id[0].first, Mod); in resolveModuleId()
143 // Dig into the module path. in resolveModuleId()
145 Module *Sub = lookupModuleQualified(Id[I].first, Context); in resolveModuleId()
162 /// subframework in which the given module lives.
163 static void appendSubframeworkPaths(Module *Mod, in appendSubframeworkPaths()
165 // Collect the framework names from the given module to the top-level module. in appendSubframeworkPaths()
181 Module *M, const Module::UnresolvedHeaderDirective &Header, in findHeader()
183 // Search for the header file within the module's home directory. in findHeader()
209 // be defined as 'module FrameworkName.Private', and not as in findHeader()
210 // 'framework module FrameworkName.Private', since a 'Private.Framework' in findHeader()
239 // The lack of 'framework' keyword in a module declaration it's a simple in findHeader()
275 /// Determine whether the given module name is the name of a builtin
276 /// module that is cyclic with a system module on some platforms.
295 void ModuleMap::resolveHeader(Module *Mod, in resolveHeader()
296 const Module::UnresolvedHeaderDirective &Header, in resolveHeader()
303 if (Module *UmbrellaMod = UmbrellaDirs[UmbrellaDir]) in resolveHeader()
311 Module::Header H = {Header.FileName, std::string(RelativePathName), in resolveHeader()
318 } else if (Header.Kind == Module::HK_Excluded) { in resolveHeader()
321 // If we find a module that has a missing header, we mark this module as in resolveHeader()
324 // A missing header with stat information doesn't make the module in resolveHeader()
326 // resolved. (Such a module still can't be built though, except from in resolveHeader()
334 Module *Mod, const Module::UnresolvedHeaderDirective &Header) { in resolveAsBuiltinHeader()
335 if (Header.Kind == Module::HK_Excluded || in resolveAsBuiltinHeader()
342 // This is a system module with a top-level header. This header in resolveAsBuiltinHeader()
351 Module::Header H = {Header.FileName, Header.FileName, *File}; in resolveAsBuiltinHeader()
421 Module *Module) const { in shouldImportRelativeToBuiltinIncludeDir()
423 Module->IsSystem && !Module->isPartOfFramework() && in shouldImportRelativeToBuiltinIncludeDir()
471 static bool violatesPrivateInclude(Module *RequestingModule, in violatesPrivateInclude()
476 // Check for consistency between the module header role in violatesPrivateInclude()
477 // as obtained from the lookup and as obtained from the module. in violatesPrivateInclude()
480 SmallVectorImpl<Module::Header> *HeaderList[] = { in violatesPrivateInclude()
481 &Header.getModule()->Headers[Module::HK_Private], in violatesPrivateInclude()
482 &Header.getModule()->Headers[Module::HK_PrivateTextual]}; in violatesPrivateInclude()
485 *Hs, [&](const Module::Header &H) { return H.Entry == IncFileEnt; }); in violatesPrivateInclude()
492 static Module *getTopLevelOrNull(Module *M) { in getTopLevelOrNull()
496 void ModuleMap::diagnoseHeaderInclusion(Module *RequestingModule, in diagnoseHeaderInclusion()
511 Module *Private = nullptr; in diagnoseHeaderInclusion()
512 Module *NotUsed = nullptr; in diagnoseHeaderInclusion()
517 // Excluded headers don't really belong to a module. in diagnoseHeaderInclusion()
530 // modules that are explicitly used by the requesting module. in diagnoseHeaderInclusion()
537 // We have found a module that we can happily use. in diagnoseHeaderInclusion()
551 // We have found a module, but we don't use it. in diagnoseHeaderInclusion()
569 // Do not diagnose when we are not compiling a module. in diagnoseHeaderInclusion()
581 // FIXME: Considering whether the module is available rather than merely in isBetterKnownHeader()
620 // Cannot use a module if the header is excluded in it. in findModuleForHeader()
623 // Prefer a header from the source module over all others. in findModuleForHeader()
637 assert(!Headers.count(File) && "already have a module for this header"); in findOrCreateModuleForHeaderInUmbrellaDir()
642 Module *Result = H.getModule(); in findOrCreateModuleForHeaderInUmbrellaDir()
644 // Search up the module stack until we find a module with an umbrella in findOrCreateModuleForHeaderInUmbrellaDir()
646 Module *UmbrellaModule = Result; in findOrCreateModuleForHeaderInUmbrellaDir()
659 // Find or create the module that corresponds to this directory name. in findOrCreateModuleForHeaderInUmbrellaDir()
668 // Associate the module and the directory. in findOrCreateModuleForHeaderInUmbrellaDir()
674 Result->Exports.push_back(Module::ExportDecl(nullptr, true)); in findOrCreateModuleForHeaderInUmbrellaDir()
690 Result->Exports.push_back(Module::ExportDecl(nullptr, true)); in findOrCreateModuleForHeaderInUmbrellaDir()
693 // the module we found, since the umbrella header covers them all. in findOrCreateModuleForHeaderInUmbrellaDir()
733 FileEntryRef Header, const Module *RequestingModule) const { in isHeaderUnavailableInModule()
748 // When no requesting module is available, the caller is looking if a in isHeaderUnavailableInModule()
749 // header is part a module by only looking into the module map. This is in isHeaderUnavailableInModule()
765 auto IsUnavailable = [&](const Module *M) { in isHeaderUnavailableInModule()
775 Module *Found = KnownDir->second; in isHeaderUnavailableInModule()
779 // Search up the module stack until we find a module with an umbrella in isHeaderUnavailableInModule()
781 Module *UmbrellaModule = Found; in isHeaderUnavailableInModule()
788 // Find or create the module that corresponds to this directory name. in isHeaderUnavailableInModule()
826 Module *ModuleMap::findModule(StringRef Name) const { in findModule()
827 llvm::StringMap<Module *>::const_iterator Known = Modules.find(Name); in findModule()
834 Module *ModuleMap::lookupModuleUnqualified(StringRef Name, in lookupModuleUnqualified()
835 Module *Context) const { in lookupModuleUnqualified()
837 if (Module *Sub = lookupModuleQualified(Name, Context)) in lookupModuleUnqualified()
844 Module *ModuleMap::lookupModuleQualified(StringRef Name, Module *Context) const{ in lookupModuleQualified()
851 std::pair<Module *, bool> ModuleMap::findOrCreateModule(StringRef Name, in findOrCreateModule()
852 Module *Parent, in findOrCreateModule()
855 // Try to find an existing module with this name. in findOrCreateModule()
856 if (Module *Sub = lookupModuleQualified(Name, Parent)) in findOrCreateModule()
859 // Create a new module with this name. in findOrCreateModule()
860 Module *Result = new Module(Name, SourceLocation(), Parent, IsFramework, in findOrCreateModule()
871 Module *ModuleMap::createGlobalModuleFragmentForModuleUnit(SourceLocation Loc, in createGlobalModuleFragmentForModuleUnit()
872 Module *Parent) { in createGlobalModuleFragmentForModuleUnit()
873 auto *Result = new Module("<global>", Loc, Parent, /*IsFramework*/ false, in createGlobalModuleFragmentForModuleUnit()
875 Result->Kind = Module::ExplicitGlobalModuleFragment; in createGlobalModuleFragmentForModuleUnit()
876 // If the created module isn't owned by a parent, send it to PendingSubmodules in createGlobalModuleFragmentForModuleUnit()
883 Module *
885 Module *Parent) { in createImplicitGlobalModuleFragmentForModuleUnit()
886 assert(Parent && "We should only create an implicit global module fragment " in createImplicitGlobalModuleFragmentForModuleUnit()
887 "in a module purview"); in createImplicitGlobalModuleFragmentForModuleUnit()
892 new Module("<implicit global>", Loc, Parent, /*IsFramework=*/false, in createImplicitGlobalModuleFragmentForModuleUnit()
894 Result->Kind = Module::ImplicitGlobalModuleFragment; in createImplicitGlobalModuleFragmentForModuleUnit()
898 Module *
899 ModuleMap::createPrivateModuleFragmentForInterfaceUnit(Module *Parent, in createPrivateModuleFragmentForInterfaceUnit()
902 new Module("<private>", Loc, Parent, /*IsFramework*/ false, in createPrivateModuleFragmentForInterfaceUnit()
904 Result->Kind = Module::PrivateModuleFragment; in createPrivateModuleFragmentForInterfaceUnit()
908 Module *ModuleMap::createModuleUnitWithKind(SourceLocation Loc, StringRef Name, in createModuleUnitWithKind()
909 Module::ModuleKind Kind) { in createModuleUnitWithKind()
911 new Module(Name, Loc, nullptr, /*IsFramework*/ false, in createModuleUnitWithKind()
915 // Reparent any current global module fragment as a submodule of this module. in createModuleUnitWithKind()
924 Module *ModuleMap::createModuleForInterfaceUnit(SourceLocation Loc, in createModuleForInterfaceUnit()
926 assert(LangOpts.CurrentModule == Name && "module name mismatch"); in createModuleForInterfaceUnit()
927 assert(!Modules[Name] && "redefining existing module"); in createModuleForInterfaceUnit()
930 createModuleUnitWithKind(Loc, Name, Module::ModuleInterfaceUnit); in createModuleForInterfaceUnit()
933 // Mark the main source file as being within the newly-created module so that in createModuleForInterfaceUnit()
936 assert(MainFile && "no input file for module interface"); in createModuleForInterfaceUnit()
942 Module *ModuleMap::createModuleForImplementationUnit(SourceLocation Loc, in createModuleForImplementationUnit()
944 assert(LangOpts.CurrentModule == Name && "module name mismatch"); in createModuleForImplementationUnit()
946 assert(Modules[Name] && Modules[Name]->Kind == Module::ModuleInterfaceUnit && in createModuleForImplementationUnit()
947 "creating implementation module without an interface"); in createModuleForImplementationUnit()
949 // Create an entry in the modules map to own the implementation unit module. in createModuleForImplementationUnit()
950 // User module names must not start with a period (so that this cannot clash in createModuleForImplementationUnit()
951 // with any legal user-defined module name). in createModuleForImplementationUnit()
956 createModuleUnitWithKind(Loc, Name, Module::ModuleImplementationUnit); in createModuleForImplementationUnit()
961 "no input file for module implementation"); in createModuleForImplementationUnit()
966 Module *ModuleMap::createHeaderUnit(SourceLocation Loc, StringRef Name, in createHeaderUnit()
967 Module::Header H) { in createHeaderUnit()
968 assert(LangOpts.CurrentModule == Name && "module name mismatch"); in createHeaderUnit()
969 assert(!Modules[Name] && "redefining existing module"); in createHeaderUnit()
971 auto *Result = new Module(Name, Loc, nullptr, /*IsFramework*/ false, in createHeaderUnit()
973 Result->Kind = Module::ModuleHeaderUnit; in createHeaderUnit()
979 /// For a framework module, infer the framework against which we
981 static void inferFrameworkLink(Module *Mod) { in inferFrameworkLink()
988 Mod->LinkLibraries.push_back(Module::LinkLibrary(FrameworkName.str(), in inferFrameworkLink()
992 Module *ModuleMap::inferFrameworkModule(DirectoryEntryRef FrameworkDir, in inferFrameworkModule()
993 bool IsSystem, Module *Parent) { in inferFrameworkModule()
999 Module *ModuleMap::inferFrameworkModule(DirectoryEntryRef FrameworkDir, in inferFrameworkModule()
1000 Attributes Attrs, Module *Parent) { in inferFrameworkModule()
1015 // Check whether we've already found this module. in inferFrameworkModule()
1016 if (Module *Mod = lookupModuleQualified(ModuleName, Parent)) in inferFrameworkModule()
1022 // a framework module, do so. in inferFrameworkModule()
1025 // Determine whether we're allowed to infer a module map. in inferFrameworkModule()
1032 // for a module map. in inferFrameworkModule()
1036 // We haven't looked here before. Load a module map, if there is in inferFrameworkModule()
1052 // to infer this particular module. in inferFrameworkModule()
1067 // If we're not allowed to infer a framework module, don't. in inferFrameworkModule()
1085 Module *Result = new Module(ModuleName, SourceLocation(), Parent, in inferFrameworkModule()
1113 Result->Exports.push_back(Module::ExportDecl(nullptr, true)); in inferFrameworkModule()
1115 // module * { export * } in inferFrameworkModule()
1163 // If the module is a top-level framework, automatically link against the in inferFrameworkModule()
1171 Module *ModuleMap::createShadowedModule(StringRef Name, bool IsFramework, in createShadowedModule()
1172 Module *ShadowingModule) { in createShadowedModule()
1174 // Create a new module with this name. in createShadowedModule()
1175 Module *Result = in createShadowedModule()
1176 new Module(Name, SourceLocation(), /*Parent=*/nullptr, IsFramework, in createShadowedModule()
1187 Module *Mod, FileEntryRef UmbrellaHeader, const Twine &NameAsWritten, in setUmbrellaHeaderAsWritten()
1202 Module *Mod, DirectoryEntryRef UmbrellaDir, const Twine &NameAsWritten, in setUmbrellaDirAsWritten()
1211 void ModuleMap::addUnresolvedHeader(Module *Mod, in addUnresolvedHeader()
1212 Module::UnresolvedHeaderDirective Header, in addUnresolvedHeader()
1231 Header.Kind != Module::HK_Excluded) { in addUnresolvedHeader()
1264 Module *Mod, std::optional<const FileEntry *> File) const { in resolveHeaderDirectives()
1266 SmallVector<Module::UnresolvedHeaderDirective, 1> NewHeaders; in resolveHeaderDirectives()
1282 void ModuleMap::addHeader(Module *Mod, Module::Header Header, in addHeader()
1288 // same module definition? in addHeader()
1309 FileID ModuleMap::getContainingModuleMapFileID(const Module *Module) const { in getContainingModuleMapFileID()
1310 if (Module->DefinitionLoc.isInvalid()) in getContainingModuleMapFileID()
1313 return SourceMgr.getFileID(Module->DefinitionLoc); in getContainingModuleMapFileID()
1317 ModuleMap::getContainingModuleMapFile(const Module *Module) const { in getContainingModuleMapFile()
1318 return SourceMgr.getFileEntryRefForID(getContainingModuleMapFileID(Module)); in getContainingModuleMapFile()
1321 FileID ModuleMap::getModuleMapFileIDForUniquing(const Module *M) const { in getModuleMapFileIDForUniquing()
1323 assert(InferredModuleAllowedBy.count(M) && "missing inferred module map"); in getModuleMapFileIDForUniquing()
1330 ModuleMap::getModuleMapFileForUniquing(const Module *M) const { in getModuleMapFileForUniquing()
1334 void ModuleMap::setInferredModuleAllowedBy(Module *M, FileID ModMapFID) { in setInferredModuleAllowedBy()
1335 assert(M->IsInferred && "module not inferred"); in setInferredModuleAllowedBy()
1343 // Do not canonicalize within the framework; the module map parser expects in canonicalizeModuleMapPath()
1372 void ModuleMap::addAdditionalModuleMapFile(const Module *M, in addAdditionalModuleMapFile()
1379 for (llvm::StringMap<Module *>::iterator M = Modules.begin(), in dump()
1399 bool ModuleMap::resolveExports(Module *Mod, bool Complain) { in resolveExports()
1403 Module::ExportDecl Export = resolveExport(Mod, UE, Complain); in resolveExports()
1412 bool ModuleMap::resolveUses(Module *Mod, bool Complain) { in resolveUses()
1417 Module *DirectUse = resolveModuleId(UDU, Top, Complain); in resolveUses()
1426 bool ModuleMap::resolveConflicts(Module *Mod, bool Complain) { in resolveConflicts()
1430 if (Module *OtherMod = resolveModuleId(UC.Id, Mod, Complain)) { in resolveConflicts()
1431 Module::Conflict Conflict; in resolveConflicts()
1442 // Module map file parser
1447 /// A token in a module map file.
1524 /// The current module map file.
1527 /// Source location of most recent parsed module declaration
1530 /// The directory that file names in this module map file should
1534 /// Whether this module map is in a system header directory.
1547 /// The active module.
1548 Module *ActiveModule = nullptr;
1550 /// Whether a module uses the 'requires excluded' hack to mark its
1558 llvm::SmallPtrSet<Module *, 2> UsesRequiresExcludedHack;
1582 /// module map search logic to find the appropriate private module when PCH
1583 /// is used with implicit module maps. Warn when private modules are written
1635 .Case("module", MMToken::ModuleKeyword) in consumeToken()
1730 // A module map can be terminated prematurely by in consumeToken()
1731 // #pragma clang module contents in consumeToken()
1732 // When building the module, we'll treat the rest of the file as the in consumeToken()
1733 // contents of the module. in consumeToken()
1741 NextIsIdent("module") && NextIsIdent("contents")) { in consumeToken()
1803 /// Parse a module-id.
1805 /// module-id:
1807 /// identifier '.' module-id
1854 /// module map search logic to find the appropriate private module when PCH
1855 /// is used with implicit module maps. Warn when private modules are written
1860 const Module *M, SourceRange ReplLoc) { in diagnosePrivateModules()
1894 FixedPrivModDecl.append("module "); in diagnosePrivateModules()
1914 /// Parse a module declaration.
1916 /// module-declaration:
1917 /// 'extern' 'module' module-id string-literal
1918 /// 'explicit'[opt] 'framework'[opt] 'module' module-id attributes[opt]
1919 /// { module-member* }
1921 /// module-member:
1930 /// module-declaration
1958 // Parse 'module' keyword. in parseModuleDecl()
1965 CurrModuleDeclLoc = consumeToken(); // 'module' keyword in parseModuleDecl()
1967 // If we have a wildcard for the module name, this is an inferred submodule. in parseModuleDecl()
1972 // Parse the module name. in parseModuleDecl()
1995 Module *PreviousActiveModule = ActiveModule; in parseModuleDecl()
1997 // This module map defines a submodule. Go find the module of which it in parseModuleDecl()
2000 const Module *TopLevelModule = nullptr; in parseModuleDecl()
2002 if (Module *Next = Map.lookupModuleQualified(Id[I].first, ActiveModule)) { in parseModuleDecl()
2021 "submodule defined in same file as 'module *' that allowed its " in parseModuleDecl()
2022 "top-level module"); in parseModuleDecl()
2045 // Determine whether this (sub)module has already been defined. in parseModuleDecl()
2046 Module *ShadowingModule = nullptr; in parseModuleDecl()
2047 if (Module *Existing = Map.lookupModuleQualified(ModuleName, ActiveModule)) { in parseModuleDecl()
2048 // We might see a (re)definition of a module that we already have a in parseModuleDecl()
2051 // corresponding definition in a module map file, or in parseModuleDecl()
2053 // - If we previously inferred this module from different module map file. in parseModuleDecl()
2055 // - If we're building a framework that vends a module map, we might've in parseModuleDecl()
2058 // FIXME: If we're parsing module map file that looks like this: in parseModuleDecl()
2059 // framework module FW { ... } in parseModuleDecl()
2060 // module FW.Sub { ... } in parseModuleDecl()
2064 // module FW { ... } in parseModuleDecl()
2065 // module FW.Sub { ... } in parseModuleDecl()
2071 // - If we're building a (preprocessed) module and we've just loaded the in parseModuleDecl()
2072 // module map file from which it was created. in parseModuleDecl()
2080 // Skip the module definition. in parseModuleDecl()
2095 // This is not a shawdowed module decl, it is an illegal redefinition. in parseModuleDecl()
2100 // Skip the module definition. in parseModuleDecl()
2110 // Start defining this module. in parseModuleDecl()
2131 if (MapFileName.ends_with("module.private.modulemap") || in parseModuleDecl()
2232 // If the active module is a top-level framework, and there are no link in parseModuleDecl()
2238 // If the module meets all requirements but is still unavailable, mark the in parseModuleDecl()
2247 // We're done parsing this module. Pop back to the previous module. in parseModuleDecl()
2251 /// Parse an extern module declaration.
2253 /// extern module-declaration:
2254 /// 'extern' 'module' module-id string-literal
2259 // Parse 'module' keyword. in parseExternModuleDecl()
2266 consumeToken(); // 'module' keyword in parseExternModuleDecl()
2268 // Parse the module name. in parseExternModuleDecl()
2275 // Parse the referenced module map file name. in parseExternModuleDecl()
2300 /// Whether to add the requirement \p Feature to the module \p M.
2303 /// module map files:
2309 /// module to 'textual'.
2315 static bool shouldAddRequirement(Module *M, StringRef Feature, in shouldAddRequirement()
2415 // Module::UsesRequiresExcludedHack). in parseHeaderDecl()
2437 Module::UnresolvedHeaderDirective Header; in parseHeaderDecl()
2510 // always had its own module. in parseHeaderDecl()
2519 << FixItHint::CreateReplacement(CurrModuleDeclLoc, "framework module"); in parseHeaderDecl()
2522 static bool compareModuleHeaders(const Module::Header &A, in compareModuleHeaders()
2523 const Module::Header &B) { in compareModuleHeaders()
2573 // uncommonly used Tcl module on Darwin platforms. in parseUmbrellaDirDecl()
2575 SmallVector<Module::Header, 6> Headers; in parseUmbrellaDirDecl()
2581 Module::Header Header = {"", std::string(I->path()), *FE}; in parseUmbrellaDirDecl()
2594 if (Module *OwningModule = Map.UmbrellaDirs[*Dir]) { in parseUmbrellaDirDecl()
2605 /// Parse a module export declaration.
2608 /// 'export' wildcard-module-id
2610 /// wildcard-module-id:
2613 /// identifier '.' wildcard-module-id
2618 // Parse the module-id with an optional wildcard at the end. in parseExportDecl()
2622 // FIXME: Support string-literal module names here. in parseExportDecl()
2647 Module::UnresolvedExportDecl Unresolved = { in parseExportDecl()
2653 /// Parse a module export_as declaration.
2690 /// Parse a module use declaration.
2693 /// 'use' wildcard-module-id
2697 // Parse the module-id. in parseUseDecl()
2709 /// module-declaration:
2732 ActiveModule->LinkLibraries.push_back(Module::LinkLibrary(LibraryName, in parseLinkDecl()
2738 /// module-declaration:
2793 /// Format a module-id into a string.
2811 /// module-declaration:
2812 /// 'conflict' module-id ',' string-literal
2816 Module::UnresolvedConflict Conflict; in parseConflict()
2818 // Parse the module-id. in parseConflict()
2843 /// Parse an inferred module declaration (wildcard modules).
2845 /// module-declaration:
2846 /// 'explicit'[opt] 'framework'[opt] 'module' * attributes[opt]
2847 /// { inferred-module-member* }
2849 /// inferred-module-member:
2871 // Check for redefinition of an inferred module. in parseInferredModuleDecl()
2946 // FIXME: Support string-literal module names here. in parseInferredModuleDecl()
3071 /// Parse a module map file.
3073 /// module-map-file:
3074 /// module-declaration*
3129 // If the module map file wasn't already entered, do so now. in parseModuleMapFile()
3143 // Parse this module map file. in parseModuleMapFile()