summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Callanan <scallanan@apple.com>2014-12-06 01:03:30 +0000
committerSean Callanan <scallanan@apple.com>2014-12-06 01:03:30 +0000
commitceeb74e606f4c4ad22dd4d471a4b2b901987eff0 (patch)
tree1fefcf26ede74a389ef615d8aafbee053c453b8d
parent67d7af9c342e20df47d29e54422422198733e375 (diff)
downloadbcm5719-llvm-ceeb74e606f4c4ad22dd4d471a4b2b901987eff0.tar.gz
bcm5719-llvm-ceeb74e606f4c4ad22dd4d471a4b2b901987eff0.zip
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
-rw-r--r--lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h11
-rw-r--r--lldb/source/Symbol/ClangASTContext.cpp4
-rw-r--r--lldb/source/Symbol/ClangExternalASTSourceCommon.cpp38
3 files changed, 37 insertions, 16 deletions
diff --git a/lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h b/lldb/include/lldb/Symbol/ClangExternalASTSourceCommon.h
index 20c4b435436..9b6f579d4e2 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<const void *, ClangASTMetadata> MetadataMap;
MetadataMap m_metadata;
diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp
index 5db40a021c8..d851ae79218 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<ClangExternalASTSourceCommon*>(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<ClangExternalASTSourceCommon*>(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 650d252a8fc..092e8de08a6 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<clang::ExternalASTSource *, ClangExternalASTSourceCommon *> 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();
}
OpenPOWER on IntegriCloud