180814287SRaphael Isemann //===-- FormatCache.cpp ---------------------------------------------------===// 25548cb50SEnrico Granata // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65548cb50SEnrico Granata // 75548cb50SEnrico Granata //===----------------------------------------------------------------------===// 85548cb50SEnrico Granata 95548cb50SEnrico Granata 105548cb50SEnrico Granata 115548cb50SEnrico Granata 125548cb50SEnrico Granata #include "lldb/DataFormatters/FormatCache.h" 135548cb50SEnrico Granata 145548cb50SEnrico Granata using namespace lldb; 155548cb50SEnrico Granata using namespace lldb_private; 165548cb50SEnrico Granata 17b9c1b51eSKate Stone FormatCache::Entry::Entry() 18b9c1b51eSKate Stone : m_format_cached(false), m_summary_cached(false), 19ee64dfd9SAdrian Prantl m_synthetic_cached(false) {} 205548cb50SEnrico Granata 21b9c1b51eSKate Stone bool FormatCache::Entry::IsFormatCached() { return m_format_cached; } 2252b4b6cdSEnrico Granata 23b9c1b51eSKate Stone bool FormatCache::Entry::IsSummaryCached() { return m_summary_cached; } 245548cb50SEnrico Granata 25b9c1b51eSKate Stone bool FormatCache::Entry::IsSyntheticCached() { return m_synthetic_cached; } 265548cb50SEnrico Granata 277034794bSAdrian Prantl void FormatCache::Entry::Get(lldb::TypeFormatImplSP &retval) { 287034794bSAdrian Prantl retval = m_format_sp; 295548cb50SEnrico Granata } 305548cb50SEnrico Granata 317034794bSAdrian Prantl void FormatCache::Entry::Get(lldb::TypeSummaryImplSP &retval) { 327034794bSAdrian Prantl retval = m_summary_sp; 335548cb50SEnrico Granata } 345548cb50SEnrico Granata 357034794bSAdrian Prantl void FormatCache::Entry::Get(lldb::SyntheticChildrenSP &retval) { 367034794bSAdrian Prantl retval = m_synthetic_sp; 37c582713cSEnrico Granata } 38c582713cSEnrico Granata 397034794bSAdrian Prantl void FormatCache::Entry::Set(lldb::TypeFormatImplSP format_sp) { 4052b4b6cdSEnrico Granata m_format_cached = true; 4152b4b6cdSEnrico Granata m_format_sp = format_sp; 4252b4b6cdSEnrico Granata } 4352b4b6cdSEnrico Granata 447034794bSAdrian Prantl void FormatCache::Entry::Set(lldb::TypeSummaryImplSP summary_sp) { 455548cb50SEnrico Granata m_summary_cached = true; 465548cb50SEnrico Granata m_summary_sp = summary_sp; 475548cb50SEnrico Granata } 485548cb50SEnrico Granata 497034794bSAdrian Prantl void FormatCache::Entry::Set(lldb::SyntheticChildrenSP synthetic_sp) { 505548cb50SEnrico Granata m_synthetic_cached = true; 515548cb50SEnrico Granata m_synthetic_sp = synthetic_sp; 525548cb50SEnrico Granata } 535548cb50SEnrico Granata 5416ff8604SSaleem Abdulrasool FormatCache::FormatCache() 55b9c1b51eSKate Stone : m_map(), m_mutex() 565548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 5716ff8604SSaleem Abdulrasool , 58b9c1b51eSKate Stone m_cache_hits(0), m_cache_misses(0) 595548cb50SEnrico Granata #endif 605548cb50SEnrico Granata { 615548cb50SEnrico Granata } 625548cb50SEnrico Granata 630e4c4821SAdrian Prantl FormatCache::Entry &FormatCache::GetEntry(ConstString type) { 64b9c1b51eSKate Stone auto i = m_map.find(type), e = m_map.end(); 655548cb50SEnrico Granata if (i != e) 665548cb50SEnrico Granata return i->second; 675548cb50SEnrico Granata m_map[type] = FormatCache::Entry(); 685548cb50SEnrico Granata return m_map[type]; 695548cb50SEnrico Granata } 705548cb50SEnrico Granata 71*5bbaf543SMartin Storsjö namespace lldb_private { 72*5bbaf543SMartin Storsjö 737034794bSAdrian Prantl template<> bool FormatCache::Entry::IsCached<lldb::TypeFormatImplSP>() { 747034794bSAdrian Prantl return IsFormatCached(); 757034794bSAdrian Prantl } 767034794bSAdrian Prantl template<> bool FormatCache::Entry::IsCached<lldb::TypeSummaryImplSP> () { 777034794bSAdrian Prantl return IsSummaryCached(); 787034794bSAdrian Prantl } 797034794bSAdrian Prantl template<> bool FormatCache::Entry::IsCached<lldb::SyntheticChildrenSP>() { 807034794bSAdrian Prantl return IsSyntheticCached(); 817034794bSAdrian Prantl } 827034794bSAdrian Prantl 83*5bbaf543SMartin Storsjö } // namespace lldb_private 84*5bbaf543SMartin Storsjö 857034794bSAdrian Prantl template <typename ImplSP> 867034794bSAdrian Prantl bool FormatCache::Get(ConstString type, ImplSP &format_impl_sp) { 8716ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 8852b4b6cdSEnrico Granata auto entry = GetEntry(type); 897034794bSAdrian Prantl if (entry.IsCached<ImplSP>()) { 9052b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 9152b4b6cdSEnrico Granata m_cache_hits++; 9252b4b6cdSEnrico Granata #endif 937034794bSAdrian Prantl entry.Get(format_impl_sp); 9452b4b6cdSEnrico Granata return true; 9552b4b6cdSEnrico Granata } 9652b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 9752b4b6cdSEnrico Granata m_cache_misses++; 9852b4b6cdSEnrico Granata #endif 997034794bSAdrian Prantl format_impl_sp.reset(); 10052b4b6cdSEnrico Granata return false; 10152b4b6cdSEnrico Granata } 10252b4b6cdSEnrico Granata 103ee64dfd9SAdrian Prantl /// Explicit instantiations for the three types. 1047034794bSAdrian Prantl /// \{ 1057034794bSAdrian Prantl template bool 1067034794bSAdrian Prantl FormatCache::Get<lldb::TypeFormatImplSP>(ConstString, lldb::TypeFormatImplSP &); 1077034794bSAdrian Prantl template bool 1087034794bSAdrian Prantl FormatCache::Get<lldb::TypeSummaryImplSP>(ConstString, 1097034794bSAdrian Prantl lldb::TypeSummaryImplSP &); 1107034794bSAdrian Prantl template bool 1117034794bSAdrian Prantl FormatCache::Get<lldb::SyntheticChildrenSP>(ConstString, 1127034794bSAdrian Prantl lldb::SyntheticChildrenSP &); 1137034794bSAdrian Prantl /// \} 1147034794bSAdrian Prantl 1157034794bSAdrian Prantl void FormatCache::Set(ConstString type, lldb::TypeFormatImplSP &format_sp) { 11616ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 1177034794bSAdrian Prantl GetEntry(type).Set(format_sp); 1185548cb50SEnrico Granata } 1195548cb50SEnrico Granata 1207034794bSAdrian Prantl void FormatCache::Set(ConstString type, lldb::TypeSummaryImplSP &summary_sp) { 1217034794bSAdrian Prantl std::lock_guard<std::recursive_mutex> guard(m_mutex); 1227034794bSAdrian Prantl GetEntry(type).Set(summary_sp); 1237034794bSAdrian Prantl } 1247034794bSAdrian Prantl 1257034794bSAdrian Prantl void FormatCache::Set(ConstString type, 126b9c1b51eSKate Stone lldb::SyntheticChildrenSP &synthetic_sp) { 12716ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 1287034794bSAdrian Prantl GetEntry(type).Set(synthetic_sp); 1295548cb50SEnrico Granata } 1305548cb50SEnrico Granata 131b9c1b51eSKate Stone void FormatCache::Clear() { 13216ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 1335548cb50SEnrico Granata m_map.clear(); 1345548cb50SEnrico Granata } 135