blob: 79cc9a91355af783e8c8388d3b88296b544cae01 [file] [log] [blame]
Sean Callanan3b107b12011-12-03 03:15:28 +00001//===-- ClangExternalASTSourceCommon.cpp ------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Symbol/ClangExternalASTSourceCommon.h"
Greg Claytond0029442013-03-27 01:48:02 +000011#include "lldb/Core/Stream.h"
Sean Callananceeb74e2014-12-06 01:03:30 +000012#include "lldb/Host/Mutex.h"
Sean Callanan3b107b12011-12-03 03:15:28 +000013
14using namespace lldb_private;
15
Sean Callanan60217122012-04-13 00:10:03 +000016uint64_t g_TotalSizeOfMetadata = 0;
17
Sean Callananceeb74e2014-12-06 01:03:30 +000018typedef llvm::DenseMap<clang::ExternalASTSource *, ClangExternalASTSourceCommon *> ASTSourceMap;
19
20static ASTSourceMap &GetSourceMap()
21{
22 static ASTSourceMap s_source_map;
23 return s_source_map;
24}
25
26ClangExternalASTSourceCommon *
27ClangExternalASTSourceCommon::Lookup(clang::ExternalASTSource *source)
28{
29 ASTSourceMap &source_map = GetSourceMap();
30
31 ASTSourceMap::iterator iter = source_map.find(source);
32
Sean Callanan957a8722014-12-06 02:31:49 +000033 if (iter != source_map.end())
Sean Callananceeb74e2014-12-06 01:03:30 +000034 {
35 return iter->second;
36 }
37 else
38 {
39 return nullptr;
40 }
41}
42
Sean Callanan3b107b12011-12-03 03:15:28 +000043ClangExternalASTSourceCommon::ClangExternalASTSourceCommon() : clang::ExternalASTSource()
44{
Sean Callanan60217122012-04-13 00:10:03 +000045 g_TotalSizeOfMetadata += m_metadata.size();
Sean Callananceeb74e2014-12-06 01:03:30 +000046 GetSourceMap()[this] = this;
Sean Callanan60217122012-04-13 00:10:03 +000047}
48
49ClangExternalASTSourceCommon::~ClangExternalASTSourceCommon()
50{
Sean Callananceeb74e2014-12-06 01:03:30 +000051 GetSourceMap().erase(this);
Sean Callanan60217122012-04-13 00:10:03 +000052 g_TotalSizeOfMetadata -= m_metadata.size();
Sean Callanan3b107b12011-12-03 03:15:28 +000053}
54
Jim Ingham379397632012-10-27 02:54:13 +000055ClangASTMetadata *
Greg Claytond0029442013-03-27 01:48:02 +000056ClangExternalASTSourceCommon::GetMetadata (const void *object)
Sean Callanan3b107b12011-12-03 03:15:28 +000057{
Jim Ingham379397632012-10-27 02:54:13 +000058 if (HasMetadata (object))
59 return &m_metadata[object];
60 else
Ed Masted4612ad2014-04-20 13:17:36 +000061 return nullptr;
Sean Callanan3b107b12011-12-03 03:15:28 +000062}
63
Jim Ingham379397632012-10-27 02:54:13 +000064void
Greg Claytond0029442013-03-27 01:48:02 +000065ClangExternalASTSourceCommon::SetMetadata (const void *object, ClangASTMetadata &metadata)
Sean Callanan3b107b12011-12-03 03:15:28 +000066{
Sean Callanan60217122012-04-13 00:10:03 +000067 uint64_t orig_size = m_metadata.size();
Sean Callanan3b107b12011-12-03 03:15:28 +000068 m_metadata[object] = metadata;
Sean Callanan60217122012-04-13 00:10:03 +000069 uint64_t new_size = m_metadata.size();
70 g_TotalSizeOfMetadata += (new_size - orig_size);
Sean Callanan3b107b12011-12-03 03:15:28 +000071}
72
Jim Ingham379397632012-10-27 02:54:13 +000073bool
Greg Claytond0029442013-03-27 01:48:02 +000074ClangExternalASTSourceCommon::HasMetadata (const void *object)
Sean Callanan3b107b12011-12-03 03:15:28 +000075{
Sean Callanan3b107b12011-12-03 03:15:28 +000076 return m_metadata.find(object) != m_metadata.end();
Greg Clayton1075aca2011-12-03 20:02:42 +000077}
Greg Claytond0029442013-03-27 01:48:02 +000078
79void
80ClangASTMetadata::Dump (Stream *s)
81{
82 lldb::user_id_t uid = GetUserID ();
83
84 if (uid != LLDB_INVALID_UID)
85 {
86 s->Printf ("uid=0x%" PRIx64, uid);
87 }
88
89 uint64_t isa_ptr = GetISAPtr ();
90 if (isa_ptr != 0)
91 {
92 s->Printf ("isa_ptr=0x%" PRIx64, isa_ptr);
93 }
94
95 const char *obj_ptr_name = GetObjectPtrName();
96 if (obj_ptr_name)
97 {
98 s->Printf ("obj_ptr_name=\"%s\" ", obj_ptr_name);
99 }
100
101 if (m_is_dynamic_cxx)
102 {
103 s->Printf ("is_dynamic_cxx=%i ", m_is_dynamic_cxx);
104 }
105 s->EOL();
106}
107