clang  6.0.0svn
Classes | Public Types | Public Member Functions | Static Public Member Functions | Friends | List of all members
clang::ModuleMap Class Reference

#include "clang/Lex/ModuleMap.h"

Classes

class  KnownHeader
 A header that is known to reside within a given module, whether it was included or excluded. More...
 

Public Types

enum  ModuleHeaderRole { NormalHeader = 0x0, PrivateHeader = 0x1, TextualHeader = 0x2 }
 Flags describing the role of a module header. More...
 
using AdditionalModMapsSet = llvm::SmallPtrSet< const FileEntry *, 1 >
 
using module_iterator = llvm::StringMap< Module * >::const_iterator
 

Public Member Functions

 ModuleMap (SourceManager &SourceMgr, DiagnosticsEngine &Diags, const LangOptions &LangOpts, const TargetInfo *Target, HeaderSearch &HeaderInfo)
 Construct a new module map. More...
 
 ~ModuleMap ()
 Destroy the module map. More...
 
void setTarget (const TargetInfo &Target)
 Set the target information. More...
 
void setBuiltinIncludeDir (const DirectoryEntry *Dir)
 Set the directory that contains Clang-supplied include files, such as our stdarg.h or tgmath.h. More...
 
const DirectoryEntrygetBuiltinDir () const
 Get the directory that contains Clang-supplied include files. More...
 
void addModuleMapCallbacks (std::unique_ptr< ModuleMapCallbacks > Callback)
 Add a module map callback. More...
 
KnownHeader findModuleForHeader (const FileEntry *File, bool AllowTextual=false)
 Retrieve the module that owns the given header file, if any. More...
 
ArrayRef< KnownHeaderfindAllModulesForHeader (const FileEntry *File) const
 Retrieve all the modules that contain the given header file. More...
 
void resolveHeaderDirectives (const FileEntry *File) const
 Resolve all lazy header directives for the specified file. More...
 
void resolveHeaderDirectives (Module *Mod) const
 Resolve all lazy header directives for the specified module. More...
 
void diagnoseHeaderInclusion (Module *RequestingModule, bool RequestingModuleIsModuleInterface, SourceLocation FilenameLoc, StringRef Filename, const FileEntry *File)
 Reports errors if a module must not include a specific file. More...
 
bool isHeaderInUnavailableModule (const FileEntry *Header) const
 Determine whether the given header is part of a module marked 'unavailable'. More...
 
bool isHeaderUnavailableInModule (const FileEntry *Header, const Module *RequestingModule) const
 Determine whether the given header is unavailable as part of the specified module. More...
 
ModulefindModule (StringRef Name) const
 Retrieve a module with the given name. More...
 
ModulelookupModuleUnqualified (StringRef Name, Module *Context) const
 Retrieve a module with the given name using lexical name lookup, starting at the given context. More...
 
ModulelookupModuleQualified (StringRef Name, Module *Context) const
 Retrieve a module with the given name within the given context, using direct (qualified) name lookup. More...
 
std::pair< Module *, boolfindOrCreateModule (StringRef Name, Module *Parent, bool IsFramework, bool IsExplicit)
 Find a new module or submodule, or create it if it does not already exist. More...
 
ModulecreateGlobalModuleForInterfaceUnit (SourceLocation Loc)
 Create a 'global module' for a C++ Modules TS module interface unit. More...
 
ModulecreateModuleForInterfaceUnit (SourceLocation Loc, StringRef Name, Module *GlobalModule)
 Create a new module for a C++ Modules TS module interface unit. More...
 
ModuleinferFrameworkModule (const DirectoryEntry *FrameworkDir, bool IsSystem, Module *Parent)
 Infer the contents of a framework module map from the given framework directory. More...
 
const FileEntrygetContainingModuleMapFile (const Module *Module) const
 Retrieve the module map file containing the definition of the given module. More...
 
const FileEntrygetModuleMapFileForUniquing (const Module *M) const
 Get the module map file that (along with the module name) uniquely identifies this module. More...
 
void setInferredModuleAllowedBy (Module *M, const FileEntry *ModuleMap)
 
AdditionalModMapsSetgetAdditionalModuleMapFiles (const Module *M)
 Get any module map files other than getModuleMapFileForUniquing(M) that define submodules of a top-level module M. More...
 
void addAdditionalModuleMapFile (const Module *M, const FileEntry *ModuleMap)
 
bool resolveExports (Module *Mod, bool Complain)
 Resolve all of the unresolved exports in the given module. More...
 
bool resolveUses (Module *Mod, bool Complain)
 Resolve all of the unresolved uses in the given module. More...
 
bool resolveConflicts (Module *Mod, bool Complain)
 Resolve all of the unresolved conflicts in the given module. More...
 
void setUmbrellaHeader (Module *Mod, const FileEntry *UmbrellaHeader, Twine NameAsWritten)
 Sets the umbrella header of the given module to the given header. More...
 
void setUmbrellaDir (Module *Mod, const DirectoryEntry *UmbrellaDir, Twine NameAsWritten)
 Sets the umbrella directory of the given module to the given directory. More...
 
void addHeader (Module *Mod, Module::Header Header, ModuleHeaderRole Role, bool Imported=false)
 Adds this header to the given module. More...
 
void excludeHeader (Module *Mod, Module::Header Header)
 Marks this header as being excluded from the given module. More...
 
bool parseModuleMapFile (const FileEntry *File, bool IsSystem, const DirectoryEntry *HomeDir, FileID ID=FileID(), unsigned *Offset=nullptr, SourceLocation ExternModuleLoc=SourceLocation())
 Parse the given module map file, and record any modules we encounter. More...
 
void dump ()
 Dump the contents of the module map, for debugging purposes. More...
 
module_iterator module_begin () const
 
module_iterator module_end () const
 

Static Public Member Functions

static ModuleHeaderRole headerKindToRole (Module::HeaderKind Kind)
 Convert a header kind to a role. Requires Kind to not be HK_Excluded. More...
 
static Module::HeaderKind headerRoleToKind (ModuleHeaderRole Role)
 Convert a header role to a kind. More...
 
static bool isBuiltinHeader (StringRef FileName)
 Is this a compiler builtin header? More...
 

Friends

class ModuleMapParser
 

Detailed Description

Definition at line 72 of file ModuleMap.h.

Member Typedef Documentation

◆ AdditionalModMapsSet

using clang::ModuleMap::AdditionalModMapsSet = llvm::SmallPtrSet<const FileEntry *, 1>

Definition at line 171 of file ModuleMap.h.

◆ module_iterator

using clang::ModuleMap::module_iterator = llvm::StringMap<Module *>::const_iterator

Definition at line 618 of file ModuleMap.h.

Member Enumeration Documentation

◆ ModuleHeaderRole

Flags describing the role of a module header.

Enumerator
NormalHeader 

This header is normally included in the module.

PrivateHeader 

This header is included but private.

TextualHeader 

This header is part of the module (for layering purposes) but should be textually included.

Definition at line 106 of file ModuleMap.h.

Constructor & Destructor Documentation

◆ ModuleMap()

ModuleMap::ModuleMap ( SourceManager SourceMgr,
DiagnosticsEngine Diags,
const LangOptions LangOpts,
const TargetInfo Target,
HeaderSearch HeaderInfo 
)

Construct a new module map.

Parameters
SourceMgrThe source manager used to find module files and headers. This source manager should be shared with the header-search mechanism, since they will refer to the same headers.
DiagsA diagnostic engine used for diagnostics.
LangOptsLanguage options for this translation unit.
TargetThe target for this translation unit.

Definition at line 273 of file ModuleMap.cpp.

◆ ~ModuleMap()

ModuleMap::~ModuleMap ( )

Destroy the module map.

Definition at line 281 of file ModuleMap.cpp.

Member Function Documentation

◆ addAdditionalModuleMapFile()

void clang::ModuleMap::addAdditionalModuleMapFile ( const Module M,
const FileEntry ModuleMap 
)
inline

Definition at line 538 of file ModuleMap.h.

References dump().

◆ addHeader()

