FormatCache.cpp revision fe21d4f351f560921e615a6677afe1c057aa7f28
1f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//===-- FormatCache.cpp ------------------------------------------*- C++ -*-===//
2f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//
3f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//                     The LLVM Compiler Infrastructure
4f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//
5f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// This file is distributed under the University of Illinois Open Source
6f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// License. See LICENSE.TXT for details.
7f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//
8f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//===----------------------------------------------------------------------===//
9f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
10fe21d4f351f560921e615a6677afe1c057aa7f28Matt Kopec#include "lldb/lldb-python.h"
11fe21d4f351f560921e615a6677afe1c057aa7f28Matt Kopec
12f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// C Includes
13f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
14f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// C++ Includes
15f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
16f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// Other libraries and framework includes
17f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
18f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// Project includes
19f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/FormatCache.h"
20f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
21f509c5ec066599a3399fced39ea36996184939e8Enrico Granatausing namespace lldb;
22f509c5ec066599a3399fced39ea36996184939e8Enrico Granatausing namespace lldb_private;
23f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
24f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::Entry () :
25f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_summary_cached(false),
26f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_synthetic_cached(false),
2777332ba5320cb506c5ccec65cc6d4e6107aaa374Daniel Maleam_summary_sp(),
2877332ba5320cb506c5ccec65cc6d4e6107aaa374Daniel Maleam_synthetic_sp()
29f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{}
30f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
3104334199f3c719e958c7eec6e25152c2bab9ad5eDaniel MaleaFormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp) :
3204334199f3c719e958c7eec6e25152c2bab9ad5eDaniel Maleam_synthetic_cached(false),
3304334199f3c719e958c7eec6e25152c2bab9ad5eDaniel Maleam_synthetic_sp()
34f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
35f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    SetSummary (summary_sp);
36f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
37f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
3804334199f3c719e958c7eec6e25152c2bab9ad5eDaniel MaleaFormatCache::Entry::Entry (lldb::SyntheticChildrenSP synthetic_sp) :
3904334199f3c719e958c7eec6e25152c2bab9ad5eDaniel Maleam_summary_cached(false),
4004334199f3c719e958c7eec6e25152c2bab9ad5eDaniel Maleam_summary_sp()
41f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
42f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    SetSynthetic (synthetic_sp);
43f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
44f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
4504334199f3c719e958c7eec6e25152c2bab9ad5eDaniel MaleaFormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp,lldb::SyntheticChildrenSP synthetic_sp)
46f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
47f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    SetSummary (summary_sp);
48f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    SetSynthetic (synthetic_sp);
49f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
50f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
51f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool
52f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::IsSummaryCached ()
53f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
54f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return m_summary_cached;
55f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
56f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
57f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool
58f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::IsSyntheticCached ()
59f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
60f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return m_synthetic_cached;
61f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
62f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
63f509c5ec066599a3399fced39ea36996184939e8Enrico Granatalldb::TypeSummaryImplSP
64f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::GetSummary ()
65f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
66f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return m_summary_sp;
67f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
68f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
69f509c5ec066599a3399fced39ea36996184939e8Enrico Granatalldb::SyntheticChildrenSP
70f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::GetSynthetic ()
71f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
72f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return m_synthetic_sp;
73f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
74f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
75f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid
76f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::SetSummary (lldb::TypeSummaryImplSP summary_sp)
77f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
78f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_summary_cached = true;
79f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_summary_sp = summary_sp;
80f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
81f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
82f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid
83f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::SetSynthetic (lldb::SyntheticChildrenSP synthetic_sp)
84f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
85f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_synthetic_cached = true;
86f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_synthetic_sp = synthetic_sp;
87f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
88f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
89f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::FormatCache () :
90f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_map(),
91f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_mutex (Mutex::eMutexTypeRecursive)
92f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG
93f509c5ec066599a3399fced39ea36996184939e8Enrico Granata,m_cache_hits(0),m_cache_misses(0)
94f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
95f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
96f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
97f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
98f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry&
99f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::GetEntry (const ConstString& type)
100f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
101f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    auto i = m_map.find(type),
102f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    e = m_map.end();
103f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (i != e)
104f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return i->second;
105f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_map[type] = FormatCache::Entry();
106f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return m_map[type];
107f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
108f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
109f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool
110f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::GetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
111f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
112f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    Mutex::Locker lock(m_mutex);
113f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    auto entry = GetEntry(type);
114f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (entry.IsSummaryCached())
115f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
116f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG
117f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        m_cache_hits++;
118f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
119f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        summary_sp = entry.GetSummary();
120f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return true;
121f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
122f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG
123f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_cache_misses++;
124f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
125f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    summary_sp.reset();
126f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return false;
127f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
128f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
129f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool
130f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::GetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
131f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
132f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    Mutex::Locker lock(m_mutex);
133f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    auto entry = GetEntry(type);
134f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (entry.IsSyntheticCached())
135f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
136f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG
137f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        m_cache_hits++;
138f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
139f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        synthetic_sp = entry.GetSynthetic();
140f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return true;
141f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
142f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG
143f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_cache_misses++;
144f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
145f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    synthetic_sp.reset();
146f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return false;
147f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
148f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
149f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid
150f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::SetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
151f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
152f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    Mutex::Locker lock(m_mutex);
153f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    GetEntry(type).SetSummary(summary_sp);
154f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
155f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
156f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid
157f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::SetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
158f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
159f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    Mutex::Locker lock(m_mutex);
160f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    GetEntry(type).SetSynthetic(synthetic_sp);
161f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
162f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
163f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid
164f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Clear ()
165f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
166f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    Mutex::Locker lock(m_mutex);
167f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_map.clear();
168f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
169f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
170