diff options
| author | Adrian Prantl <aprantl@apple.com> | 2015-06-30 17:39:43 +0000 |
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2015-06-30 17:39:43 +0000 |
| commit | 15bcf70cdf843d3070af3e811b7b0412b55e9500 (patch) | |
| tree | fc6f06d437029b0d38652ca3911543b4690d48f7 | |
| parent | 1d9b5e6eced452c671e77ac924bd1fd4808716ee (diff) | |
| download | bcm5719-llvm-15bcf70cdf843d3070af3e811b7b0412b55e9500.tar.gz bcm5719-llvm-15bcf70cdf843d3070af3e811b7b0412b55e9500.zip | |
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
| -rw-r--r-- | clang/include/clang/AST/ExternalASTSource.h | 14 | ||||
| -rw-r--r-- | clang/include/clang/Basic/Module.h | 3 | ||||
| -rw-r--r-- | clang/include/clang/Serialization/ASTReader.h | 5 | ||||
| -rw-r--r-- | clang/lib/AST/ExternalASTSource.cpp | 10 | ||||
| -rw-r--r-- | clang/lib/Basic/Module.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Serialization/ASTReader.cpp | 32 |
6 files changed, 65 insertions, 1 deletions
diff --git a/clang/include/clang/AST/ExternalASTSource.h b/clang/include/clang/AST/ExternalASTSource.h index 9a760807621..08c2e0cf267 100644 --- a/clang/include/clang/AST/ExternalASTSource.h +++ b/clang/include/clang/AST/ExternalASTSource.h @@ -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. /// diff --git a/clang/include/clang/Basic/Module.h b/clang/include/clang/Basic/Module.h index 74706107403..1bc89257d38 100644 --- a/clang/include/clang/Basic/Module.h +++ b/clang/include/clang/Basic/Module.h @@ -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; diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index 429f00f852b..670124082cf 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -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); diff --git a/clang/lib/AST/ExternalASTSource.cpp b/clang/lib/AST/ExternalASTSource.cpp index 730842a28f6..1c82c355134 100644 --- a/clang/lib/AST/ExternalASTSource.cpp +++ b/clang/lib/AST/ExternalASTSource.cpp @@ -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) {} diff --git a/clang/lib/Basic/Module.cpp b/clang/lib/Basic/Module.cpp index 7308665bd2d..1a48a6c6a8d 100644 --- a/clang/lib/Basic/Module.cpp +++ b/clang/lib/Basic/Module.cpp @@ -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), diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 5e5999d5bf9..48a898cb30d 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -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)); } |

