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 
105548cb50SEnrico Granata // C Includes
115548cb50SEnrico Granata 
125548cb50SEnrico Granata // C++ Includes
135548cb50SEnrico Granata 
145548cb50SEnrico Granata // Other libraries and framework includes
155548cb50SEnrico Granata 
165548cb50SEnrico Granata // Project includes
175548cb50SEnrico Granata #include "lldb/DataFormatters/FormatCache.h"
185548cb50SEnrico Granata 
195548cb50SEnrico Granata using namespace lldb;
205548cb50SEnrico Granata using namespace lldb_private;
215548cb50SEnrico Granata 
225548cb50SEnrico Granata FormatCache::Entry::Entry () :
2352b4b6cdSEnrico Granata m_format_cached(false),
245548cb50SEnrico Granata m_summary_cached(false),
255548cb50SEnrico Granata m_synthetic_cached(false),
26c582713cSEnrico Granata m_validator_cached(false),
2752b4b6cdSEnrico Granata m_format_sp(),
2830b95a36SDaniel Malea m_summary_sp(),
29c582713cSEnrico Granata m_synthetic_sp(),
30c582713cSEnrico Granata m_validator_sp()
315548cb50SEnrico Granata {}
325548cb50SEnrico Granata 
3352b4b6cdSEnrico Granata FormatCache::Entry::Entry (lldb::TypeFormatImplSP format_sp) :
3452b4b6cdSEnrico Granata m_summary_cached(false),
350b464d48SDaniel Malea m_synthetic_cached(false),
36c582713cSEnrico Granata m_validator_cached(false),
3752b4b6cdSEnrico Granata m_summary_sp(),
38c582713cSEnrico Granata m_synthetic_sp(),
39c582713cSEnrico Granata m_validator_sp()
4052b4b6cdSEnrico Granata {
4152b4b6cdSEnrico Granata     SetFormat (format_sp);
4252b4b6cdSEnrico Granata }
4352b4b6cdSEnrico Granata 
4452b4b6cdSEnrico Granata FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp) :
4552b4b6cdSEnrico Granata m_format_cached(false),
4652b4b6cdSEnrico Granata m_synthetic_cached(false),
47c582713cSEnrico Granata m_validator_cached(false),
4852b4b6cdSEnrico Granata m_format_sp(),
49c582713cSEnrico Granata m_synthetic_sp(),
50c582713cSEnrico Granata m_validator_sp()
515548cb50SEnrico Granata {
525548cb50SEnrico Granata     SetSummary (summary_sp);
535548cb50SEnrico Granata }
545548cb50SEnrico Granata 
550b464d48SDaniel Malea FormatCache::Entry::Entry (lldb::SyntheticChildrenSP synthetic_sp) :
5652b4b6cdSEnrico Granata m_format_cached(false),
570b464d48SDaniel Malea m_summary_cached(false),
58c582713cSEnrico Granata m_validator_cached(false),
5952b4b6cdSEnrico Granata m_format_sp(),
60c582713cSEnrico Granata m_summary_sp(),
61c582713cSEnrico Granata m_validator_sp()
625548cb50SEnrico Granata {
635548cb50SEnrico Granata     SetSynthetic (synthetic_sp);
645548cb50SEnrico Granata }
655548cb50SEnrico Granata 
66c582713cSEnrico Granata FormatCache::Entry::Entry (lldb::TypeValidatorImplSP validator_sp) :
67c582713cSEnrico Granata m_format_cached(false),
68c582713cSEnrico Granata m_summary_cached(false),
69c582713cSEnrico Granata m_synthetic_cached(false),
70c582713cSEnrico Granata m_format_sp(),
71c582713cSEnrico Granata m_summary_sp(),
72c582713cSEnrico Granata m_synthetic_sp()
73c582713cSEnrico Granata {
74c582713cSEnrico Granata     SetValidator (validator_sp);
75c582713cSEnrico Granata }
76c582713cSEnrico Granata 
77c582713cSEnrico Granata FormatCache::Entry::Entry (lldb::TypeFormatImplSP format_sp, lldb::TypeSummaryImplSP summary_sp, lldb::SyntheticChildrenSP synthetic_sp, lldb::TypeValidatorImplSP validator_sp)
785548cb50SEnrico Granata {
7952b4b6cdSEnrico Granata     SetFormat (format_sp);
805548cb50SEnrico Granata     SetSummary (summary_sp);
815548cb50SEnrico Granata     SetSynthetic (synthetic_sp);
82c582713cSEnrico Granata     SetValidator (validator_sp);
835548cb50SEnrico Granata }
845548cb50SEnrico Granata 
855548cb50SEnrico Granata bool
8652b4b6cdSEnrico Granata FormatCache::Entry::IsFormatCached ()
8752b4b6cdSEnrico Granata {
8852b4b6cdSEnrico Granata     return m_format_cached;
8952b4b6cdSEnrico Granata }
9052b4b6cdSEnrico Granata 
9152b4b6cdSEnrico Granata bool
925548cb50SEnrico Granata FormatCache::Entry::IsSummaryCached ()
935548cb50SEnrico Granata {
945548cb50SEnrico Granata     return m_summary_cached;
955548cb50SEnrico Granata }
965548cb50SEnrico Granata 
975548cb50SEnrico Granata bool
985548cb50SEnrico Granata FormatCache::Entry::IsSyntheticCached ()
995548cb50SEnrico Granata {
1005548cb50SEnrico Granata     return m_synthetic_cached;
1015548cb50SEnrico Granata }
1025548cb50SEnrico Granata 
103c582713cSEnrico Granata bool
104c582713cSEnrico Granata FormatCache::Entry::IsValidatorCached ()
105c582713cSEnrico Granata {
106c582713cSEnrico Granata     return m_validator_cached;
107c582713cSEnrico Granata }
108c582713cSEnrico Granata 
10952b4b6cdSEnrico Granata lldb::TypeFormatImplSP
11052b4b6cdSEnrico Granata FormatCache::Entry::GetFormat ()
11152b4b6cdSEnrico Granata {
11252b4b6cdSEnrico Granata     return m_format_sp;
11352b4b6cdSEnrico Granata }
11452b4b6cdSEnrico Granata 
1155548cb50SEnrico Granata lldb::TypeSummaryImplSP
1165548cb50SEnrico Granata FormatCache::Entry::GetSummary ()
1175548cb50SEnrico Granata {
1185548cb50SEnrico Granata     return m_summary_sp;
1195548cb50SEnrico Granata }
1205548cb50SEnrico Granata 
1215548cb50SEnrico Granata lldb::SyntheticChildrenSP
1225548cb50SEnrico Granata FormatCache::Entry::GetSynthetic ()
1235548cb50SEnrico Granata {
1245548cb50SEnrico Granata     return m_synthetic_sp;
1255548cb50SEnrico Granata }
1265548cb50SEnrico Granata 
127c582713cSEnrico Granata lldb::TypeValidatorImplSP
128c582713cSEnrico Granata FormatCache::Entry::GetValidator ()
129c582713cSEnrico Granata {
130c582713cSEnrico Granata     return m_validator_sp;
131c582713cSEnrico Granata }
132c582713cSEnrico Granata 
1335548cb50SEnrico Granata void
13452b4b6cdSEnrico Granata FormatCache::Entry::SetFormat (lldb::TypeFormatImplSP format_sp)
13552b4b6cdSEnrico Granata {
13652b4b6cdSEnrico Granata     m_format_cached = true;
13752b4b6cdSEnrico Granata     m_format_sp = format_sp;
13852b4b6cdSEnrico Granata }
13952b4b6cdSEnrico Granata 
14052b4b6cdSEnrico Granata void
1415548cb50SEnrico Granata FormatCache::Entry::SetSummary (lldb::TypeSummaryImplSP summary_sp)
1425548cb50SEnrico Granata {
1435548cb50SEnrico Granata     m_summary_cached = true;
1445548cb50SEnrico Granata     m_summary_sp = summary_sp;
1455548cb50SEnrico Granata }
1465548cb50SEnrico Granata 
1475548cb50SEnrico Granata void
1485548cb50SEnrico Granata FormatCache::Entry::SetSynthetic (lldb::SyntheticChildrenSP synthetic_sp)
1495548cb50SEnrico Granata {
1505548cb50SEnrico Granata     m_synthetic_cached = true;
1515548cb50SEnrico Granata     m_synthetic_sp = synthetic_sp;
1525548cb50SEnrico Granata }
1535548cb50SEnrico Granata 
154c582713cSEnrico Granata void
155c582713cSEnrico Granata FormatCache::Entry::SetValidator (lldb::TypeValidatorImplSP validator_sp)
156c582713cSEnrico Granata {
157c582713cSEnrico Granata     m_validator_cached = true;
158c582713cSEnrico Granata     m_validator_sp = validator_sp;
159c582713cSEnrico Granata }
160c582713cSEnrico Granata 
161*16ff8604SSaleem Abdulrasool FormatCache::FormatCache()
162*16ff8604SSaleem Abdulrasool     : m_map(),
163*16ff8604SSaleem Abdulrasool       m_mutex()
1645548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
165*16ff8604SSaleem Abdulrasool       ,
166*16ff8604SSaleem Abdulrasool       m_cache_hits(0),
167*16ff8604SSaleem Abdulrasool       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 {
186*16ff8604SSaleem Abdulrasool     std::lock_guard<std::recursive_mutex> guard(m_mutex);
18752b4b6cdSEnrico Granata     auto entry = GetEntry(type);
188c525d3d4SEnrico Granata     if (entry.IsFormatCached())
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 {
206*16ff8604SSaleem Abdulrasool     std::lock_guard<std::recursive_mutex> guard(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 {
226*16ff8604SSaleem Abdulrasool     std::lock_guard<std::recursive_mutex> guard(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 
243c582713cSEnrico Granata bool
244c582713cSEnrico Granata FormatCache::GetValidator (const ConstString& type,lldb::TypeValidatorImplSP& validator_sp)
245c582713cSEnrico Granata {
246*16ff8604SSaleem Abdulrasool     std::lock_guard<std::recursive_mutex> guard(m_mutex);
247c582713cSEnrico Granata     auto entry = GetEntry(type);
248c582713cSEnrico Granata     if (entry.IsValidatorCached())
249c582713cSEnrico Granata     {
250c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
251c582713cSEnrico Granata         m_cache_hits++;
252c582713cSEnrico Granata #endif
253c582713cSEnrico Granata         validator_sp = entry.GetValidator();
254c582713cSEnrico Granata         return true;
255c582713cSEnrico Granata     }
256c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
257c582713cSEnrico Granata     m_cache_misses++;
258c582713cSEnrico Granata #endif
259c582713cSEnrico Granata     validator_sp.reset();
260c582713cSEnrico Granata     return false;
261c582713cSEnrico Granata }
262c582713cSEnrico Granata 
2635548cb50SEnrico Granata void
26452b4b6cdSEnrico Granata FormatCache::SetFormat (const ConstString& type,lldb::TypeFormatImplSP& format_sp)
26552b4b6cdSEnrico Granata {
266*16ff8604SSaleem Abdulrasool     std::lock_guard<std::recursive_mutex> guard(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 {
273*16ff8604SSaleem Abdulrasool     std::lock_guard<std::recursive_mutex> guard(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 {
280*16ff8604SSaleem Abdulrasool     std::lock_guard<std::recursive_mutex> guard(m_mutex);
2815548cb50SEnrico Granata     GetEntry(type).SetSynthetic(synthetic_sp);
2825548cb50SEnrico Granata }
2835548cb50SEnrico Granata 
2845548cb50SEnrico Granata void
285c582713cSEnrico Granata FormatCache::SetValidator (const ConstString& type,lldb::TypeValidatorImplSP& validator_sp)
286c582713cSEnrico Granata {
287*16ff8604SSaleem Abdulrasool     std::lock_guard<std::recursive_mutex> guard(m_mutex);
288c582713cSEnrico Granata     GetEntry(type).SetValidator(validator_sp);
289c582713cSEnrico Granata }
290c582713cSEnrico Granata 
291c582713cSEnrico Granata void
2925548cb50SEnrico Granata FormatCache::Clear ()
2935548cb50SEnrico Granata {
294*16ff8604SSaleem Abdulrasool     std::lock_guard<std::recursive_mutex> guard(m_mutex);
2955548cb50SEnrico Granata     m_map.clear();
2965548cb50SEnrico Granata }
2975548cb50SEnrico Granata 
298