1b9c1b51eSKate Stone //===-- FormatCache.cpp ------------------------------------------*- C++
2b9c1b51eSKate Stone //-*-===//
35548cb50SEnrico Granata //
4*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
6*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
75548cb50SEnrico Granata //
85548cb50SEnrico Granata //===----------------------------------------------------------------------===//
95548cb50SEnrico Granata 
105548cb50SEnrico Granata 
115548cb50SEnrico Granata 
125548cb50SEnrico Granata 
135548cb50SEnrico Granata #include "lldb/DataFormatters/FormatCache.h"
145548cb50SEnrico Granata 
155548cb50SEnrico Granata using namespace lldb;
165548cb50SEnrico Granata using namespace lldb_private;
175548cb50SEnrico Granata 
18b9c1b51eSKate Stone FormatCache::Entry::Entry()
19b9c1b51eSKate Stone     : m_format_cached(false), m_summary_cached(false),
20b9c1b51eSKate Stone       m_synthetic_cached(false), m_validator_cached(false), m_format_sp(),
21b9c1b51eSKate Stone       m_summary_sp(), m_synthetic_sp(), m_validator_sp() {}
225548cb50SEnrico Granata 
23b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeFormatImplSP format_sp)
24b9c1b51eSKate Stone     : m_summary_cached(false), m_synthetic_cached(false),
25b9c1b51eSKate Stone       m_validator_cached(false), m_summary_sp(), m_synthetic_sp(),
26b9c1b51eSKate Stone       m_validator_sp() {
2752b4b6cdSEnrico Granata   SetFormat(format_sp);
2852b4b6cdSEnrico Granata }
2952b4b6cdSEnrico Granata 
30b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeSummaryImplSP summary_sp)
31b9c1b51eSKate Stone     : m_format_cached(false), m_synthetic_cached(false),
32b9c1b51eSKate Stone       m_validator_cached(false), m_format_sp(), m_synthetic_sp(),
33b9c1b51eSKate Stone       m_validator_sp() {
345548cb50SEnrico Granata   SetSummary(summary_sp);
355548cb50SEnrico Granata }
365548cb50SEnrico Granata 
37b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::SyntheticChildrenSP synthetic_sp)
38b9c1b51eSKate Stone     : m_format_cached(false), m_summary_cached(false),
39b9c1b51eSKate Stone       m_validator_cached(false), m_format_sp(), m_summary_sp(),
40b9c1b51eSKate Stone       m_validator_sp() {
415548cb50SEnrico Granata   SetSynthetic(synthetic_sp);
425548cb50SEnrico Granata }
435548cb50SEnrico Granata 
44b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeValidatorImplSP validator_sp)
45b9c1b51eSKate Stone     : m_format_cached(false), m_summary_cached(false),
46b9c1b51eSKate Stone       m_synthetic_cached(false), m_format_sp(), m_summary_sp(),
47b9c1b51eSKate Stone       m_synthetic_sp() {
48c582713cSEnrico Granata   SetValidator(validator_sp);
49c582713cSEnrico Granata }
50c582713cSEnrico Granata 
51b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeFormatImplSP format_sp,
52b9c1b51eSKate Stone                           lldb::TypeSummaryImplSP summary_sp,
53b9c1b51eSKate Stone                           lldb::SyntheticChildrenSP synthetic_sp,
54b9c1b51eSKate Stone                           lldb::TypeValidatorImplSP validator_sp) {
5552b4b6cdSEnrico Granata   SetFormat(format_sp);
565548cb50SEnrico Granata   SetSummary(summary_sp);
575548cb50SEnrico Granata   SetSynthetic(synthetic_sp);
58c582713cSEnrico Granata   SetValidator(validator_sp);
595548cb50SEnrico Granata }
605548cb50SEnrico Granata 
61b9c1b51eSKate Stone bool FormatCache::Entry::IsFormatCached() { return m_format_cached; }
6252b4b6cdSEnrico Granata 
63b9c1b51eSKate Stone bool FormatCache::Entry::IsSummaryCached() { return m_summary_cached; }
645548cb50SEnrico Granata 
65b9c1b51eSKate Stone bool FormatCache::Entry::IsSyntheticCached() { return m_synthetic_cached; }
665548cb50SEnrico Granata 
67b9c1b51eSKate Stone bool FormatCache::Entry::IsValidatorCached() { return m_validator_cached; }
68c582713cSEnrico Granata 
69b9c1b51eSKate Stone lldb::TypeFormatImplSP FormatCache::Entry::GetFormat() { return m_format_sp; }
7052b4b6cdSEnrico Granata 
71b9c1b51eSKate Stone lldb::TypeSummaryImplSP FormatCache::Entry::GetSummary() {
725548cb50SEnrico Granata   return m_summary_sp;
735548cb50SEnrico Granata }
745548cb50SEnrico Granata 
75b9c1b51eSKate Stone lldb::SyntheticChildrenSP FormatCache::Entry::GetSynthetic() {
765548cb50SEnrico Granata   return m_synthetic_sp;
775548cb50SEnrico Granata }
785548cb50SEnrico Granata 
79b9c1b51eSKate Stone lldb::TypeValidatorImplSP FormatCache::Entry::GetValidator() {
80c582713cSEnrico Granata   return m_validator_sp;
81c582713cSEnrico Granata }
82c582713cSEnrico Granata 
83b9c1b51eSKate Stone void FormatCache::Entry::SetFormat(lldb::TypeFormatImplSP format_sp) {
8452b4b6cdSEnrico Granata   m_format_cached = true;
8552b4b6cdSEnrico Granata   m_format_sp = format_sp;
8652b4b6cdSEnrico Granata }
8752b4b6cdSEnrico Granata 
88b9c1b51eSKate Stone void FormatCache::Entry::SetSummary(lldb::TypeSummaryImplSP summary_sp) {
895548cb50SEnrico Granata   m_summary_cached = true;
905548cb50SEnrico Granata   m_summary_sp = summary_sp;
915548cb50SEnrico Granata }
925548cb50SEnrico Granata 
93b9c1b51eSKate Stone void FormatCache::Entry::SetSynthetic(lldb::SyntheticChildrenSP synthetic_sp) {
945548cb50SEnrico Granata   m_synthetic_cached = true;
955548cb50SEnrico Granata   m_synthetic_sp = synthetic_sp;
965548cb50SEnrico Granata }
975548cb50SEnrico Granata 
98b9c1b51eSKate Stone void FormatCache::Entry::SetValidator(lldb::TypeValidatorImplSP validator_sp) {
99c582713cSEnrico Granata   m_validator_cached = true;
100c582713cSEnrico Granata   m_validator_sp = validator_sp;
101c582713cSEnrico Granata }
102c582713cSEnrico Granata 
10316ff8604SSaleem Abdulrasool FormatCache::FormatCache()
104b9c1b51eSKate Stone     : m_map(), m_mutex()
1055548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
10616ff8604SSaleem Abdulrasool       ,
107b9c1b51eSKate Stone       m_cache_hits(0), m_cache_misses(0)
1085548cb50SEnrico Granata #endif
1095548cb50SEnrico Granata {
1105548cb50SEnrico Granata }
1115548cb50SEnrico Granata 
112b9c1b51eSKate Stone FormatCache::Entry &FormatCache::GetEntry(const ConstString &type) {
113b9c1b51eSKate Stone   auto i = m_map.find(type), e = m_map.end();
1145548cb50SEnrico Granata   if (i != e)
1155548cb50SEnrico Granata     return i->second;
1165548cb50SEnrico Granata   m_map[type] = FormatCache::Entry();
1175548cb50SEnrico Granata   return m_map[type];
1185548cb50SEnrico Granata }
1195548cb50SEnrico Granata 
120b9c1b51eSKate Stone bool FormatCache::GetFormat(const ConstString &type,
121b9c1b51eSKate Stone                             lldb::TypeFormatImplSP &format_sp) {
12216ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
12352b4b6cdSEnrico Granata   auto entry = GetEntry(type);
124b9c1b51eSKate Stone   if (entry.IsFormatCached()) {
12552b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
12652b4b6cdSEnrico Granata     m_cache_hits++;
12752b4b6cdSEnrico Granata #endif
12852b4b6cdSEnrico Granata     format_sp = entry.GetFormat();
12952b4b6cdSEnrico Granata     return true;
13052b4b6cdSEnrico Granata   }
13152b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
13252b4b6cdSEnrico Granata   m_cache_misses++;
13352b4b6cdSEnrico Granata #endif
13452b4b6cdSEnrico Granata   format_sp.reset();
13552b4b6cdSEnrico Granata   return false;
13652b4b6cdSEnrico Granata }
13752b4b6cdSEnrico Granata 
138b9c1b51eSKate Stone bool FormatCache::GetSummary(const ConstString &type,
139b9c1b51eSKate Stone                              lldb::TypeSummaryImplSP &summary_sp) {
14016ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
1415548cb50SEnrico Granata   auto entry = GetEntry(type);
142b9c1b51eSKate Stone   if (entry.IsSummaryCached()) {
1435548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1445548cb50SEnrico Granata     m_cache_hits++;
1455548cb50SEnrico Granata #endif
1465548cb50SEnrico Granata     summary_sp = entry.GetSummary();
1475548cb50SEnrico Granata     return true;
1485548cb50SEnrico Granata   }
1495548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1505548cb50SEnrico Granata   m_cache_misses++;
1515548cb50SEnrico Granata #endif
1525548cb50SEnrico Granata   summary_sp.reset();
1535548cb50SEnrico Granata   return false;
1545548cb50SEnrico Granata }
1555548cb50SEnrico Granata 
156b9c1b51eSKate Stone bool FormatCache::GetSynthetic(const ConstString &type,
157b9c1b51eSKate Stone                                lldb::SyntheticChildrenSP &synthetic_sp) {
15816ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
1595548cb50SEnrico Granata   auto entry = GetEntry(type);
160b9c1b51eSKate Stone   if (entry.IsSyntheticCached()) {
1615548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1625548cb50SEnrico Granata     m_cache_hits++;
1635548cb50SEnrico Granata #endif
1645548cb50SEnrico Granata     synthetic_sp = entry.GetSynthetic();
1655548cb50SEnrico Granata     return true;
1665548cb50SEnrico Granata   }
1675548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
1685548cb50SEnrico Granata   m_cache_misses++;
1695548cb50SEnrico Granata #endif
1705548cb50SEnrico Granata   synthetic_sp.reset();
1715548cb50SEnrico Granata   return false;
1725548cb50SEnrico Granata }
1735548cb50SEnrico Granata 
174b9c1b51eSKate Stone bool FormatCache::GetValidator(const ConstString &type,
175b9c1b51eSKate Stone                                lldb::TypeValidatorImplSP &validator_sp) {
17616ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
177c582713cSEnrico Granata   auto entry = GetEntry(type);
178b9c1b51eSKate Stone   if (entry.IsValidatorCached()) {
179c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
180c582713cSEnrico Granata     m_cache_hits++;
181c582713cSEnrico Granata #endif
182c582713cSEnrico Granata     validator_sp = entry.GetValidator();
183c582713cSEnrico Granata     return true;
184c582713cSEnrico Granata   }
185c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG
186c582713cSEnrico Granata   m_cache_misses++;
187c582713cSEnrico Granata #endif
188c582713cSEnrico Granata   validator_sp.reset();
189c582713cSEnrico Granata   return false;
190c582713cSEnrico Granata }
191c582713cSEnrico Granata 
192b9c1b51eSKate Stone void FormatCache::SetFormat(const ConstString &type,
193b9c1b51eSKate Stone                             lldb::TypeFormatImplSP &format_sp) {
19416ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
19552b4b6cdSEnrico Granata   GetEntry(type).SetFormat(format_sp);
19652b4b6cdSEnrico Granata }
19752b4b6cdSEnrico Granata 
198b9c1b51eSKate Stone void FormatCache::SetSummary(const ConstString &type,
199b9c1b51eSKate Stone                              lldb::TypeSummaryImplSP &summary_sp) {
20016ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
2015548cb50SEnrico Granata   GetEntry(type).SetSummary(summary_sp);
2025548cb50SEnrico Granata }
2035548cb50SEnrico Granata 
204b9c1b51eSKate Stone void FormatCache::SetSynthetic(const ConstString &type,
205b9c1b51eSKate Stone                                lldb::SyntheticChildrenSP &synthetic_sp) {
20616ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
2075548cb50SEnrico Granata   GetEntry(type).SetSynthetic(synthetic_sp);
2085548cb50SEnrico Granata }
2095548cb50SEnrico Granata 
210b9c1b51eSKate Stone void FormatCache::SetValidator(const ConstString &type,
211b9c1b51eSKate Stone                                lldb::TypeValidatorImplSP &validator_sp) {
21216ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
213c582713cSEnrico Granata   GetEntry(type).SetValidator(validator_sp);
214c582713cSEnrico Granata }
215c582713cSEnrico Granata 
216b9c1b51eSKate Stone void FormatCache::Clear() {
21716ff8604SSaleem Abdulrasool   std::lock_guard<std::recursive_mutex> guard(m_mutex);
2185548cb50SEnrico Granata   m_map.clear();
2195548cb50SEnrico Granata }
220