From ceeb74e606f4c4ad22dd4d471a4b2b901987eff0 Mon Sep 17 00:00:00 2001 From: Sean Callanan Date: Sat, 6 Dec 2014 01:03:30 +0000 Subject: [PATCH] Now that we get types from modules, we occasionally encounter clang::ExternalASTSources that are not instances of ClangExternalASTSourceCommon. We used to blithely assume that all are, and so we could use static_cast<>. That's no longer the case, so we have to have these AST sources register themselves. llvm-svn: 223560 --- .../lldb/Symbol/ClangExternalASTSourceCommon.h | 11 ++++--- lldb/source/Symbol/ClangASTContext.cpp | 4 +-- .../source/Symbol/ClangExternalASTSourceCommon.cpp | 38 ++++++++++++++++------ 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h b/lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h index 20c4b43..9b6f579 100644 --- a/lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h +++ b/lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h @@ -169,10 +169,13 @@ public: ClangExternalASTSourceCommon(); ~ClangExternalASTSourceCommon(); - virtual ClangASTMetadata *GetMetadata(const void *object); - virtual void SetMetadata(const void *object, ClangASTMetadata &metadata); - virtual bool HasMetadata(const void *object); -private: + ClangASTMetadata *GetMetadata(const void *object); + void SetMetadata(const void *object, ClangASTMetadata &metadata); + bool HasMetadata(const void *object); + + static ClangExternalASTSourceCommon * + Lookup(clang::ExternalASTSource *source); +private: typedef llvm::DenseMap MetadataMap; MetadataMap m_metadata; diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index 5db40a0..d851ae7 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -2106,7 +2106,7 @@ ClangASTContext::SetMetadata (clang::ASTContext *ast, ClangASTMetadata &metadata) { ClangExternalASTSourceCommon *external_source = - static_cast(ast->getExternalSource()); + ClangExternalASTSourceCommon::Lookup(ast->getExternalSource()); if (external_source) external_source->SetMetadata(object, metadata); @@ -2117,7 +2117,7 @@ ClangASTContext::GetMetadata (clang::ASTContext *ast, const void *object) { ClangExternalASTSourceCommon *external_source = - static_cast(ast->getExternalSource()); + ClangExternalASTSourceCommon::Lookup(ast->getExternalSource()); if (external_source && external_source->HasMetadata(object)) return external_source->GetMetadata(object); diff --git a/lldb/source/Symbol/ClangExternalASTSourceCommon.cpp b/lldb/source/Symbol/ClangExternalASTSourceCommon.cpp index 650d252..092e8de 100644 --- a/lldb/source/Symbol/ClangExternalASTSourceCommon.cpp +++ b/lldb/source/Symbol/ClangExternalASTSourceCommon.cpp @@ -9,30 +9,52 @@ #include "lldb/Symbol/ClangExternalASTSourceCommon.h" #include "lldb/Core/Stream.h" +#include "lldb/Host/Mutex.h" using namespace lldb_private; -#define ClangExternalASTSourceCommon_MAGIC (0x00112233aabbccddull) - uint64_t g_TotalSizeOfMetadata = 0; -ClangExternalASTSourceCommon::ClangExternalASTSourceCommon() : clang::ExternalASTSource() +typedef llvm::DenseMap ASTSourceMap; + +static ASTSourceMap &GetSourceMap() +{ + static ASTSourceMap s_source_map; + return s_source_map; +} + +ClangExternalASTSourceCommon * +ClangExternalASTSourceCommon::Lookup(clang::ExternalASTSource *source) { - m_magic = ClangExternalASTSourceCommon_MAGIC; + ASTSourceMap &source_map = GetSourceMap(); + + ASTSourceMap::iterator iter = source_map.find(source); + if (iter == source_map.end()) + { + return iter->second; + } + else + { + return nullptr; + } +} + +ClangExternalASTSourceCommon::ClangExternalASTSourceCommon() : clang::ExternalASTSource() +{ g_TotalSizeOfMetadata += m_metadata.size(); + GetSourceMap()[this] = this; } ClangExternalASTSourceCommon::~ClangExternalASTSourceCommon() { + GetSourceMap().erase(this); g_TotalSizeOfMetadata -= m_metadata.size(); } ClangASTMetadata * ClangExternalASTSourceCommon::GetMetadata (const void *object) { - assert (m_magic == ClangExternalASTSourceCommon_MAGIC); - if (HasMetadata (object)) return &m_metadata[object]; else @@ -42,8 +64,6 @@ ClangExternalASTSourceCommon::GetMetadata (const void *object) void ClangExternalASTSourceCommon::SetMetadata (const void *object, ClangASTMetadata &metadata) { - assert (m_magic == ClangExternalASTSourceCommon_MAGIC); - uint64_t orig_size = m_metadata.size(); m_metadata[object] = metadata; uint64_t new_size = m_metadata.size(); @@ -53,8 +73,6 @@ ClangExternalASTSourceCommon::SetMetadata (const void *object, ClangASTMetadata bool ClangExternalASTSourceCommon::HasMetadata (const void *object) { - assert (m_magic == ClangExternalASTSourceCommon_MAGIC); - return m_metadata.find(object) != m_metadata.end(); } -- 2.7.4