1*b9c1b51eSKate Stone //===-- FormatCache.cpp ------------------------------------------*- C++
2*b9c1b51eSKate Stone //-*-===//
35548cb50SEnrico Granata //
45548cb50SEnrico Granata //                     The LLVM Compiler Infrastructure
55548cb50SEnrico Granata //
65548cb50SEnrico Granata // This file is distributed under the University of Illinois Open Source
75548cb50SEnrico Granata // License. See LICENSE.TXT for details.
85548cb50SEnrico Granata //
95548cb50SEnrico Granata //===----------------------------------------------------------------------===//
105548cb50SEnrico Granata 
115548cb50SEnrico Granata // C Includes
125548cb50SEnrico Granata 
135548cb50SEnrico Granata // C++ Includes
145548cb50SEnrico Granata 
155548cb50SEnrico Granata // Other libraries and framework includes
165548cb50SEnrico Granata 
175548cb50SEnrico Granata // Project includes
185548cb50SEnrico Granata #include "lldb/DataFormatters/FormatCache.h"
195548cb50SEnrico Granata 
205548cb50SEnrico Granata using namespace lldb;
215548cb50SEnrico Granata using namespace lldb_private;
225548cb50SEnrico Granata 
23*b9c1b51eSKate Stone FormatCache::Entry::Entry()
24*b9c1b51eSKate Stone     : m_format_cached(false), m_summary_cached(false),
25*b9c1b51eSKate Stone       m_synthetic_cached(false), m_validator_cached(false), m_format_sp(),
26*b9c1b51eSKate Stone       m_summary_sp(), m_synthetic_sp(), m_validator_sp() {}
275548cb50SEnrico Granata 
28*b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeFormatImplSP format_sp)
29*b9c1b51eSKate Stone     : m_summary_cached(false), m_synthetic_cached(false),
30*b9c1b51eSKate Stone       m_validator_cached(false), m_summary_sp(), m_synthetic_sp(),
31*b9c1b51eSKate Stone       m_validator_sp() {
3252b4b6cdSEnrico Granata   SetFormat(format_sp);
3352b4b6cdSEnrico Granata }
3452b4b6cdSEnrico Granata 
35*b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeSummaryImplSP summary_sp)
36*b9c1b51eSKate Stone     : m_format_cached(false), m_synthetic_cached(false),
37*b9c1b51eSKate Stone       m_validator_cached(false), m_format_sp(), m_synthetic_sp(),
38*b9c1b51eSKate Stone       m_validator_sp() {
395548cb50SEnrico Granata   SetSummary(summary_sp);
405548cb50SEnrico Granata }
415548cb50SEnrico Granata 
42*b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::SyntheticChildrenSP synthetic_sp)
43*b9c1b51eSKate Stone     : m_format_cached(false), m_summary_cached(false),
44*b9c1b51eSKate Stone       m_validator_cached(false), m_format_sp(), m_summary_sp(),
45*b9c1b51eSKate Stone       m_validator_sp() {
465548cb50SEnrico Granata   SetSynthetic(synthetic_sp);
475548cb50SEnrico Granata }
485548cb50SEnrico Granata 
49*b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeValidatorImplSP validator_sp)
50*b9c1b51eSKate Stone     : m_format_cached(false), m_summary_cached(false),
51*b9c1b51eSKate Stone       m_synthetic_cached(false), m_format_sp(), m_summary_sp(),
52*b9c1b51eSKate Stone       m_synthetic_sp() {
53c582713cSEnrico Granata   SetValidator(validator_sp);
54c582713cSEnrico Granata }
55c582713cSEnrico Granata 
56*b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeFormatImplSP format_sp,
57*b9c1b51eSKate Stone                           lldb::TypeSummaryImplSP summary_sp,
58*b9c1b51eSKate Stone                           lldb::SyntheticChildrenSP synthetic_sp,
59*b9c1b51eSKate Stone                           lldb::TypeValidatorImplSP validator_sp) {
6052b4b6cdSEnrico Granata   SetFormat(format_sp);
615548cb50SEnrico Granata   SetSummary(summary_sp);
625548cb50SEnrico Granata   SetSynthetic(synthetic_sp);
63c582713cSEnrico Granata   SetValidator(validator_sp);
645548cb50SEnrico Granata }
655548cb50SEnrico Granata 
66*b9c1b51eSKate Stone bool FormatCache::Entry::IsFormatCached() { return m_format_cached; }
6752b4b6cdSEnrico Granata 
68*b9c1b51eSKate Stone bool FormatCache::Entry::IsSummaryCached() { return m_summary_cached; }
695548cb50SEnrico Granata 
70*b9c1b51eSKate Stone bool FormatCache::Entry::IsSyntheticCached() { return m_synthetic_cached; }
715548cb50SEnrico Granata 
72*b9c1b51eSKate Stone bool FormatCache::Entry::IsValidatorCached() { return m_validator_cached; }
73c582713cSEnrico Granata 
74*b9c1b51eSKate Stone lldb::TypeFormatImplSP FormatCache::Entry::GetFormat() { return m_format_sp; }
7552b4b6cdSEnrico Granata 
76*b9c1b51eSKate Stone lldb::TypeSummaryImplSP FormatCache::Entry::GetSummary() {
775548cb50SEnrico Granata   return m_summary_sp;
785548cb50SEnrico Granata }
795548cb50SEnrico Granata 
80*b9c1b51eSKate Stone lldb::SyntheticChildrenSP FormatCache::Entry::GetSynthetic() {
815548cb50SEnrico Granata   return m_synthetic_sp;
825548cb50SEnrico Granata }
835548cb50SEnrico Granata 
84*b9c1b51eSKate Stone lldb::TypeValidatorImplSP FormatCache::Entry::GetValidator() {
85c582713cSEnrico Granata   return m_validator_sp;
86c582713cSEnrico Granata }
87c582713cSEnrico Granata 
88*b9c1b51eSKate Stone void FormatCache::Entry::SetFormat(lldb::TypeFormatImplSP format_sp) {
8952b4b6cdSEnrico Granata   m_format_cached = true;
9052b4b6cdSEnrico Granata   m_format_sp = format_sp;
9152b4b6cdSEnrico Granata }
9252b4b6cdSEnrico Granata 
93*b9c1b51eSKate Stone void FormatCache::Entry::SetSummary(lldb::TypeSummaryImplSP summary_sp) {
945548cb50SEnrico Granata   m_summary_cached = true;
955548cb50SEnrico Granata   m_summary_sp = summary_sp;
965548cb50SEnrico Granata }
975548cb50SEnrico Granata 
98*b9c1b51eSKate Stone void FormatCache::Entry::SetSynthetic(lldb::SyntheticChildrenSP synthetic_sp) {
995548cb50SEnrico Granata   m_synthetic_cached = true;
1005548cb50SEnrico Granata   m_synthetic_sp = synthetic_sp;
1015548cb50SEnrico Granata }
1025548cb50SEnrico Granata 
103*b9c1b51eSKate Stone void FormatCache::Entry::SetValidator(lldb::TypeValidatorImplSP validator_sp) {
104c582713cSEnrico Granata   m_validator_cached = true;
105c582713cSEnrico Granata   m_validator_sp = validator_sp;
106c582713cSEnrico Granata }
107c582713cSEnrico Granata 
10816ff8604SSaleem Abdulrasool FormatCache::FormatCache()
109*b9c1b51eSKate Stone     : m_map(), m_mutex()
1105548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
11116ff8604SSaleem Abdulrasool       ,
112*b9c1b51eSKate Stone       m_cache_hits(0), m_cache_misses(0)
1135548cb50SEnrico Granata #endif
1145548cb50SEnrico Granata {
1155548cb50SEnrico Granata }
1165548cb50SEnrico Granata 
117*b9c1b51eSKate Stone FormatCache::Entry &FormatCache::GetEntry(const ConstString &type) {
118*b9c1b51eSKate Stone   auto i = m_map.find(type), e = m_map.end();
1195548cb50SEnrico Granata   if (i != e)
1205548cb50SEnrico Granata     return i->second;
1215548cb50SEnrico Granata   m_map[type] = FormatCache::Entry();
1225548cb50SEnrico Granata   return m_map[type];
1235548cb50SEnrico Granata }
1245548cb50SEnrico Granata 
125*b9c1b51eSKate Stone bool FormatCache::GetFormat(const ConstString &type,
126*b9c1b51eSKate Stone                             lldb::TypeFormatImplSP &format_sp) {
12716ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
12852b4b6cdSEnrico Granata   auto entry = GetEntry(type);
129*b9c1b51eSKate Stone   if (entry.IsFormatCached()) {
13052b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
13152b4b6cdSEnrico Granata     m_cache_hits++;
13252b4b6cdSEnrico Granata #endif
13352b4b6cdSEnrico Granata     format_sp = entry.GetFormat();
13452b4b6cdSEnrico Granata     return true;
13552b4b6cdSEnrico Granata   }
13652b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
13752b4b6cdSEnrico Granata   m_cache_misses++;
13852b4b6cdSEnrico Granata #endif
13952b4b6cdSEnrico Granata   format_sp.reset();
14052b4b6cdSEnrico Granata   return false;
14152b4b6cdSEnrico Granata }
14252b4b6cdSEnrico Granata 
143*b9c1b51eSKate Stone bool FormatCache::GetSummary(const ConstString &type,
144*b9c1b51eSKate Stone                              lldb::TypeSummaryImplSP &summary_sp) {
14516ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
1465548cb50SEnrico Granata   auto entry = GetEntry(type);
147*b9c1b51eSKate Stone   if (entry.IsSummaryCached()) {
1485548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1495548cb50SEnrico Granata     m_cache_hits++;
1505548cb50SEnrico Granata #endif
1515548cb50SEnrico Granata     summary_sp = entry.GetSummary();
1525548cb50SEnrico Granata     return true;
1535548cb50SEnrico Granata   }
1545548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1555548cb50SEnrico Granata   m_cache_misses++;
1565548cb50SEnrico Granata #endif
1575548cb50SEnrico Granata   summary_sp.reset();
1585548cb50SEnrico Granata   return false;
1595548cb50SEnrico Granata }
1605548cb50SEnrico Granata 
161*b9c1b51eSKate Stone bool FormatCache::GetSynthetic(const ConstString &type,
162*b9c1b51eSKate Stone                                lldb::SyntheticChildrenSP &synthetic_sp) {
16316ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
1645548cb50SEnrico Granata   auto entry = GetEntry(type);
165*b9c1b51eSKate Stone   if (entry.IsSyntheticCached()) {
1665548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1675548cb50SEnrico Granata     m_cache_hits++;
1685548cb50SEnrico Granata #endif
1695548cb50SEnrico Granata     synthetic_sp = entry.GetSynthetic();
1705548cb50SEnrico Granata     return true;
1715548cb50SEnrico Granata   }
1725548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1735548cb50SEnrico Granata   m_cache_misses++;
1745548cb50SEnrico Granata #endif
1755548cb50SEnrico Granata   synthetic_sp.reset();
1765548cb50SEnrico Granata   return false;
1775548cb50SEnrico Granata }
1785548cb50SEnrico Granata 
179*b9c1b51eSKate Stone bool FormatCache::GetValidator(const ConstString &type,
180*b9c1b51eSKate Stone                                lldb::TypeValidatorImplSP &validator_sp) {
18116ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
182c582713cSEnrico Granata   auto entry = GetEntry(type);
183*b9c1b51eSKate Stone   if (entry.IsValidatorCached()) {
184c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
185c582713cSEnrico Granata     m_cache_hits++;
186c582713cSEnrico Granata #endif
187c582713cSEnrico Granata     validator_sp = entry.GetValidator();
188c582713cSEnrico Granata     return true;
189c582713cSEnrico Granata   }
190c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
191c582713cSEnrico Granata   m_cache_misses++;
192c582713cSEnrico Granata #endif
193c582713cSEnrico Granata   validator_sp.reset();
194c582713cSEnrico Granata   return false;
195c582713cSEnrico Granata }
196c582713cSEnrico Granata 
197*b9c1b51eSKate Stone void FormatCache::SetFormat(const ConstString &type,
198*b9c1b51eSKate Stone                             lldb::TypeFormatImplSP &format_sp) {
19916ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
20052b4b6cdSEnrico Granata   GetEntry(type).SetFormat(format_sp);
20152b4b6cdSEnrico Granata }
20252b4b6cdSEnrico Granata 
203*b9c1b51eSKate Stone void FormatCache::SetSummary(const ConstString &type,
204*b9c1b51eSKate Stone                              lldb::TypeSummaryImplSP &summary_sp) {
20516ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
2065548cb50SEnrico Granata   GetEntry(type).SetSummary(summary_sp);
2075548cb50SEnrico Granata }
2085548cb50SEnrico Granata 
209*b9c1b51eSKate Stone void FormatCache::SetSynthetic(const ConstString &type,
210*b9c1b51eSKate Stone                                lldb::SyntheticChildrenSP &synthetic_sp) {
21116ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
2125548cb50SEnrico Granata   GetEntry(type).SetSynthetic(synthetic_sp);
2135548cb50SEnrico Granata }
2145548cb50SEnrico Granata 
215*b9c1b51eSKate Stone void FormatCache::SetValidator(const ConstString &type,
216*b9c1b51eSKate Stone                                lldb::TypeValidatorImplSP &validator_sp) {
21716ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
218c582713cSEnrico Granata   GetEntry(type).SetValidator(validator_sp);
219c582713cSEnrico Granata }
220c582713cSEnrico Granata 
221*b9c1b51eSKate Stone void FormatCache::Clear() {
22216ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
2235548cb50SEnrico Granata   m_map.clear();
2245548cb50SEnrico Granata }
225