void ModuleMap::addHeader ( Module Mod,
Module::Header  Header,
ModuleHeaderRole  Role,
bool  Imported = false 
)

◆ addModuleMapCallbacks()

void clang::ModuleMap::addModuleMapCallbacks ( std::unique_ptr< ModuleMapCallbacks Callback)
inline

Add a module map callback.

Definition at line 372 of file ModuleMap.h.

Referenced by clang::DependencyCollector::attachToPreprocessor(), and clang::ModuleDependencyCollector::attachToPreprocessor().

◆ createGlobalModuleForInterfaceUnit()

Module * ModuleMap::createGlobalModuleForInterfaceUnit ( SourceLocation  Loc)

Create a 'global module' for a C++ Modules TS module interface unit.

We model the global module as a submodule of the module interface unit. Unfortunately, we can't create the module interface unit's Module until later, because we don't know what it will be called.

Definition at line 766 of file ModuleMap.cpp.

References clang::Module::GlobalModuleFragment.

Referenced by clang::Sema::ActOnStartOfTranslationUnit().

◆ createModuleForInterfaceUnit()

Module * ModuleMap::createModuleForInterfaceUnit ( SourceLocation  Loc,
StringRef  Name,
Module GlobalModule 
)

Create a new module for a C++ Modules TS module interface unit.

The module must not already exist, and will be configured for the current compilation.

Note that this also sets the current module to the newly-created module.

Returns
The newly-created module.

Definition at line 775 of file ModuleMap.cpp.

◆ diagnoseHeaderInclusion()

void ModuleMap::diagnoseHeaderInclusion ( Module RequestingModule,
bool  RequestingModuleIsModuleInterface,
SourceLocation  FilenameLoc,
StringRef  Filename,
const FileEntry File 
)

Reports errors if a module must not include a specific file.

Parameters
RequestingModuleThe module including a file.
RequestingModuleIsModuleInterfacetrue if the inclusion is in the interface of RequestingModule, false if it's in the implementation of RequestingModule. Value is ignored and meaningless if RequestingModule is nullptr.
FilenameLocThe location of the inclusion's filename.
FilenameThe included filename as written.
FileThe included file.

Definition at line 423 of file ModuleMap.cpp.

References clang::Module::directlyUses(), Filename, clang::Module::getFullModuleName(), clang::ModuleMap::KnownHeader::getModule(), clang::FileEntry::getName(), clang::Module::getTopLevelModule(), getTopLevelOrNull(), clang::LangOptions::isCompilingModule(), clang::Module::IsFramework, clang::DiagnosticsEngine::Report(), resolveHeaderDirectives(), resolveUses(), and violatesPrivateInclude().

Referenced by clang::Preprocessor::LookupFile().

◆ dump()

LLVM_DUMP_METHOD void ModuleMap::dump ( )

Dump the contents of the module map, for debugging purposes.

Definition at line 1141 of file ModuleMap.cpp.

References clang::Module::print().

◆ excludeHeader()

void ModuleMap::excludeHeader ( Module Mod,
Module::Header  Header 
)

Marks this header as being excluded from the given module.

Definition at line 1109 of file ModuleMap.cpp.

References clang::Module::Header::Entry, clang::Module::Headers, and clang::Module::HK_Excluded.

◆ findAllModulesForHeader()

ArrayRef< ModuleMap::KnownHeader > ModuleMap::findAllModulesForHeader ( const FileEntry File) const

Retrieve all the modules that contain the given header file.

This may not include umbrella modules, nor information from external sources, if they have not yet been inferred / loaded.

Typically, findModuleForHeader should be used instead, as it picks the preferred module for the header.

Definition at line 617 of file ModuleMap.cpp.

References clang::None, and resolveHeaderDirectives().

Referenced by CreateSLocExpansionAbbrev(), and clang::Preprocessor::getModuleHeaderToIncludeForDiagnostics().

◆ findModule()

Module * ModuleMap::findModule ( StringRef  Name) const

Retrieve a module with the given name.

Parameters
NameThe name of the module to look up.
Returns
The named module, if known; otherwise, returns null.

Definition at line 722 of file ModuleMap.cpp.

