15548cb50SEnrico Granata //===-- FormatCache.cpp ------------------------------------------*- C++ -*-===//
25548cb50SEnrico Granata //
35548cb50SEnrico Granata //                     The LLVM Compiler Infrastructure
45548cb50SEnrico Granata //
55548cb50SEnrico Granata // This file is distributed under the University of Illinois Open Source
65548cb50SEnrico Granata // License. See LICENSE.TXT for details.
75548cb50SEnrico Granata //
85548cb50SEnrico Granata //===----------------------------------------------------------------------===//
95548cb50SEnrico Granata 
10676a4875SMatt Kopec #include "lldb/lldb-python.h"
11676a4875SMatt Kopec 
125548cb50SEnrico Granata // C Includes
135548cb50SEnrico Granata 
145548cb50SEnrico Granata // C++ Includes
155548cb50SEnrico Granata 
165548cb50SEnrico Granata // Other libraries and framework includes
175548cb50SEnrico Granata 
185548cb50SEnrico Granata // Project includes
195548cb50SEnrico Granata #include "lldb/DataFormatters/FormatCache.h"
205548cb50SEnrico Granata 
215548cb50SEnrico Granata using namespace lldb;
225548cb50SEnrico Granata using namespace lldb_private;
235548cb50SEnrico Granata 
245548cb50SEnrico Granata FormatCache::Entry::Entry () :
25*52b4b6cdSEnrico Granata m_format_cached(false),
265548cb50SEnrico Granata m_summary_cached(false),
275548cb50SEnrico Granata m_synthetic_cached(false),
28*52b4b6cdSEnrico Granata m_format_sp(),
2930b95a36SDaniel Malea m_summary_sp(),
3030b95a36SDaniel Malea m_synthetic_sp()
315548cb50SEnrico Granata {}
325548cb50SEnrico Granata 
33*52b4b6cdSEnrico Granata FormatCache::Entry::Entry (lldb::TypeFormatImplSP format_sp) :
34*52b4b6cdSEnrico Granata m_summary_cached(false),
350b464d48SDaniel Malea m_synthetic_cached(false),
36*52b4b6cdSEnrico Granata m_summary_sp(),
37*52b4b6cdSEnrico Granata m_synthetic_sp()
38*52b4b6cdSEnrico Granata {
39*52b4b6cdSEnrico Granata     SetFormat (format_sp);
40*52b4b6cdSEnrico Granata }
41*52b4b6cdSEnrico Granata 
42*52b4b6cdSEnrico Granata FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp) :
43*52b4b6cdSEnrico Granata m_format_cached(false),
44*52b4b6cdSEnrico Granata m_synthetic_cached(false),
45*52b4b6cdSEnrico Granata m_format_sp(),
460b464d48SDaniel Malea m_synthetic_sp()
475548cb50SEnrico Granata {
485548cb50SEnrico Granata     SetSummary (summary_sp);
495548cb50SEnrico Granata }
505548cb50SEnrico Granata 
510b464d48SDaniel Malea FormatCache::Entry::Entry (lldb::SyntheticChildrenSP synthetic_sp) :
52*52b4b6cdSEnrico Granata m_format_cached(false),
530b464d48SDaniel Malea m_summary_cached(false),
54*52b4b6cdSEnrico Granata m_format_sp(),
550b464d48SDaniel Malea m_summary_sp()
565548cb50SEnrico Granata {
575548cb50SEnrico Granata     SetSynthetic (synthetic_sp);
585548cb50SEnrico Granata }
595548cb50SEnrico Granata 
60*52b4b6cdSEnrico Granata FormatCache::Entry::Entry (lldb::TypeFormatImplSP format_sp, lldb::TypeSummaryImplSP summary_sp, lldb::SyntheticChildrenSP synthetic_sp)
615548cb50SEnrico Granata {
62*52b4b6cdSEnrico Granata     SetFormat (format_sp);
635548cb50SEnrico Granata     SetSummary (summary_sp);
645548cb50SEnrico Granata     SetSynthetic (synthetic_sp);
655548cb50SEnrico Granata }
665548cb50SEnrico Granata 
675548cb50SEnrico Granata bool
68*52b4b6cdSEnrico Granata FormatCache::Entry::IsFormatCached ()
69*52b4b6cdSEnrico Granata {
70*52b4b6cdSEnrico Granata     return m_format_cached;
71*52b4b6cdSEnrico Granata }
72*52b4b6cdSEnrico Granata 
73*52b4b6cdSEnrico Granata bool
745548cb50SEnrico Granata FormatCache::Entry::IsSummaryCached ()
755548cb50SEnrico Granata {
765548cb50SEnrico Granata     return m_summary_cached;
775548cb50SEnrico Granata }
785548cb50SEnrico Granata 
795548cb50SEnrico Granata bool
805548cb50SEnrico Granata FormatCache::Entry::IsSyntheticCached ()
815548cb50SEnrico Granata {
825548cb50SEnrico Granata     return m_synthetic_cached;
835548cb50SEnrico Granata }
845548cb50SEnrico Granata 
85*52b4b6cdSEnrico Granata lldb::TypeFormatImplSP
86*52b4b6cdSEnrico Granata FormatCache::Entry::GetFormat ()
87*52b4b6cdSEnrico Granata {
88*52b4b6cdSEnrico Granata     return m_format_sp;
89*52b4b6cdSEnrico Granata }
90*52b4b6cdSEnrico Granata 
915548cb50SEnrico Granata lldb::TypeSummaryImplSP
925548cb50SEnrico Granata FormatCache::Entry::GetSummary ()
935548cb50SEnrico Granata {
945548cb50SEnrico Granata     return m_summary_sp;
955548cb50SEnrico Granata }
965548cb50SEnrico Granata 
975548cb50SEnrico Granata lldb::SyntheticChildrenSP
985548cb50SEnrico Granata FormatCache::Entry::GetSynthetic ()
995548cb50SEnrico Granata {
1005548cb50SEnrico Granata     return m_synthetic_sp;
1015548cb50SEnrico Granata }
1025548cb50SEnrico Granata 
1035548cb50SEnrico Granata void
104*52b4b6cdSEnrico Granata FormatCache::Entry::SetFormat (lldb::TypeFormatImplSP format_sp)
105*52b4b6cdSEnrico Granata {
106*52b4b6cdSEnrico Granata     m_format_cached = true;
107*52b4b6cdSEnrico Granata     m_format_sp = format_sp;
108*52b4b6cdSEnrico Granata }
109*52b4b6cdSEnrico Granata 
110*52b4b6cdSEnrico Granata void
1115548cb50SEnrico Granata FormatCache::Entry::SetSummary (lldb::TypeSummaryImplSP summary_sp)
1125548cb50SEnrico Granata {
1135548cb50SEnrico Granata     m_summary_cached = true;
1145548cb50SEnrico Granata     m_summary_sp = summary_sp;
1155548cb50SEnrico Granata }
1165548cb50SEnrico Granata 
1175548cb50SEnrico Granata void
1185548cb50SEnrico Granata FormatCache::Entry::SetSynthetic (lldb::SyntheticChildrenSP synthetic_sp)
1195548cb50SEnrico Granata {
1205548cb50SEnrico Granata     m_synthetic_cached = true;
1215548cb50SEnrico Granata     m_synthetic_sp = synthetic_sp;
1225548cb50SEnrico Granata }
1235548cb50SEnrico Granata 
1245548cb50SEnrico Granata FormatCache::FormatCache () :
1255548cb50SEnrico Granata m_map(),
1265548cb50SEnrico Granata m_mutex (Mutex::eMutexTypeRecursive)
1275548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1285548cb50SEnrico Granata ,m_cache_hits(0),m_cache_misses(0)
1295548cb50SEnrico Granata #endif
1305548cb50SEnrico Granata {
1315548cb50SEnrico Granata }
1325548cb50SEnrico Granata 
1335548cb50SEnrico Granata FormatCache::Entry&
1345548cb50SEnrico Granata FormatCache::GetEntry (const ConstString& type)
1355548cb50SEnrico Granata {
1365548cb50SEnrico Granata     auto i = m_map.find(type),
1375548cb50SEnrico Granata     e = m_map.end();
1385548cb50SEnrico Granata     if (i != e)
1395548cb50SEnrico Granata         return i->second;
1405548cb50SEnrico Granata     m_map[type] = FormatCache::Entry();
1415548cb50SEnrico Granata     return m_map[type];
1425548cb50SEnrico Granata }
1435548cb50SEnrico Granata 
1445548cb50SEnrico Granata bool
145*52b4b6cdSEnrico Granata FormatCache::GetFormat (const ConstString& type,lldb::TypeFormatImplSP& format_sp)
146*52b4b6cdSEnrico Granata {
147*52b4b6cdSEnrico Granata     Mutex::Locker lock(m_mutex);
148*52b4b6cdSEnrico Granata     auto entry = GetEntry(type);
149*52b4b6cdSEnrico Granata     if (entry.IsSummaryCached())
150*52b4b6cdSEnrico Granata     {
151*52b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
152*52b4b6cdSEnrico Granata         m_cache_hits++;
153*52b4b6cdSEnrico Granata #endif
154*52b4b6cdSEnrico Granata         format_sp = entry.GetFormat();
155*52b4b6cdSEnrico Granata         return true;
156*52b4b6cdSEnrico Granata     }
157*52b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
158*52b4b6cdSEnrico Granata     m_cache_misses++;
159*52b4b6cdSEnrico Granata #endif
160*52b4b6cdSEnrico Granata     format_sp.reset();
161*52b4b6cdSEnrico Granata     return false;
162*52b4b6cdSEnrico Granata }
163*52b4b6cdSEnrico Granata 
164*52b4b6cdSEnrico Granata bool
1655548cb50SEnrico Granata FormatCache::GetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
1665548cb50SEnrico Granata {
1675548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1685548cb50SEnrico Granata     auto entry = GetEntry(type);
1695548cb50SEnrico Granata     if (entry.IsSummaryCached())
1705548cb50SEnrico Granata     {
1715548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1725548cb50SEnrico Granata         m_cache_hits++;
1735548cb50SEnrico Granata #endif
1745548cb50SEnrico Granata         summary_sp = entry.GetSummary();
1755548cb50SEnrico Granata         return true;
1765548cb50SEnrico Granata     }
1775548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1785548cb50SEnrico Granata     m_cache_misses++;
1795548cb50SEnrico Granata #endif
1805548cb50SEnrico Granata     summary_sp.reset();
1815548cb50SEnrico Granata     return false;
1825548cb50SEnrico Granata }
1835548cb50SEnrico Granata 
1845548cb50SEnrico Granata bool
1855548cb50SEnrico Granata FormatCache::GetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
1865548cb50SEnrico Granata {
1875548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
1885548cb50SEnrico Granata     auto entry = GetEntry(type);
1895548cb50SEnrico Granata     if (entry.IsSyntheticCached())
1905548cb50SEnrico Granata     {
1915548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1925548cb50SEnrico Granata         m_cache_hits++;
1935548cb50SEnrico Granata #endif
1945548cb50SEnrico Granata         synthetic_sp = entry.GetSynthetic();
1955548cb50SEnrico Granata         return true;
1965548cb50SEnrico Granata     }
1975548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1985548cb50SEnrico Granata     m_cache_misses++;
1995548cb50SEnrico Granata #endif
2005548cb50SEnrico Granata     synthetic_sp.reset();
2015548cb50SEnrico Granata     return false;
2025548cb50SEnrico Granata }
2035548cb50SEnrico Granata 
2045548cb50SEnrico Granata void
205*52b4b6cdSEnrico Granata FormatCache::SetFormat (const ConstString& type,lldb::TypeFormatImplSP& format_sp)
206*52b4b6cdSEnrico Granata {
207*52b4b6cdSEnrico Granata     Mutex::Locker lock(m_mutex);
208*52b4b6cdSEnrico Granata     GetEntry(type).SetFormat(format_sp);
209*52b4b6cdSEnrico Granata }
210*52b4b6cdSEnrico Granata 
211*52b4b6cdSEnrico Granata void
2125548cb50SEnrico Granata FormatCache::SetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
2135548cb50SEnrico Granata {
2145548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
2155548cb50SEnrico Granata     GetEntry(type).SetSummary(summary_sp);
2165548cb50SEnrico Granata }
2175548cb50SEnrico Granata 
2185548cb50SEnrico Granata void
2195548cb50SEnrico Granata FormatCache::SetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
2205548cb50SEnrico Granata {
2215548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
2225548cb50SEnrico Granata     GetEntry(type).SetSynthetic(synthetic_sp);
2235548cb50SEnrico Granata }
2245548cb50SEnrico Granata 
2255548cb50SEnrico Granata void
2265548cb50SEnrico Granata FormatCache::Clear ()
2275548cb50SEnrico Granata {
2285548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
2295548cb50SEnrico Granata     m_map.clear();
2305548cb50SEnrico Granata }
2315548cb50SEnrico Granata 
232