10b57cec5SDimitry Andric //===-- FormatCache.cpp ---------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric 
100b57cec5SDimitry Andric 
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #include "lldb/DataFormatters/FormatCache.h"
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric using namespace lldb;
150b57cec5SDimitry Andric using namespace lldb_private;
160b57cec5SDimitry Andric 
Entry()170b57cec5SDimitry Andric FormatCache::Entry::Entry()
180b57cec5SDimitry Andric     : m_format_cached(false), m_summary_cached(false),
190b57cec5SDimitry Andric       m_synthetic_cached(false) {}
200b57cec5SDimitry Andric 
IsFormatCached()210b57cec5SDimitry Andric bool FormatCache::Entry::IsFormatCached() { return m_format_cached; }
220b57cec5SDimitry Andric 
IsSummaryCached()230b57cec5SDimitry Andric bool FormatCache::Entry::IsSummaryCached() { return m_summary_cached; }
240b57cec5SDimitry Andric 
IsSyntheticCached()250b57cec5SDimitry Andric bool FormatCache::Entry::IsSyntheticCached() { return m_synthetic_cached; }
260b57cec5SDimitry Andric 
Get(lldb::TypeFormatImplSP & retval)270b57cec5SDimitry Andric void FormatCache::Entry::Get(lldb::TypeFormatImplSP &retval) {
280b57cec5SDimitry Andric   retval = m_format_sp;
290b57cec5SDimitry Andric }
300b57cec5SDimitry Andric 
Get(lldb::TypeSummaryImplSP & retval)310b57cec5SDimitry Andric void FormatCache::Entry::Get(lldb::TypeSummaryImplSP &retval) {
320b57cec5SDimitry Andric   retval = m_summary_sp;
330b57cec5SDimitry Andric }
340b57cec5SDimitry Andric 
Get(lldb::SyntheticChildrenSP & retval)350b57cec5SDimitry Andric void FormatCache::Entry::Get(lldb::SyntheticChildrenSP &retval) {
360b57cec5SDimitry Andric   retval = m_synthetic_sp;
370b57cec5SDimitry Andric }
380b57cec5SDimitry Andric 
Set(lldb::TypeFormatImplSP format_sp)390b57cec5SDimitry Andric void FormatCache::Entry::Set(lldb::TypeFormatImplSP format_sp) {
400b57cec5SDimitry Andric   m_format_cached = true;
410b57cec5SDimitry Andric   m_format_sp = format_sp;
420b57cec5SDimitry Andric }
430b57cec5SDimitry Andric 
Set(lldb::TypeSummaryImplSP summary_sp)440b57cec5SDimitry Andric void FormatCache::Entry::Set(lldb::TypeSummaryImplSP summary_sp) {
450b57cec5SDimitry Andric   m_summary_cached = true;
460b57cec5SDimitry Andric   m_summary_sp = summary_sp;
470b57cec5SDimitry Andric }
480b57cec5SDimitry Andric 
Set(lldb::SyntheticChildrenSP synthetic_sp)490b57cec5SDimitry Andric void FormatCache::Entry::Set(lldb::SyntheticChildrenSP synthetic_sp) {
500b57cec5SDimitry Andric   m_synthetic_cached = true;
510b57cec5SDimitry Andric   m_synthetic_sp = synthetic_sp;
520b57cec5SDimitry Andric }
530b57cec5SDimitry Andric 
GetEntry(ConstString type)540b57cec5SDimitry Andric FormatCache::Entry &FormatCache::GetEntry(ConstString type) {
550b57cec5SDimitry Andric   auto i = m_map.find(type), e = m_map.end();
560b57cec5SDimitry Andric   if (i != e)
570b57cec5SDimitry Andric     return i->second;
580b57cec5SDimitry Andric   m_map[type] = FormatCache::Entry();
590b57cec5SDimitry Andric   return m_map[type];
600b57cec5SDimitry Andric }
610b57cec5SDimitry Andric 
620b57cec5SDimitry Andric namespace lldb_private {
630b57cec5SDimitry Andric 
IsCached()640b57cec5SDimitry Andric template<> bool FormatCache::Entry::IsCached<lldb::TypeFormatImplSP>() {
650b57cec5SDimitry Andric   return IsFormatCached();
660b57cec5SDimitry Andric }
IsCached()670b57cec5SDimitry Andric template<> bool FormatCache::Entry::IsCached<lldb::TypeSummaryImplSP> () {
680b57cec5SDimitry Andric   return IsSummaryCached();
690b57cec5SDimitry Andric }
IsCached()700b57cec5SDimitry Andric template<> bool FormatCache::Entry::IsCached<lldb::SyntheticChildrenSP>() {
710b57cec5SDimitry Andric   return IsSyntheticCached();
720b57cec5SDimitry Andric }
730b57cec5SDimitry Andric 
740b57cec5SDimitry Andric } // namespace lldb_private
750b57cec5SDimitry Andric 
760b57cec5SDimitry Andric template <typename ImplSP>
Get(ConstString type,ImplSP & format_impl_sp)770b57cec5SDimitry Andric bool FormatCache::Get(ConstString type, ImplSP &format_impl_sp) {
780b57cec5SDimitry Andric   std::lock_guard<std::recursive_mutex> guard(m_mutex);
790b57cec5SDimitry Andric   auto entry = GetEntry(type);
800b57cec5SDimitry Andric   if (entry.IsCached<ImplSP>()) {
810b57cec5SDimitry Andric     m_cache_hits++;
820b57cec5SDimitry Andric     entry.Get(format_impl_sp);
830b57cec5SDimitry Andric     return true;
840b57cec5SDimitry Andric   }
850b57cec5SDimitry Andric   m_cache_misses++;
860b57cec5SDimitry Andric   format_impl_sp.reset();
870b57cec5SDimitry Andric   return false;
880b57cec5SDimitry Andric }
890b57cec5SDimitry Andric 
900b57cec5SDimitry Andric /// Explicit instantiations for the three types.
910b57cec5SDimitry Andric /// \{
920b57cec5SDimitry Andric template bool
930b57cec5SDimitry Andric FormatCache::Get<lldb::TypeFormatImplSP>(ConstString, lldb::TypeFormatImplSP &);
940b57cec5SDimitry Andric template bool
950b57cec5SDimitry Andric FormatCache::Get<lldb::TypeSummaryImplSP>(ConstString,
960b57cec5SDimitry Andric                                           lldb::TypeSummaryImplSP &);
970b57cec5SDimitry Andric template bool
980b57cec5SDimitry Andric FormatCache::Get<lldb::SyntheticChildrenSP>(ConstString,
990b57cec5SDimitry Andric                                             lldb::SyntheticChildrenSP &);
1000b57cec5SDimitry Andric /// \}
1010b57cec5SDimitry Andric 
Set(ConstString type,lldb::TypeFormatImplSP & format_sp)1020b57cec5SDimitry Andric void FormatCache::Set(ConstString type, lldb::TypeFormatImplSP &format_sp) {
1030b57cec5SDimitry Andric   std::lock_guard<std::recursive_mutex> guard(m_mutex);
1040b57cec5SDimitry Andric   GetEntry(type).Set(format_sp);
1050b57cec5SDimitry Andric }
1060b57cec5SDimitry Andric 
Set(ConstString type,lldb::TypeSummaryImplSP & summary_sp)1070b57cec5SDimitry Andric void FormatCache::Set(ConstString type, lldb::TypeSummaryImplSP &summary_sp) {
1080b57cec5SDimitry Andric   std::lock_guard<std::recursive_mutex> guard(m_mutex);
1090b57cec5SDimitry Andric   GetEntry(type).Set(summary_sp);
1100b57cec5SDimitry Andric }
1110b57cec5SDimitry Andric 
Set(ConstString type,lldb::SyntheticChildrenSP & synthetic_sp)1120b57cec5SDimitry Andric void FormatCache::Set(ConstString type,
1130b57cec5SDimitry Andric                       lldb::SyntheticChildrenSP &synthetic_sp) {
1140b57cec5SDimitry Andric   std::lock_guard<std::recursive_mutex> guard(m_mutex);
1150b57cec5SDimitry Andric   GetEntry(type).Set(synthetic_sp);
1160b57cec5SDimitry Andric }
1170b57cec5SDimitry Andric 
Clear()1180b57cec5SDimitry Andric void FormatCache::Clear() {
1190b57cec5SDimitry Andric   std::lock_guard<std::recursive_mutex> guard(m_mutex);
1200b57cec5SDimitry Andric   m_map.clear();
1210b57cec5SDimitry Andric }
1220b57cec5SDimitry Andric