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 () :
2552b4b6cdSEnrico Granata m_format_cached(false),
265548cb50SEnrico Granata m_summary_cached(false),
275548cb50SEnrico Granata m_synthetic_cached(false),
28*c582713cSEnrico Granata m_validator_cached(false),
2952b4b6cdSEnrico Granata m_format_sp(),
3030b95a36SDaniel Malea m_summary_sp(),
31*c582713cSEnrico Granata m_synthetic_sp(),
32*c582713cSEnrico Granata m_validator_sp()
335548cb50SEnrico Granata {}
345548cb50SEnrico Granata 
3552b4b6cdSEnrico Granata FormatCache::Entry::Entry (lldb::TypeFormatImplSP format_sp) :
3652b4b6cdSEnrico Granata m_summary_cached(false),
370b464d48SDaniel Malea m_synthetic_cached(false),
38*c582713cSEnrico Granata m_validator_cached(false),
3952b4b6cdSEnrico Granata m_summary_sp(),
40*c582713cSEnrico Granata m_synthetic_sp(),
41*c582713cSEnrico Granata m_validator_sp()
4252b4b6cdSEnrico Granata {
4352b4b6cdSEnrico Granata     SetFormat (format_sp);
4452b4b6cdSEnrico Granata }
4552b4b6cdSEnrico Granata 
4652b4b6cdSEnrico Granata FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp) :
4752b4b6cdSEnrico Granata m_format_cached(false),
4852b4b6cdSEnrico Granata m_synthetic_cached(false),
49*c582713cSEnrico Granata m_validator_cached(false),
5052b4b6cdSEnrico Granata m_format_sp(),
51*c582713cSEnrico Granata m_synthetic_sp(),
52*c582713cSEnrico Granata m_validator_sp()
535548cb50SEnrico Granata {
545548cb50SEnrico Granata     SetSummary (summary_sp);
555548cb50SEnrico Granata }
565548cb50SEnrico Granata 
570b464d48SDaniel Malea FormatCache::Entry::Entry (lldb::SyntheticChildrenSP synthetic_sp) :
5852b4b6cdSEnrico Granata m_format_cached(false),
590b464d48SDaniel Malea m_summary_cached(false),
60*c582713cSEnrico Granata m_validator_cached(false),
6152b4b6cdSEnrico Granata m_format_sp(),
62*c582713cSEnrico Granata m_summary_sp(),
63*c582713cSEnrico Granata m_validator_sp()
645548cb50SEnrico Granata {
655548cb50SEnrico Granata     SetSynthetic (synthetic_sp);
665548cb50SEnrico Granata }
675548cb50SEnrico Granata 
68*c582713cSEnrico Granata FormatCache::Entry::Entry (lldb::TypeValidatorImplSP validator_sp) :
69*c582713cSEnrico Granata m_format_cached(false),
70*c582713cSEnrico Granata m_summary_cached(false),
71*c582713cSEnrico Granata m_synthetic_cached(false),
72*c582713cSEnrico Granata m_format_sp(),
73*c582713cSEnrico Granata m_summary_sp(),
74*c582713cSEnrico Granata m_synthetic_sp()
75*c582713cSEnrico Granata {
76*c582713cSEnrico Granata     SetValidator (validator_sp);
77*c582713cSEnrico Granata }
78*c582713cSEnrico Granata 
79*c582713cSEnrico Granata FormatCache::Entry::Entry (lldb::TypeFormatImplSP format_sp, lldb::TypeSummaryImplSP summary_sp, lldb::SyntheticChildrenSP synthetic_sp, lldb::TypeValidatorImplSP validator_sp)
805548cb50SEnrico Granata {
8152b4b6cdSEnrico Granata     SetFormat (format_sp);
825548cb50SEnrico Granata     SetSummary (summary_sp);
835548cb50SEnrico Granata     SetSynthetic (synthetic_sp);
84*c582713cSEnrico Granata     SetValidator (validator_sp);
855548cb50SEnrico Granata }
865548cb50SEnrico Granata 
875548cb50SEnrico Granata bool
8852b4b6cdSEnrico Granata FormatCache::Entry::IsFormatCached ()
8952b4b6cdSEnrico Granata {
9052b4b6cdSEnrico Granata     return m_format_cached;
9152b4b6cdSEnrico Granata }
9252b4b6cdSEnrico Granata 
9352b4b6cdSEnrico Granata bool
945548cb50SEnrico Granata FormatCache::Entry::IsSummaryCached ()
955548cb50SEnrico Granata {
965548cb50SEnrico Granata     return m_summary_cached;
975548cb50SEnrico Granata }
985548cb50SEnrico Granata 
995548cb50SEnrico Granata bool
1005548cb50SEnrico Granata FormatCache::Entry::IsSyntheticCached ()
1015548cb50SEnrico Granata {
1025548cb50SEnrico Granata     return m_synthetic_cached;
1035548cb50SEnrico Granata }
1045548cb50SEnrico Granata 
105*c582713cSEnrico Granata bool
106*c582713cSEnrico Granata FormatCache::Entry::IsValidatorCached ()
107*c582713cSEnrico Granata {
108*c582713cSEnrico Granata     return m_validator_cached;
109*c582713cSEnrico Granata }
110*c582713cSEnrico Granata 
11152b4b6cdSEnrico Granata lldb::TypeFormatImplSP
11252b4b6cdSEnrico Granata FormatCache::Entry::GetFormat ()
11352b4b6cdSEnrico Granata {
11452b4b6cdSEnrico Granata     return m_format_sp;
11552b4b6cdSEnrico Granata }
11652b4b6cdSEnrico Granata 
1175548cb50SEnrico Granata lldb::TypeSummaryImplSP
1185548cb50SEnrico Granata FormatCache::Entry::GetSummary ()
1195548cb50SEnrico Granata {
1205548cb50SEnrico Granata     return m_summary_sp;
1215548cb50SEnrico Granata }
1225548cb50SEnrico Granata 
1235548cb50SEnrico Granata lldb::SyntheticChildrenSP
1245548cb50SEnrico Granata FormatCache::Entry::GetSynthetic ()
1255548cb50SEnrico Granata {
1265548cb50SEnrico Granata     return m_synthetic_sp;
1275548cb50SEnrico Granata }
1285548cb50SEnrico Granata 
129*c582713cSEnrico Granata lldb::TypeValidatorImplSP
130*c582713cSEnrico Granata FormatCache::Entry::GetValidator ()
131*c582713cSEnrico Granata {
132*c582713cSEnrico Granata     return m_validator_sp;
133*c582713cSEnrico Granata }
134*c582713cSEnrico Granata 
1355548cb50SEnrico Granata void
13652b4b6cdSEnrico Granata FormatCache::Entry::SetFormat (lldb::TypeFormatImplSP format_sp)
13752b4b6cdSEnrico Granata {
13852b4b6cdSEnrico Granata     m_format_cached = true;
13952b4b6cdSEnrico Granata     m_format_sp = format_sp;
14052b4b6cdSEnrico Granata }
14152b4b6cdSEnrico Granata 
14252b4b6cdSEnrico Granata void
1435548cb50SEnrico Granata FormatCache::Entry::SetSummary (lldb::TypeSummaryImplSP summary_sp)
1445548cb50SEnrico Granata {
1455548cb50SEnrico Granata     m_summary_cached = true;
1465548cb50SEnrico Granata     m_summary_sp = summary_sp;
1475548cb50SEnrico Granata }
1485548cb50SEnrico Granata 
1495548cb50SEnrico Granata void
1505548cb50SEnrico Granata FormatCache::Entry::SetSynthetic (lldb::SyntheticChildrenSP synthetic_sp)
1515548cb50SEnrico Granata {
1525548cb50SEnrico Granata     m_synthetic_cached = true;
1535548cb50SEnrico Granata     m_synthetic_sp = synthetic_sp;
1545548cb50SEnrico Granata }
1555548cb50SEnrico Granata 
156*c582713cSEnrico Granata void
157*c582713cSEnrico Granata FormatCache::Entry::SetValidator (lldb::TypeValidatorImplSP validator_sp)
158*c582713cSEnrico Granata {
159*c582713cSEnrico Granata     m_validator_cached = true;
160*c582713cSEnrico Granata     m_validator_sp = validator_sp;
161*c582713cSEnrico Granata }
162*c582713cSEnrico Granata 
1635548cb50SEnrico Granata FormatCache::FormatCache () :
1645548cb50SEnrico Granata m_map(),
1655548cb50SEnrico Granata m_mutex (Mutex::eMutexTypeRecursive)
1665548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1675548cb50SEnrico Granata ,m_cache_hits(0),m_cache_misses(0)
1685548cb50SEnrico Granata #endif
1695548cb50SEnrico Granata {
1705548cb50SEnrico Granata }
1715548cb50SEnrico Granata 
1725548cb50SEnrico Granata FormatCache::Entry&
1735548cb50SEnrico Granata FormatCache::GetEntry (const ConstString& type)
1745548cb50SEnrico Granata {
1755548cb50SEnrico Granata     auto i = m_map.find(type),
1765548cb50SEnrico Granata     e = m_map.end();
1775548cb50SEnrico Granata     if (i != e)
1785548cb50SEnrico Granata         return i->second;
1795548cb50SEnrico Granata     m_map[type] = FormatCache::Entry();
1805548cb50SEnrico Granata     return m_map[type];
1815548cb50SEnrico Granata }
1825548cb50SEnrico Granata 
1835548cb50SEnrico Granata bool
18452b4b6cdSEnrico Granata FormatCache::GetFormat (const ConstString& type,lldb::TypeFormatImplSP& format_sp)
18552b4b6cdSEnrico Granata {
18652b4b6cdSEnrico Granata     Mutex::Locker lock(m_mutex);
18752b4b6cdSEnrico Granata     auto entry = GetEntry(type);
18852b4b6cdSEnrico Granata     if (entry.IsSummaryCached())
18952b4b6cdSEnrico Granata     {
19052b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
19152b4b6cdSEnrico Granata         m_cache_hits++;
19252b4b6cdSEnrico Granata #endif
19352b4b6cdSEnrico Granata         format_sp = entry.GetFormat();
19452b4b6cdSEnrico Granata         return true;
19552b4b6cdSEnrico Granata     }
19652b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
19752b4b6cdSEnrico Granata     m_cache_misses++;
19852b4b6cdSEnrico Granata #endif
19952b4b6cdSEnrico Granata     format_sp.reset();
20052b4b6cdSEnrico Granata     return false;
20152b4b6cdSEnrico Granata }
20252b4b6cdSEnrico Granata 
20352b4b6cdSEnrico Granata bool
2045548cb50SEnrico Granata FormatCache::GetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
2055548cb50SEnrico Granata {
2065548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
2075548cb50SEnrico Granata     auto entry = GetEntry(type);
2085548cb50SEnrico Granata     if (entry.IsSummaryCached())
2095548cb50SEnrico Granata     {
2105548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
2115548cb50SEnrico Granata         m_cache_hits++;
2125548cb50SEnrico Granata #endif
2135548cb50SEnrico Granata         summary_sp = entry.GetSummary();
2145548cb50SEnrico Granata         return true;
2155548cb50SEnrico Granata     }
2165548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
2175548cb50SEnrico Granata     m_cache_misses++;
2185548cb50SEnrico Granata #endif
2195548cb50SEnrico Granata     summary_sp.reset();
2205548cb50SEnrico Granata     return false;
2215548cb50SEnrico Granata }
2225548cb50SEnrico Granata 
2235548cb50SEnrico Granata bool
2245548cb50SEnrico Granata FormatCache::GetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
2255548cb50SEnrico Granata {
2265548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
2275548cb50SEnrico Granata     auto entry = GetEntry(type);
2285548cb50SEnrico Granata     if (entry.IsSyntheticCached())
2295548cb50SEnrico Granata     {
2305548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
2315548cb50SEnrico Granata         m_cache_hits++;
2325548cb50SEnrico Granata #endif
2335548cb50SEnrico Granata         synthetic_sp = entry.GetSynthetic();
2345548cb50SEnrico Granata         return true;
2355548cb50SEnrico Granata     }
2365548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
2375548cb50SEnrico Granata     m_cache_misses++;
2385548cb50SEnrico Granata #endif
2395548cb50SEnrico Granata     synthetic_sp.reset();
2405548cb50SEnrico Granata     return false;
2415548cb50SEnrico Granata }
2425548cb50SEnrico Granata 
243*c582713cSEnrico Granata bool
244*c582713cSEnrico Granata FormatCache::GetValidator (const ConstString& type,lldb::TypeValidatorImplSP& validator_sp)
245*c582713cSEnrico Granata {
246*c582713cSEnrico Granata     Mutex::Locker lock(m_mutex);
247*c582713cSEnrico Granata     auto entry = GetEntry(type);
248*c582713cSEnrico Granata     if (entry.IsValidatorCached())
249*c582713cSEnrico Granata     {
250*c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
251*c582713cSEnrico Granata         m_cache_hits++;
252*c582713cSEnrico Granata #endif
253*c582713cSEnrico Granata         validator_sp = entry.GetValidator();
254*c582713cSEnrico Granata         return true;
255*c582713cSEnrico Granata     }
256*c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
257*c582713cSEnrico Granata     m_cache_misses++;
258*c582713cSEnrico Granata #endif
259*c582713cSEnrico Granata     validator_sp.reset();
260*c582713cSEnrico Granata     return false;
261*c582713cSEnrico Granata }
262*c582713cSEnrico Granata 
2635548cb50SEnrico Granata void
26452b4b6cdSEnrico Granata FormatCache::SetFormat (const ConstString& type,lldb::TypeFormatImplSP& format_sp)
26552b4b6cdSEnrico Granata {
26652b4b6cdSEnrico Granata     Mutex::Locker lock(m_mutex);
26752b4b6cdSEnrico Granata     GetEntry(type).SetFormat(format_sp);
26852b4b6cdSEnrico Granata }
26952b4b6cdSEnrico Granata 
27052b4b6cdSEnrico Granata void
2715548cb50SEnrico Granata FormatCache::SetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
2725548cb50SEnrico Granata {
2735548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
2745548cb50SEnrico Granata     GetEntry(type).SetSummary(summary_sp);
2755548cb50SEnrico Granata }
2765548cb50SEnrico Granata 
2775548cb50SEnrico Granata void
2785548cb50SEnrico Granata FormatCache::SetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
2795548cb50SEnrico Granata {
2805548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
2815548cb50SEnrico Granata     GetEntry(type).SetSynthetic(synthetic_sp);
2825548cb50SEnrico Granata }
2835548cb50SEnrico Granata 
2845548cb50SEnrico Granata void
285*c582713cSEnrico Granata FormatCache::SetValidator (const ConstString& type,lldb::TypeValidatorImplSP& validator_sp)
286*c582713cSEnrico Granata {
287*c582713cSEnrico Granata     Mutex::Locker lock(m_mutex);
288*c582713cSEnrico Granata     GetEntry(type).SetValidator(validator_sp);
289*c582713cSEnrico Granata }
290*c582713cSEnrico Granata 
291*c582713cSEnrico Granata void
2925548cb50SEnrico Granata FormatCache::Clear ()
2935548cb50SEnrico Granata {
2945548cb50SEnrico Granata     Mutex::Locker lock(m_mutex);
2955548cb50SEnrico Granata     m_map.clear();
2965548cb50SEnrico Granata }
2975548cb50SEnrico Granata 
298