Referenced by clang::HeaderSearch::lookupModule().

◆ findModuleForHeader()

ModuleMap::KnownHeader ModuleMap::findModuleForHeader ( const FileEntry File,
bool  AllowTextual = false 
)

Retrieve the module that owns the given header file, if any.

Parameters
FileThe header file that is likely to be included.
AllowTextualIf true and File is a textual header, return its owning module. Otherwise, no KnownHeader will be returned if the file is only known as a textual header.
Returns
The module KnownHeader, which provides the module that owns the given header file. The KnownHeader is default constructed to indicate that no module owns this header file.

Definition at line 519 of file ModuleMap.cpp.

References clang::ModuleMap::KnownHeader::getModule(), getModuleMapFileForUniquing(), clang::Module::getTopLevelModule(), clang::Module::getUmbrellaDir(), clang::if(), clang::Module::InferExplicitSubmodules, clang::Module::InferSubmodules, isBetterKnownHeader(), clang::Module::Parent, clang::Result, and TextualHeader.

Referenced by clang::HeaderSearch::findModuleForHeader(), and clang::Preprocessor::getModuleForLocation().

◆ findOrCreateModule()

std::pair< Module *, bool > ModuleMap::findOrCreateModule ( StringRef  Name,
Module Parent,
bool  IsFramework,
bool  IsExplicit 
)

Find a new module or submodule, or create it if it does not already exist.

Parameters
NameThe name of the module to find or create.
ParentThe module that will act as the parent of this submodule, or nullptr to indicate that this is a top-level module.
IsFrameworkWhether this is a framework module.
IsExplicitWhether this is an explicit submodule.
Returns
The found or newly-created module, along with a boolean value that will be true if the module is newly-created.

Definition at line 747 of file ModuleMap.cpp.

◆ getAdditionalModuleMapFiles()

AdditionalModMapsSet* clang::ModuleMap::getAdditionalModuleMapFiles ( const Module M)
inline

Get any module map files other than getModuleMapFileForUniquing(M) that define submodules of a top-level module M.

This is cheaper than getting the module map file for each submodule individually, since the expected number of results is very small.

Definition at line 531 of file ModuleMap.h.

◆ getBuiltinDir()

const DirectoryEntry* clang::ModuleMap::getBuiltinDir ( ) const
inline

Get the directory that contains Clang-supplied include files.

Definition at line 364 of file ModuleMap.h.

Referenced by clang::HeaderSearch::ShouldEnterIncludeFile().

◆ getContainingModuleMapFile()

const FileEntry * ModuleMap::getContainingModuleMapFile ( const Module Module) const

Retrieve the module map file containing the definition of the given module.

Parameters
ModuleThe module whose module map file will be returned, if known.
Returns
The file entry for the module map file containing the given module, or nullptr if the module definition was inferred.

Definition at line 1120 of file ModuleMap.cpp.

References clang::Module::DefinitionLoc, clang::SourceManager::getFileEntryForID(), clang::SourceManager::getFileID(), and clang::SourceLocation::isInvalid().

Referenced by compileModuleImpl(), and getModuleMapFileForUniquing().

◆ getModuleMapFileForUniquing()

const FileEntry * ModuleMap::getModuleMapFileForUniquing ( const Module M) const

Get the module map file that (along with the module name) uniquely identifies this module.

The particular module that Name refers to may depend on how the module was found in header search. However, the combination of Name and this module map will be globally unique for top-level modules. In the case of inferred modules, returns the module map that allowed the inference (e.g. contained 'module *'). Otherwise, returns getContainingModuleMapFile().

Definition at line 1128 of file ModuleMap.cpp.

References getContainingModuleMapFile(), and clang::Module::IsInferred.

Referenced by compileModuleImpl(), findModuleForHeader(), and clang::HeaderSearch::getCachedModuleFileName().

◆ headerKindToRole()

ModuleMap::ModuleHeaderRole ModuleMap::headerKindToRole ( Module::HeaderKind  Kind)
static

◆ headerRoleToKind()

Module::HeaderKind ModuleMap::headerRoleToKind ( ModuleHeaderRole  Role)
static

