1b9c1b51eSKate Stone //===-- FormatCache.cpp ------------------------------------------*- C++ 2b9c1b51eSKate Stone //-*-===// 35548cb50SEnrico Granata // 42946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 52946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 62946cd70SChandler 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), 20*ee64dfd9SAdrian Prantl m_synthetic_cached(false) {} 215548cb50SEnrico Granata 22b9c1b51eSKate Stone bool FormatCache::Entry::IsFormatCached() { return m_format_cached; } 2352b4b6cdSEnrico Granata 24b9c1b51eSKate Stone bool FormatCache::Entry::IsSummaryCached() { return m_summary_cached; } 255548cb50SEnrico Granata 26b9c1b51eSKate Stone bool FormatCache::Entry::IsSyntheticCached() { return m_synthetic_cached; } 275548cb50SEnrico Granata 287034794bSAdrian Prantl void FormatCache::Entry::Get(lldb::TypeFormatImplSP &retval) { 297034794bSAdrian Prantl retval = m_format_sp; 305548cb50SEnrico Granata } 315548cb50SEnrico Granata 327034794bSAdrian Prantl void FormatCache::Entry::Get(lldb::TypeSummaryImplSP &retval) { 337034794bSAdrian Prantl retval = m_summary_sp; 345548cb50SEnrico Granata } 355548cb50SEnrico Granata 367034794bSAdrian Prantl void FormatCache::Entry::Get(lldb::SyntheticChildrenSP &retval) { 377034794bSAdrian Prantl retval = m_synthetic_sp; 38c582713cSEnrico Granata } 39c582713cSEnrico Granata 407034794bSAdrian Prantl void FormatCache::Entry::Set(lldb::TypeFormatImplSP format_sp) { 4152b4b6cdSEnrico Granata m_format_cached = true; 4252b4b6cdSEnrico Granata m_format_sp = format_sp; 4352b4b6cdSEnrico Granata } 4452b4b6cdSEnrico Granata 457034794bSAdrian Prantl void FormatCache::Entry::Set(lldb::TypeSummaryImplSP summary_sp) { 465548cb50SEnrico Granata m_summary_cached = true; 475548cb50SEnrico Granata m_summary_sp = summary_sp; 485548cb50SEnrico Granata } 495548cb50SEnrico Granata 507034794bSAdrian Prantl void FormatCache::Entry::Set(lldb::SyntheticChildrenSP synthetic_sp) { 515548cb50SEnrico Granata m_synthetic_cached = true; 525548cb50SEnrico Granata m_synthetic_sp = synthetic_sp; 535548cb50SEnrico Granata } 545548cb50SEnrico Granata 5516ff8604SSaleem Abdulrasool FormatCache::FormatCache() 56b9c1b51eSKate Stone : m_map(), m_mutex() 575548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 5816ff8604SSaleem Abdulrasool , 59b9c1b51eSKate Stone m_cache_hits(0), m_cache_misses(0) 605548cb50SEnrico Granata #endif 615548cb50SEnrico Granata { 625548cb50SEnrico Granata } 635548cb50SEnrico Granata 640e4c4821SAdrian Prantl FormatCache::Entry &FormatCache::GetEntry(ConstString type) { 65b9c1b51eSKate Stone auto i = m_map.find(type), e = m_map.end(); 665548cb50SEnrico Granata if (i != e) 675548cb50SEnrico Granata return i->second; 685548cb50SEnrico Granata m_map[type] = FormatCache::Entry(); 695548cb50SEnrico Granata return m_map[type]; 705548cb50SEnrico Granata } 715548cb50SEnrico Granata 727034794bSAdrian Prantl template<> bool FormatCache::Entry::IsCached<lldb::TypeFormatImplSP>() { 737034794bSAdrian Prantl return IsFormatCached(); 747034794bSAdrian Prantl } 757034794bSAdrian Prantl template<> bool FormatCache::Entry::IsCached<lldb::TypeSummaryImplSP> () { 767034794bSAdrian Prantl return IsSummaryCached(); 777034794bSAdrian Prantl } 787034794bSAdrian Prantl template<> bool FormatCache::Entry::IsCached<lldb::SyntheticChildrenSP>() { 797034794bSAdrian Prantl return IsSyntheticCached(); 807034794bSAdrian Prantl } 817034794bSAdrian Prantl 827034794bSAdrian Prantl template <typename ImplSP> 837034794bSAdrian Prantl bool FormatCache::Get(ConstString type, ImplSP &format_impl_sp) { 8416ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 8552b4b6cdSEnrico Granata auto entry = GetEntry(type); 867034794bSAdrian Prantl if (entry.IsCached<ImplSP>()) { 8752b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 8852b4b6cdSEnrico Granata m_cache_hits++; 8952b4b6cdSEnrico Granata #endif 907034794bSAdrian Prantl entry.Get(format_impl_sp); 9152b4b6cdSEnrico Granata return true; 9252b4b6cdSEnrico Granata } 9352b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 9452b4b6cdSEnrico Granata m_cache_misses++; 9552b4b6cdSEnrico Granata #endif 967034794bSAdrian Prantl format_impl_sp.reset(); 9752b4b6cdSEnrico Granata return false; 9852b4b6cdSEnrico Granata } 9952b4b6cdSEnrico Granata 100*ee64dfd9SAdrian Prantl /// Explicit instantiations for the three types. 1017034794bSAdrian Prantl /// \{ 1027034794bSAdrian Prantl template bool 1037034794bSAdrian Prantl FormatCache::Get<lldb::TypeFormatImplSP>(ConstString, lldb::TypeFormatImplSP &); 1047034794bSAdrian Prantl template bool 1057034794bSAdrian Prantl FormatCache::Get<lldb::TypeSummaryImplSP>(ConstString, 1067034794bSAdrian Prantl lldb::TypeSummaryImplSP &); 1077034794bSAdrian Prantl template bool 1087034794bSAdrian Prantl FormatCache::Get<lldb::SyntheticChildrenSP>(ConstString, 1097034794bSAdrian Prantl lldb::SyntheticChildrenSP &); 1107034794bSAdrian Prantl /// \} 1117034794bSAdrian Prantl 1127034794bSAdrian Prantl void FormatCache::Set(ConstString type, lldb::TypeFormatImplSP &format_sp) { 11316ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 1147034794bSAdrian Prantl GetEntry(type).Set(format_sp); 1155548cb50SEnrico Granata } 1165548cb50SEnrico Granata 1177034794bSAdrian Prantl void FormatCache::Set(ConstString type, lldb::TypeSummaryImplSP &summary_sp) { 1187034794bSAdrian Prantl std::lock_guard<std::recursive_mutex> guard(m_mutex); 1197034794bSAdrian Prantl GetEntry(type).Set(summary_sp); 1207034794bSAdrian Prantl } 1217034794bSAdrian Prantl 1227034794bSAdrian Prantl void FormatCache::Set(ConstString type, 123b9c1b51eSKate Stone lldb::SyntheticChildrenSP &synthetic_sp) { 12416ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 1257034794bSAdrian Prantl GetEntry(type).Set(synthetic_sp); 1265548cb50SEnrico Granata } 1275548cb50SEnrico Granata 128b9c1b51eSKate Stone void FormatCache::Clear() { 12916ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 1305548cb50SEnrico Granata m_map.clear(); 1315548cb50SEnrico Granata } 132