1*0b57cec5SDimitry Andric //===-- FormatCache.cpp ---------------------------------------------------===//
2*0b57cec5SDimitry Andric //
3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric //
7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric 
9*0b57cec5SDimitry Andric 
10*0b57cec5SDimitry Andric 
11*0b57cec5SDimitry Andric 
12*0b57cec5SDimitry Andric #include "lldb/DataFormatters/FormatCache.h"
13*0b57cec5SDimitry Andric 
14*0b57cec5SDimitry Andric using namespace lldb;
15*0b57cec5SDimitry Andric using namespace lldb_private;
16*0b57cec5SDimitry Andric 
Entry()17*0b57cec5SDimitry Andric FormatCache::Entry::Entry()
18*0b57cec5SDimitry Andric     : m_format_cached(false), m_summary_cached(false),
19*0b57cec5SDimitry Andric       m_synthetic_cached(false) {}
20*0b57cec5SDimitry Andric 
IsFormatCached()21*0b57cec5SDimitry Andric bool FormatCache::Entry::IsFormatCached() { return m_format_cached; }
22*0b57cec5SDimitry Andric 
IsSummaryCached()23*0b57cec5SDimitry Andric bool FormatCache::Entry::IsSummaryCached() { return m_summary_cached; }
24*0b57cec5SDimitry Andric 
IsSyntheticCached()25*0b57cec5SDimitry Andric bool FormatCache::Entry::IsSyntheticCached() { return m_synthetic_cached; }
26*0b57cec5SDimitry Andric 
Get(lldb::TypeFormatImplSP & retval)27*0b57cec5SDimitry Andric void FormatCache::Entry::Get(lldb::TypeFormatImplSP &retval) {
28*0b57cec5SDimitry Andric   retval = m_format_sp;
29*0b57cec5SDimitry Andric }
30*0b57cec5SDimitry Andric 
Get(lldb::TypeSummaryImplSP & retval)31*0b57cec5SDimitry Andric void FormatCache::Entry::Get(lldb::TypeSummaryImplSP &retval) {
32*0b57cec5SDimitry Andric   retval = m_summary_sp;
33*0b57cec5SDimitry Andric }
34*0b57cec5SDimitry Andric 
Get(lldb::SyntheticChildrenSP & retval)35*0b57cec5SDimitry Andric void FormatCache::Entry::Get(lldb::SyntheticChildrenSP &retval) {
36*0b57cec5SDimitry Andric   retval = m_synthetic_sp;
37*0b57cec5SDimitry Andric }
38*0b57cec5SDimitry Andric 
Set(lldb::TypeFormatImplSP format_sp)39*0b57cec5SDimitry Andric void FormatCache::Entry::Set(lldb::TypeFormatImplSP format_sp) {
40*0b57cec5SDimitry Andric   m_format_cached = true;
41*0b57cec5SDimitry Andric   m_format_sp = format_sp;
42*0b57cec5SDimitry Andric }
43*0b57cec5SDimitry Andric 
Set(lldb::TypeSummaryImplSP summary_sp)44*0b57cec5SDimitry Andric void FormatCache::Entry::Set(lldb::TypeSummaryImplSP summary_sp) {
45*0b57cec5SDimitry Andric   m_summary_cached = true;
46*0b57cec5SDimitry Andric   m_summary_sp = summary_sp;
47*0b57cec5SDimitry Andric }
48*0b57cec5SDimitry Andric 
Set(lldb::SyntheticChildrenSP synthetic_sp)49*0b57cec5SDimitry Andric void FormatCache::Entry::Set(lldb::SyntheticChildrenSP synthetic_sp) {
50*0b57cec5SDimitry Andric   m_synthetic_cached = true;
51*0b57cec5SDimitry Andric   m_synthetic_sp = synthetic_sp;
52*0b57cec5SDimitry Andric }
53*0b57cec5SDimitry Andric 
GetEntry(ConstString type)54*0b57cec5SDimitry Andric FormatCache::Entry &FormatCache::GetEntry(ConstString type) {
55*0b57cec5SDimitry Andric   auto i = m_map.find(type), e = m_map.end();
56*0b57cec5SDimitry Andric   if (i != e)
57*0b57cec5SDimitry Andric     return i->second;
58*0b57cec5SDimitry Andric   m_map[type] = FormatCache::Entry();
59*0b57cec5SDimitry Andric   return m_map[type];
60*0b57cec5SDimitry Andric }
61*0b57cec5SDimitry Andric 
62*0b57cec5SDimitry Andric namespace lldb_private {
63*0b57cec5SDimitry Andric 
IsCached()64*0b57cec5SDimitry Andric template<> bool FormatCache::Entry::IsCached<lldb::TypeFormatImplSP>() {
65*0b57cec5SDimitry Andric   return IsFormatCached();
66*0b57cec5SDimitry Andric }
IsCached()67*0b57cec5SDimitry Andric template<> bool FormatCache::Entry::IsCached<lldb::TypeSummaryImplSP> () {
68*0b57cec5SDimitry Andric   return IsSummaryCached();
69*0b57cec5SDimitry Andric }
IsCached()70*0b57cec5SDimitry Andric template<> bool FormatCache::Entry::IsCached<lldb::SyntheticChildrenSP>() {
71*0b57cec5SDimitry Andric   return IsSyntheticCached();
72*0b57cec5SDimitry Andric }
73*0b57cec5SDimitry Andric 
74*0b57cec5SDimitry Andric } // namespace lldb_private
75*0b57cec5SDimitry Andric 
76*0b57cec5SDimitry Andric template <typename ImplSP>
Get(ConstString type,ImplSP & format_impl_sp)77*0b57cec5SDimitry Andric bool FormatCache::Get(ConstString type, ImplSP &format_impl_sp) {
78*0b57cec5SDimitry Andric   std::lock_guard<std::recursive_mutex> guard(m_mutex);
79*0b57cec5SDimitry Andric   auto entry = GetEntry(type);
80*0b57cec5SDimitry Andric   if (entry.IsCached<ImplSP>()) {
81*0b57cec5SDimitry Andric     m_cache_hits++;
82*0b57cec5SDimitry Andric     entry.Get(format_impl_sp);
83*0b57cec5SDimitry Andric     return true;
84*0b57cec5SDimitry Andric   }
85*0b57cec5SDimitry Andric   m_cache_misses++;
86*0b57cec5SDimitry Andric   format_impl_sp.reset();
87*0b57cec5SDimitry Andric   return false;
88*0b57cec5SDimitry Andric }
89*0b57cec5SDimitry Andric 
90*0b57cec5SDimitry Andric /// Explicit instantiations for the three types.
91*0b57cec5SDimitry Andric /// \{
92*0b57cec5SDimitry Andric template bool
93*0b57cec5SDimitry Andric FormatCache::Get<lldb::TypeFormatImplSP>(ConstString, lldb::TypeFormatImplSP &);
94*0b57cec5SDimitry Andric template bool
95*0b57cec5SDimitry Andric FormatCache::Get<lldb::TypeSummaryImplSP>(ConstString,
96*0b57cec5SDimitry Andric                                           lldb::TypeSummaryImplSP &);
97*0b57cec5SDimitry Andric template bool
98*0b57cec5SDimitry Andric FormatCache::Get<lldb::SyntheticChildrenSP>(ConstString,
99*0b57cec5SDimitry Andric                                             lldb::SyntheticChildrenSP &);
100*0b57cec5SDimitry Andric /// \}
101*0b57cec5SDimitry Andric 
Set(ConstString type,lldb::TypeFormatImplSP & format_sp)102*0b57cec5SDimitry Andric void FormatCache::Set(ConstString type, lldb::TypeFormatImplSP &format_sp) {
103*0b57cec5SDimitry Andric   std::lock_guard<std::recursive_mutex> guard(m_mutex);
104*0b57cec5SDimitry Andric   GetEntry(type).Set(format_sp);
105*0b57cec5SDimitry Andric }
106*0b57cec5SDimitry Andric 
Set(ConstString type,lldb::TypeSummaryImplSP & summary_sp)107*0b57cec5SDimitry Andric void FormatCache::Set(ConstString type, lldb::TypeSummaryImplSP &summary_sp) {
108*0b57cec5SDimitry Andric   std::lock_guard<std::recursive_mutex> guard(m_mutex);
109*0b57cec5SDimitry Andric   GetEntry(type).Set(summary_sp);
110*0b57cec5SDimitry Andric }
111*0b57cec5SDimitry Andric 
Set(ConstString type,lldb::SyntheticChildrenSP & synthetic_sp)112*0b57cec5SDimitry Andric void FormatCache::Set(ConstString type,
113*0b57cec5SDimitry Andric                       lldb::SyntheticChildrenSP &synthetic_sp) {
114*0b57cec5SDimitry Andric   std::lock_guard<std::recursive_mutex> guard(m_mutex);
115*0b57cec5SDimitry Andric   GetEntry(type).Set(synthetic_sp);
116*0b57cec5SDimitry Andric }
117*0b57cec5SDimitry Andric 
Clear()118*0b57cec5SDimitry Andric void FormatCache::Clear() {
119*0b57cec5SDimitry Andric   std::lock_guard<std::recursive_mutex> guard(m_mutex);
120*0b57cec5SDimitry Andric   m_map.clear();
121*0b57cec5SDimitry Andric }
122*0b57cec5SDimitry Andric