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*7034794bSAdrian Prantl m_synthetic_cached(false), m_validator_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 28b9c1b51eSKate Stone bool FormatCache::Entry::IsValidatorCached() { return m_validator_cached; } 29c582713cSEnrico Granata 30*7034794bSAdrian Prantl void FormatCache::Entry::Get(lldb::TypeFormatImplSP &retval) { 31*7034794bSAdrian Prantl retval = m_format_sp; 325548cb50SEnrico Granata } 335548cb50SEnrico Granata 34*7034794bSAdrian Prantl void FormatCache::Entry::Get(lldb::TypeSummaryImplSP &retval) { 35*7034794bSAdrian Prantl retval = m_summary_sp; 365548cb50SEnrico Granata } 375548cb50SEnrico Granata 38*7034794bSAdrian Prantl void FormatCache::Entry::Get(lldb::SyntheticChildrenSP &retval) { 39*7034794bSAdrian Prantl retval = m_synthetic_sp; 40c582713cSEnrico Granata } 41c582713cSEnrico Granata 42*7034794bSAdrian Prantl void FormatCache::Entry::Get(lldb::TypeValidatorImplSP &retval) { 43*7034794bSAdrian Prantl retval = m_validator_sp; 44*7034794bSAdrian Prantl } 45*7034794bSAdrian Prantl 46*7034794bSAdrian Prantl void FormatCache::Entry::Set(lldb::TypeFormatImplSP format_sp) { 4752b4b6cdSEnrico Granata m_format_cached = true; 4852b4b6cdSEnrico Granata m_format_sp = format_sp; 4952b4b6cdSEnrico Granata } 5052b4b6cdSEnrico Granata 51*7034794bSAdrian Prantl void FormatCache::Entry::Set(lldb::TypeSummaryImplSP summary_sp) { 525548cb50SEnrico Granata m_summary_cached = true; 535548cb50SEnrico Granata m_summary_sp = summary_sp; 545548cb50SEnrico Granata } 555548cb50SEnrico Granata 56*7034794bSAdrian Prantl void FormatCache::Entry::Set(lldb::SyntheticChildrenSP synthetic_sp) { 575548cb50SEnrico Granata m_synthetic_cached = true; 585548cb50SEnrico Granata m_synthetic_sp = synthetic_sp; 595548cb50SEnrico Granata } 605548cb50SEnrico Granata 61*7034794bSAdrian Prantl void FormatCache::Entry::Set(lldb::TypeValidatorImplSP validator_sp) { 62c582713cSEnrico Granata m_validator_cached = true; 63c582713cSEnrico Granata m_validator_sp = validator_sp; 64c582713cSEnrico Granata } 65c582713cSEnrico Granata 6616ff8604SSaleem Abdulrasool FormatCache::FormatCache() 67b9c1b51eSKate Stone : m_map(), m_mutex() 685548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 6916ff8604SSaleem Abdulrasool , 70b9c1b51eSKate Stone m_cache_hits(0), m_cache_misses(0) 715548cb50SEnrico Granata #endif 725548cb50SEnrico Granata { 735548cb50SEnrico Granata } 745548cb50SEnrico Granata 750e4c4821SAdrian Prantl FormatCache::Entry &FormatCache::GetEntry(ConstString type) { 76b9c1b51eSKate Stone auto i = m_map.find(type), e = m_map.end(); 775548cb50SEnrico Granata if (i != e) 785548cb50SEnrico Granata return i->second; 795548cb50SEnrico Granata m_map[type] = FormatCache::Entry(); 805548cb50SEnrico Granata return m_map[type]; 815548cb50SEnrico Granata } 825548cb50SEnrico Granata 83*7034794bSAdrian Prantl template<> bool FormatCache::Entry::IsCached<lldb::TypeFormatImplSP>() { 84*7034794bSAdrian Prantl return IsFormatCached(); 85*7034794bSAdrian Prantl } 86*7034794bSAdrian Prantl template<> bool FormatCache::Entry::IsCached<lldb::TypeSummaryImplSP> () { 87*7034794bSAdrian Prantl return IsSummaryCached(); 88*7034794bSAdrian Prantl } 89*7034794bSAdrian Prantl template<> bool FormatCache::Entry::IsCached<lldb::SyntheticChildrenSP>() { 90*7034794bSAdrian Prantl return IsSyntheticCached(); 91*7034794bSAdrian Prantl } 92*7034794bSAdrian Prantl template<> bool FormatCache::Entry::IsCached<lldb::TypeValidatorImplSP>() { 93*7034794bSAdrian Prantl return IsValidatorCached(); 94*7034794bSAdrian Prantl } 95*7034794bSAdrian Prantl 96*7034794bSAdrian Prantl template <typename ImplSP> 97*7034794bSAdrian Prantl bool FormatCache::Get(ConstString type, ImplSP &format_impl_sp) { 9816ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 9952b4b6cdSEnrico Granata auto entry = GetEntry(type); 100*7034794bSAdrian Prantl if (entry.IsCached<ImplSP>()) { 10152b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 10252b4b6cdSEnrico Granata m_cache_hits++; 10352b4b6cdSEnrico Granata #endif 104*7034794bSAdrian Prantl entry.Get(format_impl_sp); 10552b4b6cdSEnrico Granata return true; 10652b4b6cdSEnrico Granata } 10752b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 10852b4b6cdSEnrico Granata m_cache_misses++; 10952b4b6cdSEnrico Granata #endif 110*7034794bSAdrian Prantl format_impl_sp.reset(); 11152b4b6cdSEnrico Granata return false; 11252b4b6cdSEnrico Granata } 11352b4b6cdSEnrico Granata 114*7034794bSAdrian Prantl /// Explicit instantiations for the four types. 115*7034794bSAdrian Prantl /// \{ 116*7034794bSAdrian Prantl template bool 117*7034794bSAdrian Prantl FormatCache::Get<lldb::TypeValidatorImplSP>(ConstString, 118*7034794bSAdrian Prantl lldb::TypeValidatorImplSP &); 119*7034794bSAdrian Prantl template bool 120*7034794bSAdrian Prantl FormatCache::Get<lldb::TypeFormatImplSP>(ConstString, lldb::TypeFormatImplSP &); 121*7034794bSAdrian Prantl template bool 122*7034794bSAdrian Prantl FormatCache::Get<lldb::TypeSummaryImplSP>(ConstString, 123*7034794bSAdrian Prantl lldb::TypeSummaryImplSP &); 124*7034794bSAdrian Prantl template bool 125*7034794bSAdrian Prantl FormatCache::Get<lldb::SyntheticChildrenSP>(ConstString, 126*7034794bSAdrian Prantl lldb::SyntheticChildrenSP &); 127*7034794bSAdrian Prantl /// \} 128*7034794bSAdrian Prantl 129*7034794bSAdrian Prantl void FormatCache::Set(ConstString type, lldb::TypeFormatImplSP &format_sp) { 13016ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 131*7034794bSAdrian Prantl GetEntry(type).Set(format_sp); 1325548cb50SEnrico Granata } 1335548cb50SEnrico Granata 134*7034794bSAdrian Prantl void FormatCache::Set(ConstString type, lldb::TypeSummaryImplSP &summary_sp) { 135*7034794bSAdrian Prantl std::lock_guard<std::recursive_mutex> guard(m_mutex); 136*7034794bSAdrian Prantl GetEntry(type).Set(summary_sp); 137*7034794bSAdrian Prantl } 138*7034794bSAdrian Prantl 139*7034794bSAdrian Prantl void FormatCache::Set(ConstString type, 140b9c1b51eSKate Stone lldb::SyntheticChildrenSP &synthetic_sp) { 14116ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 142*7034794bSAdrian Prantl GetEntry(type).Set(synthetic_sp); 1435548cb50SEnrico Granata } 1445548cb50SEnrico Granata 145*7034794bSAdrian Prantl void FormatCache::Set(ConstString type, 146b9c1b51eSKate Stone lldb::TypeValidatorImplSP &validator_sp) { 14716ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 148*7034794bSAdrian Prantl GetEntry(type).Set(validator_sp); 149c582713cSEnrico Granata } 150c582713cSEnrico Granata 151b9c1b51eSKate Stone void FormatCache::Clear() { 15216ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 1535548cb50SEnrico Granata m_map.clear(); 1545548cb50SEnrico Granata } 155