◆ inferFrameworkModule()

Module * ModuleMap::inferFrameworkModule ( const DirectoryEntry FrameworkDir,
bool  IsSystem,
Module Parent 
)

◆ isBuiltinHeader()

bool ModuleMap::isBuiltinHeader ( StringRef  FileName)
static

Is this a compiler builtin header?

Determine whether the given file name is the name of a builtin header, supplied by Clang to replace, override, or augment existing system headers.

Definition at line 332 of file ModuleMap.cpp.

Referenced by clang::HeaderSearch::ShouldEnterIncludeFile().

◆ isHeaderInUnavailableModule()

bool ModuleMap::isHeaderInUnavailableModule ( const FileEntry Header) const

Determine whether the given header is part of a module marked 'unavailable'.

Definition at line 625 of file ModuleMap.cpp.

References isHeaderUnavailableInModule().

Referenced by collectAllSubModulesWithUmbrellaHeader().

◆ isHeaderUnavailableInModule()

bool ModuleMap::isHeaderUnavailableInModule ( const FileEntry Header,
const Module RequestingModule 
) const

Determine whether the given header is unavailable as part of the specified module.

Definition at line 630 of file ModuleMap.cpp.

References resolveHeaderDirectives().

Referenced by collectModuleHeaderIncludes(), and isHeaderInUnavailableModule().

◆ lookupModuleQualified()

Module * ModuleMap::lookupModuleQualified ( StringRef  Name,
Module Context 
) const

Retrieve a module with the given name within the given context, using direct (qualified) name lookup.

Parameters
NameThe name of the module to look up.
ContextThe module for which we will look for a submodule. If null, we will look for a top-level module.
Returns
The named submodule, if known; otherwose, returns null.

Definition at line 740 of file ModuleMap.cpp.

Referenced by inferFrameworkModule().

◆ lookupModuleUnqualified()

Module * ModuleMap::lookupModuleUnqualified ( StringRef  Name,
Module Context 
) const

Retrieve a module with the given name using lexical name lookup, starting at the given context.

Parameters
NameThe name of the module to look up.
ContextThe module context, from which we will perform lexical name lookup.
Returns
The named module, if known; otherwise, returns null.

Definition at line 730 of file ModuleMap.cpp.

◆ module_begin()

module_iterator clang::ModuleMap::module_begin ( ) const
inline

Definition at line 620 of file ModuleMap.h.

Referenced by clang::HeaderSearch::collectAllModules().

◆ module_end()

module_iterator clang::ModuleMap::module_end ( ) const
inline

Definition at line 621 of file ModuleMap.h.

Referenced by clang::HeaderSearch::collectAllModules().

◆ parseModuleMapFile()

bool ModuleMap::parseModuleMapFile ( const FileEntry File,
bool  IsSystem,
const DirectoryEntry HomeDir,
FileID  ID = FileID(),
unsigned *  Offset = nullptr,
SourceLocation  ExternModuleLoc = SourceLocation() 
)

Parse the given module map file, and record any modules we encounter.

Parameters
FileThe file to be parsed.
IsSystemWhether this module map file is in a system header directory, and therefore should be considered a system module.
HomeDirThe directory in which relative paths within this module map file will be resolved.
IDThe FileID of the file to process, if we've already entered it.
Offset[inout] On input the offset at which to start parsing. On output, the offset at which the module map terminated.
ExternModuleLocThe location of the "extern module" declaration that caused us to load this module map file, if any.
Returns
true if an error occurred, false otherwise.

Definition at line 2785 of file ModuleMap.cpp.

References clang::SrcMgr::C_System_ModuleMap, clang::SrcMgr::C_User_ModuleMap, clang::if(), and clang::FileID::isInvalid().

Referenced by inferFrameworkModule(), clang::HeaderSearch::loadModuleMapFile(), and clang::ModuleMapParser::ModuleMapParser().

◆ resolveConflicts()

bool ModuleMap::resolveConflicts ( Module Mod,
bool  Complain 
)

Resolve all of the unresolved conflicts in the given module.

Parameters
ModThe module whose conflicts should be resolved.
ComplainWhether to emit diagnostics for failures.
Returns
true if any errors were encountered while resolving conflicts, false otherwise.

Definition at line 1189 of file ModuleMap.cpp.

References clang::Module::Conflicts, clang::Module::Conflict::Message, clang::Module::Conflict::Other, and clang::Module::UnresolvedConflicts.

Referenced by clang::Preprocessor::EnterSubmodule().

◆ resolveExports()

bool ModuleMap::resolveExports ( Module Mod,
bool  Complain 
)

Resolve all of the unresolved exports in the given module.

Parameters
ModThe module whose exports should be resolved.
ComplainWhether to emit diagnostics for failures.
Returns
true if any errors were encountered while resolving exports, false otherwise.

Definition at line 1163 of file ModuleMap.cpp.

References clang::Module::Exports, and clang::Module::UnresolvedExports.

Referenced by clang::Preprocessor::EnterSubmodule().

◆ resolveHeaderDirectives() [1/2]

void ModuleMap::resolveHeaderDirectives ( const FileEntry File) const

Resolve all lazy header directives for the specified file.

This ensures that the HeaderFileInfo on HeaderSearch is up to date. This is effectively internal, but is exposed so HeaderSearch can call it.

Definition at line 1056 of file ModuleMap.cpp.

References clang::FileEntry::getModificationTime(), and clang::FileEntry::getSize().

Referenced by collectModuleHeaderIncludes(), CreateSLocExpansionAbbrev(), diagnoseHeaderInclusion(), findAllModulesForHeader(), isHeaderUnavailableInModule(), and clang::HeaderSearch::ShouldEnterIncludeFile().

◆ resolveHeaderDirectives() [2/2]

void ModuleMap::resolveHeaderDirectives ( Module Mod) const

Resolve all lazy header directives for the specified module.

Definition at line 1072 of file ModuleMap.cpp.

References clang::Module::UnresolvedHeaders.

◆ resolveUses()

bool ModuleMap::resolveUses ( Module Mod,
bool  Complain 
)

Resolve all of the unresolved uses in the given module.

Parameters
ModThe module whose uses should be resolved.
ComplainWhether to emit diagnostics for failures.
Returns
true if any errors were encountered while resolving uses, false otherwise.

Definition at line 1176 of file ModuleMap.cpp.

References clang::Module::DirectUses, and clang::Module::UnresolvedDirectUses.

Referenced by diagnoseHeaderInclusion(), clang::Preprocessor::EnterSubmodule(), and suggestModule().

◆ setBuiltinIncludeDir()

void clang::ModuleMap::setBuiltinIncludeDir ( const DirectoryEntry Dir)
inline

Set the directory that contains Clang-supplied include files, such as our stdarg.h or tgmath.h.

Definition at line 359 of file ModuleMap.h.

◆ setInferredModuleAllowedBy()

void ModuleMap::setInferredModuleAllowedBy ( Module M,
const FileEntry ModuleMap 
)

Definition at line 1136 of file ModuleMap.cpp.

References clang::Module::IsInferred.

Referenced by prepareToBuildModule().

◆ setTarget()

void ModuleMap::setTarget ( const TargetInfo Target)

Set the target information.

Definition at line 286 of file ModuleMap.cpp.

Referenced by clang::HeaderSearch::setTarget().

◆ setUmbrellaDir()

void ModuleMap::setUmbrellaDir ( Module Mod,
const DirectoryEntry UmbrellaDir,
Twine  NameAsWritten 
)

◆ setUmbrellaHeader()

void ModuleMap::setUmbrellaHeader ( Module Mod,
const FileEntry UmbrellaHeader,
Twine  NameAsWritten 
)

Sets the umbrella header of the given module to the given header.

Definition at line 1002 of file ModuleMap.cpp.

References clang::FileEntry::getDir(), clang::SourceManager::getFileManager(), NormalHeader, clang::Module::Umbrella, and clang::Module::UmbrellaAsWritten.

Friends And Related Function Documentation

◆ ModuleMapParser

friend class ModuleMapParser
friend

Definition at line 174 of file ModuleMap.h.


The documentation for this class was generated from the following files: