forked from OSchip/llvm-project
Add a function to ExternalASTSource that returns a descriptor that
abstracts the commonalities between modules and PCH files that are needed to emit debug info for a module or precompiled header. llvm-svn: 241083
This commit is contained in:
parent
1d9b5e6ece
commit
15bcf70cdf
|
@ -156,6 +156,20 @@ public:
|
|||
/// \brief Retrieve the module that corresponds to the given module ID.
|
||||
virtual Module *getModule(unsigned ID) { return nullptr; }
|
||||
|
||||
/// \brief Holds everything needed to generate debug info for an
|
||||
/// imported module or precompiled header file.
|
||||
struct ASTSourceDescriptor {
|
||||
std::string ModuleName;
|
||||
std::string Path;
|
||||
std::string ASTFile;
|
||||
uint64_t Signature;
|
||||
};
|
||||
|
||||
/// \brief Return a descriptor for the corresponding module, if one exists.
|
||||
virtual llvm::Optional<ASTSourceDescriptor> getSourceDescriptor(unsigned ID);
|
||||
/// \brief Return a descriptor for the module.
|
||||
virtual ASTSourceDescriptor getSourceDescriptor(const Module &M);
|
||||
|
||||
/// \brief Finds all declarations lexically contained within the given
|
||||
/// DeclContext, after applying an optional filter predicate.
|
||||
///
|
||||
|
|
|
@ -66,6 +66,9 @@ public:
|
|||
/// \brief The umbrella header or directory.
|
||||
llvm::PointerUnion<const DirectoryEntry *, const FileEntry *> Umbrella;
|
||||
|
||||
/// \brief The module signature.
|
||||
uint64_t Signature;
|
||||
|
||||
/// \brief The name of the umbrella entry, as written in the module map.
|
||||
std::string UmbrellaAsWritten;
|
||||
|
||||
|
|
|
@ -1846,6 +1846,11 @@ public:
|
|||
/// Note: overrides method in ExternalASTSource
|
||||
Module *getModule(unsigned ID) override;
|
||||
|
||||
/// \brief Return a descriptor for the corresponding module.
|
||||
llvm::Optional<ASTSourceDescriptor> getSourceDescriptor(unsigned ID) override;
|
||||
/// \brief Return a descriptor for the module.
|
||||
ASTSourceDescriptor getSourceDescriptor(const Module &M) override;
|
||||
|
||||
/// \brief Retrieve a selector from the given module with its local ID
|
||||
/// number.
|
||||
Selector getLocalSelector(ModuleFile &M, unsigned LocalID);
|
||||
|
|
|
@ -22,6 +22,16 @@ using namespace clang;
|
|||
|
||||
ExternalASTSource::~ExternalASTSource() { }
|
||||
|
||||
llvm::Optional<ExternalASTSource::ASTSourceDescriptor>
|
||||
ExternalASTSource::getSourceDescriptor(unsigned ID) {
|
||||
return None;
|
||||
}
|
||||
|
||||
ExternalASTSource::ASTSourceDescriptor
|
||||
ExternalASTSource::getSourceDescriptor(const Module &M) {
|
||||
return ASTSourceDescriptor();
|
||||
}
|
||||
|
||||
void ExternalASTSource::FindFileRegionDecls(FileID File, unsigned Offset,
|
||||
unsigned Length,
|
||||
SmallVectorImpl<Decl *> &Decls) {}
|
||||
|
|
|
@ -27,7 +27,7 @@ using namespace clang;
|
|||
Module::Module(StringRef Name, SourceLocation DefinitionLoc, Module *Parent,
|
||||
bool IsFramework, bool IsExplicit, unsigned VisibilityID)
|
||||
: Name(Name), DefinitionLoc(DefinitionLoc), Parent(Parent), Directory(),
|
||||
Umbrella(), ASTFile(nullptr), VisibilityID(VisibilityID),
|
||||
Umbrella(), Signature(0), ASTFile(nullptr), VisibilityID(VisibilityID),
|
||||
IsMissingRequirement(false), IsAvailable(true), IsFromModuleFile(false),
|
||||
IsFramework(IsFramework), IsExplicit(IsExplicit), IsSystem(false),
|
||||
IsExternC(false), IsInferred(false), InferSubmodules(false),
|
||||
|
|
|
@ -4269,6 +4269,7 @@ ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
|
|||
CurrentModule->setASTFile(F.File);
|
||||
}
|
||||
|
||||
CurrentModule->Signature = F.Signature;
|
||||
CurrentModule->IsFromModuleFile = true;
|
||||
CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
|
||||
CurrentModule->IsExternC = IsExternC;
|
||||
|
@ -7366,6 +7367,37 @@ Module *ASTReader::getModule(unsigned ID) {
|
|||
return getSubmodule(ID);
|
||||
}
|
||||
|
||||
ExternalASTSource::ASTSourceDescriptor
|
||||
ASTReader::getSourceDescriptor(const Module &M) {
|
||||
StringRef Dir, Filename;
|
||||
if (M.Directory)
|
||||
Dir = M.Directory->getName();
|
||||
if (auto *File = M.getASTFile())
|
||||
Filename = File->getName();
|
||||
return ASTReader::ASTSourceDescriptor{
|
||||
M.getFullModuleName(), Dir, Filename,
|
||||
M.Signature
|
||||
};
|
||||
}
|
||||
|
||||
llvm::Optional<ExternalASTSource::ASTSourceDescriptor>
|
||||
ASTReader::getSourceDescriptor(unsigned ID) {
|
||||
if (const Module *M = getSubmodule(ID))
|
||||
return getSourceDescriptor(*M);
|
||||
|
||||
// If there is only a single PCH, return it instead.
|
||||
// Chained PCH are not suported.
|
||||
if (ModuleMgr.size() == 1) {
|
||||
ModuleFile &MF = ModuleMgr.getPrimaryModule();
|
||||
return ASTReader::ASTSourceDescriptor{
|
||||
MF.OriginalSourceFileName, MF.OriginalDir,
|
||||
MF.FileName,
|
||||
MF.Signature
|
||||
};
|
||||
}
|
||||
return None;
|
||||
}
|
||||
|
||||
Selector ASTReader::getLocalSelector(ModuleFile &M, unsigned LocalID) {
|
||||
return DecodeSelector(getGlobalSelectorID(M, LocalID));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue