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
318aaa52329ade20107fe28af7085b0a1f395816a8Todd FialaFormatCache::Entry::Entry (const Entry& rhs) :
328aaa52329ade20107fe28af7085b0a1f395816a8Todd Fialam_summary_cached(rhs.m_summary_cached),
338aaa52329ade20107fe28af7085b0a1f395816a8Todd Fialam_synthetic_cached(rhs.m_synthetic_cached),
348aaa52329ade20107fe28af7085b0a1f395816a8Todd Fialam_summary_sp(rhs.m_summary_sp),
358aaa52329ade20107fe28af7085b0a1f395816a8Todd Fialam_synthetic_sp(rhs.m_synthetic_sp)
368aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala{}
378aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala
3804334199f3c719e958c7eec6e25152c2bab9ad5eDaniel MaleaFormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp) :
3904334199f3c719e958c7eec6e25152c2bab9ad5eDaniel Maleam_synthetic_cached(false),
4004334199f3c719e958c7eec6e25152c2bab9ad5eDaniel Maleam_synthetic_sp()
41f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
42f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    SetSummary (summary_sp);
43f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
44f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
4504334199f3c719e958c7eec6e25152c2bab9ad5eDaniel MaleaFormatCache::Entry::Entry (lldb::SyntheticChildrenSP synthetic_sp) :
4604334199f3c719e958c7eec6e25152c2bab9ad5eDaniel Maleam_summary_cached(false),
4704334199f3c719e958c7eec6e25152c2bab9ad5eDaniel Maleam_summary_sp()
48f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
49f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    SetSynthetic (synthetic_sp);
50f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
51f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
5204334199f3c719e958c7eec6e25152c2bab9ad5eDaniel MaleaFormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp,lldb::SyntheticChildrenSP synthetic_sp)
53f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
54f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    SetSummary (summary_sp);
55f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    SetSynthetic (synthetic_sp);
56f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
57f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
588aaa52329ade20107fe28af7085b0a1f395816a8Todd FialaFormatCache::Entry& FormatCache::Entry::operator= (const Entry& rhs)
598aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala{
608aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala    if (this == &rhs)
618aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala        return *this;
628aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala
638aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala    m_summary_cached = rhs.m_summary_cached;
648aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala    m_synthetic_cached = rhs.m_synthetic_cached;
658aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala    m_summary_sp = rhs.m_summary_sp;
668aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala    m_synthetic_sp = rhs.m_synthetic_sp;
678aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala    return *this;
688aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala}
698aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala
70f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool
71f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::IsSummaryCached ()
72f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
73f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return m_summary_cached;
74f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
75f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
76f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool
77f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::IsSyntheticCached ()
78f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
79f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return m_synthetic_cached;
80f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
81f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
82f509c5ec066599a3399fced39ea36996184939e8Enrico Granatalldb::TypeSummaryImplSP
83f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::GetSummary ()
84f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
85f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return m_summary_sp;
86f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
87f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
88f509c5ec066599a3399fced39ea36996184939e8Enrico Granatalldb::SyntheticChildrenSP
89f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::GetSynthetic ()
90f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
91f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return m_synthetic_sp;
92f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
93f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
94f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid
95f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::SetSummary (lldb::TypeSummaryImplSP summary_sp)
96f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
97f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_summary_cached = true;
98f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_summary_sp = summary_sp;
99f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
100f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
101f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid
102f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::SetSynthetic (lldb::SyntheticChildrenSP synthetic_sp)
103f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
104f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_synthetic_cached = true;
105f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_synthetic_sp = synthetic_sp;
106f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
107f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
108f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::FormatCache () :
109f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_map(),
110f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_mutex (Mutex::eMutexTypeRecursive)
111f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG
112f509c5ec066599a3399fced39ea36996184939e8Enrico Granata,m_cache_hits(0),m_cache_misses(0)
113f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
114f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
115f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
116f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
117f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry&
118f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::GetEntry (const ConstString& type)
119f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
120f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    auto i = m_map.find(type),
121f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    e = m_map.end();
122f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (i != e)
123f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return i->second;
124f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_map[type] = FormatCache::Entry();
125f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return m_map[type];
126f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
127f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
128f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool
129f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::GetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
130f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
131f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    Mutex::Locker lock(m_mutex);
132f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    auto entry = GetEntry(type);
133f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (entry.IsSummaryCached())
134f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
135f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG
136f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        m_cache_hits++;
137f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
138f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        summary_sp = entry.GetSummary();
139f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return true;
140f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
141f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG
142f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_cache_misses++;
143f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
144f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    summary_sp.reset();
145f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return false;
146f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
147f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
148f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool
149f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::GetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
150f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
151f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    Mutex::Locker lock(m_mutex);
152f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    auto entry = GetEntry(type);
153f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    if (entry.IsSyntheticCached())
154f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    {
155f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG
156f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        m_cache_hits++;
157f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
158f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        synthetic_sp = entry.GetSynthetic();
159f509c5ec066599a3399fced39ea36996184939e8Enrico Granata        return true;
160f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    }
161f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG
162f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_cache_misses++;
163f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif
164f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    synthetic_sp.reset();
165f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    return false;
166f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
167f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
168f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid
169f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::SetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
170f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
171f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    Mutex::Locker lock(m_mutex);
172f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    GetEntry(type).SetSummary(summary_sp);
173f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
174f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
175f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid
176f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::SetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
177f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
178f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    Mutex::Locker lock(m_mutex);
179f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    GetEntry(type).SetSynthetic(synthetic_sp);
180f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
181f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
182f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid
183f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Clear ()
184f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{
185f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    Mutex::Locker lock(m_mutex);
186f509c5ec066599a3399fced39ea36996184939e8Enrico Granata    m_map.clear();
187f509c5ec066599a3399fced39ea36996184939e8Enrico Granata}
188f509c5ec066599a3399fced39ea36996184939e8Enrico Granata
189