Author: Raphael Isemann Date: 2019-12-15T22:39:50+01:00 New Revision: 8280896bd1b055a192d9e7d482b0ffa14ee88e3a
URL: https://github.com/llvm/llvm-project/commit/8280896bd1b055a192d9e7d482b0ffa14ee88e3a DIFF: https://github.com/llvm/llvm-project/commit/8280896bd1b055a192d9e7d482b0ffa14ee88e3a.diff LOG: [lldb] Remove RTTI in ClangExternalASTSourceCommon based on a global map of known instances Summary: Currently we do our RTTI check for ClangExternalASTSourceCommon by using this global map of ClangExternalASTSourceCommon where every instance is registering and deregistering itself on creation/destruction. Then we can do the RTTI check by looking up in this map from ClangASTContext. This patch removes this whole thing and just adds LLVM-style RTTI support to ClangExternalASTSourceCommon which is possible with D71397. Reviewers: labath, aprantl Reviewed By: labath Subscribers: JDevlieghere, lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D71398 Added: Modified: lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h lldb/source/Symbol/ClangASTContext.cpp lldb/source/Symbol/ClangExternalASTSourceCommon.cpp Removed: ################################################################################ diff --git a/lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h b/lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h index e7dd94d28286..5da486540bb9 100644 --- a/lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h +++ b/lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h @@ -122,8 +122,11 @@ class ClangASTMetadata { }; class ClangExternalASTSourceCommon : public clang::ExternalASTSource { + + /// LLVM-style RTTI. + static char ID; + public: - ClangExternalASTSourceCommon(); ~ClangExternalASTSourceCommon() override; ClangASTMetadata *GetMetadata(const clang::Decl *object); @@ -138,8 +141,13 @@ class ClangExternalASTSourceCommon : public clang::ExternalASTSource { m_type_metadata[object] = metadata; } - static ClangExternalASTSourceCommon *Lookup(clang::ExternalASTSource *source); - + /// LLVM-style RTTI. + /// \{ + bool isA(const void *ClassID) const override { + return ClassID == &ID || ExternalASTSource::isA(ClassID); + } + static bool classof(const ExternalASTSource *S) { return S->isA(&ID); } + /// \} private: typedef llvm::DenseMap<const clang::Decl *, ClangASTMetadata> DeclMetadataMap; typedef llvm::DenseMap<const clang::Type *, ClangASTMetadata> TypeMetadataMap; diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index 2576a372076c..ed613528a2f4 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -2414,41 +2414,31 @@ void ClangASTContext::SetMetadataAsUserID(const clang::Type *type, void ClangASTContext::SetMetadata(const clang::Decl *object, ClangASTMetadata &metadata) { - ClangExternalASTSourceCommon *external_source = - ClangExternalASTSourceCommon::Lookup( - getASTContext()->getExternalSource()); - - if (external_source) - external_source->SetMetadata(object, metadata); + if (auto *A = llvm::dyn_cast_or_null<ClangExternalASTSourceCommon>( + getASTContext()->getExternalSource())) + A->SetMetadata(object, metadata); } void ClangASTContext::SetMetadata(const clang::Type *object, ClangASTMetadata &metadata) { - ClangExternalASTSourceCommon *external_source = - ClangExternalASTSourceCommon::Lookup( - getASTContext()->getExternalSource()); - - if (external_source) - external_source->SetMetadata(object, metadata); + if (auto *A = llvm::dyn_cast_or_null<ClangExternalASTSourceCommon>( + getASTContext()->getExternalSource())) + A->SetMetadata(object, metadata); } ClangASTMetadata *ClangASTContext::GetMetadata(clang::ASTContext *ast, const clang::Decl *object) { - ClangExternalASTSourceCommon *external_source = - ClangExternalASTSourceCommon::Lookup(ast->getExternalSource()); - - if (external_source) - return external_source->GetMetadata(object); + if (auto *A = llvm::dyn_cast_or_null<ClangExternalASTSourceCommon>( + ast->getExternalSource())) + return A->GetMetadata(object); return nullptr; } ClangASTMetadata *ClangASTContext::GetMetadata(clang::ASTContext *ast, const clang::Type *object) { - ClangExternalASTSourceCommon *external_source = - ClangExternalASTSourceCommon::Lookup(ast->getExternalSource()); - - if (external_source) - return external_source->GetMetadata(object); + if (auto *A = llvm::dyn_cast_or_null<ClangExternalASTSourceCommon>( + ast->getExternalSource())) + return A->GetMetadata(object); return nullptr; } diff --git a/lldb/source/Symbol/ClangExternalASTSourceCommon.cpp b/lldb/source/Symbol/ClangExternalASTSourceCommon.cpp index 66fb4f3b3f05..be015da872d0 100644 --- a/lldb/source/Symbol/ClangExternalASTSourceCommon.cpp +++ b/lldb/source/Symbol/ClangExternalASTSourceCommon.cpp @@ -13,43 +13,9 @@ using namespace lldb_private; -typedef llvm::DenseMap<clang::ExternalASTSource *, - ClangExternalASTSourceCommon *> - ASTSourceMap; +char ClangExternalASTSourceCommon::ID; -static ASTSourceMap &GetSourceMap(std::unique_lock<std::mutex> &guard) { - // Intentionally leaked to avoid problems with global destructors. - static ASTSourceMap *s_source_map = new ASTSourceMap; - static std::mutex s_mutex; - std::unique_lock<std::mutex> locked_guard(s_mutex); - guard.swap(locked_guard); - return *s_source_map; -} - -ClangExternalASTSourceCommon * -ClangExternalASTSourceCommon::Lookup(clang::ExternalASTSource *source) { - std::unique_lock<std::mutex> guard; - ASTSourceMap &source_map = GetSourceMap(guard); - - ASTSourceMap::iterator iter = source_map.find(source); - - if (iter != source_map.end()) { - return iter->second; - } else { - return nullptr; - } -} - -ClangExternalASTSourceCommon::ClangExternalASTSourceCommon() - : clang::ExternalASTSource() { - std::unique_lock<std::mutex> guard; - GetSourceMap(guard)[this] = this; -} - -ClangExternalASTSourceCommon::~ClangExternalASTSourceCommon() { - std::unique_lock<std::mutex> guard; - GetSourceMap(guard).erase(this); -} +ClangExternalASTSourceCommon::~ClangExternalASTSourceCommon() {} ClangASTMetadata * ClangExternalASTSourceCommon::GetMetadata(const clang::Decl *object) { _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits