1b9c1b51eSKate Stone //===-- FormatCache.cpp ------------------------------------------*- C++ 2b9c1b51eSKate Stone //-*-===// 35548cb50SEnrico Granata // 4*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 6*2946cd70SChandler 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), 20b9c1b51eSKate Stone m_synthetic_cached(false), m_validator_cached(false), m_format_sp(), 21b9c1b51eSKate Stone m_summary_sp(), m_synthetic_sp(), m_validator_sp() {} 225548cb50SEnrico Granata 23b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeFormatImplSP format_sp) 24b9c1b51eSKate Stone : m_summary_cached(false), m_synthetic_cached(false), 25b9c1b51eSKate Stone m_validator_cached(false), m_summary_sp(), m_synthetic_sp(), 26b9c1b51eSKate Stone m_validator_sp() { 2752b4b6cdSEnrico Granata SetFormat(format_sp); 2852b4b6cdSEnrico Granata } 2952b4b6cdSEnrico Granata 30b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeSummaryImplSP summary_sp) 31b9c1b51eSKate Stone : m_format_cached(false), m_synthetic_cached(false), 32b9c1b51eSKate Stone m_validator_cached(false), m_format_sp(), m_synthetic_sp(), 33b9c1b51eSKate Stone m_validator_sp() { 345548cb50SEnrico Granata SetSummary(summary_sp); 355548cb50SEnrico Granata } 365548cb50SEnrico Granata 37b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::SyntheticChildrenSP synthetic_sp) 38b9c1b51eSKate Stone : m_format_cached(false), m_summary_cached(false), 39b9c1b51eSKate Stone m_validator_cached(false), m_format_sp(), m_summary_sp(), 40b9c1b51eSKate Stone m_validator_sp() { 415548cb50SEnrico Granata SetSynthetic(synthetic_sp); 425548cb50SEnrico Granata } 435548cb50SEnrico Granata 44b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeValidatorImplSP validator_sp) 45b9c1b51eSKate Stone : m_format_cached(false), m_summary_cached(false), 46b9c1b51eSKate Stone m_synthetic_cached(false), m_format_sp(), m_summary_sp(), 47b9c1b51eSKate Stone m_synthetic_sp() { 48c582713cSEnrico Granata SetValidator(validator_sp); 49c582713cSEnrico Granata } 50c582713cSEnrico Granata 51b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeFormatImplSP format_sp, 52b9c1b51eSKate Stone lldb::TypeSummaryImplSP summary_sp, 53b9c1b51eSKate Stone lldb::SyntheticChildrenSP synthetic_sp, 54b9c1b51eSKate Stone lldb::TypeValidatorImplSP validator_sp) { 5552b4b6cdSEnrico Granata SetFormat(format_sp); 565548cb50SEnrico Granata SetSummary(summary_sp); 575548cb50SEnrico Granata SetSynthetic(synthetic_sp); 58c582713cSEnrico Granata SetValidator(validator_sp); 595548cb50SEnrico Granata } 605548cb50SEnrico Granata 61b9c1b51eSKate Stone bool FormatCache::Entry::IsFormatCached() { return m_format_cached; } 6252b4b6cdSEnrico Granata 63b9c1b51eSKate Stone bool FormatCache::Entry::IsSummaryCached() { return m_summary_cached; } 645548cb50SEnrico Granata 65b9c1b51eSKate Stone bool FormatCache::Entry::IsSyntheticCached() { return m_synthetic_cached; } 665548cb50SEnrico Granata 67b9c1b51eSKate Stone bool FormatCache::Entry::IsValidatorCached() { return m_validator_cached; } 68c582713cSEnrico Granata 69b9c1b51eSKate Stone lldb::TypeFormatImplSP FormatCache::Entry::GetFormat() { return m_format_sp; } 7052b4b6cdSEnrico Granata 71b9c1b51eSKate Stone lldb::TypeSummaryImplSP FormatCache::Entry::GetSummary() { 725548cb50SEnrico Granata return m_summary_sp; 735548cb50SEnrico Granata } 745548cb50SEnrico Granata 75b9c1b51eSKate Stone lldb::SyntheticChildrenSP FormatCache::Entry::GetSynthetic() { 765548cb50SEnrico Granata return m_synthetic_sp; 775548cb50SEnrico Granata } 785548cb50SEnrico Granata 79b9c1b51eSKate Stone lldb::TypeValidatorImplSP FormatCache::Entry::GetValidator() { 80c582713cSEnrico Granata return m_validator_sp; 81c582713cSEnrico Granata } 82c582713cSEnrico Granata 83b9c1b51eSKate Stone void FormatCache::Entry::SetFormat(lldb::TypeFormatImplSP format_sp) { 8452b4b6cdSEnrico Granata m_format_cached = true; 8552b4b6cdSEnrico Granata m_format_sp = format_sp; 8652b4b6cdSEnrico Granata } 8752b4b6cdSEnrico Granata 88b9c1b51eSKate Stone void FormatCache::Entry::SetSummary(lldb::TypeSummaryImplSP summary_sp) { 895548cb50SEnrico Granata m_summary_cached = true; 905548cb50SEnrico Granata m_summary_sp = summary_sp; 915548cb50SEnrico Granata } 925548cb50SEnrico Granata 93b9c1b51eSKate Stone void FormatCache::Entry::SetSynthetic(lldb::SyntheticChildrenSP synthetic_sp) { 945548cb50SEnrico Granata m_synthetic_cached = true; 955548cb50SEnrico Granata m_synthetic_sp = synthetic_sp; 965548cb50SEnrico Granata } 975548cb50SEnrico Granata 98b9c1b51eSKate Stone void FormatCache::Entry::SetValidator(lldb::TypeValidatorImplSP validator_sp) { 99c582713cSEnrico Granata m_validator_cached = true; 100c582713cSEnrico Granata m_validator_sp = validator_sp; 101c582713cSEnrico Granata } 102c582713cSEnrico Granata 10316ff8604SSaleem Abdulrasool FormatCache::FormatCache() 104b9c1b51eSKate Stone : m_map(), m_mutex() 1055548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 10616ff8604SSaleem Abdulrasool , 107b9c1b51eSKate Stone m_cache_hits(0), m_cache_misses(0) 1085548cb50SEnrico Granata #endif 1095548cb50SEnrico Granata { 1105548cb50SEnrico Granata } 1115548cb50SEnrico Granata 112b9c1b51eSKate Stone FormatCache::Entry &FormatCache::GetEntry(const ConstString &type) { 113b9c1b51eSKate Stone auto i = m_map.find(type), e = m_map.end(); 1145548cb50SEnrico Granata if (i != e) 1155548cb50SEnrico Granata return i->second; 1165548cb50SEnrico Granata m_map[type] = FormatCache::Entry(); 1175548cb50SEnrico Granata return m_map[type]; 1185548cb50SEnrico Granata } 1195548cb50SEnrico Granata 120b9c1b51eSKate Stone bool FormatCache::GetFormat(const ConstString &type, 121b9c1b51eSKate Stone lldb::TypeFormatImplSP &format_sp) { 12216ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 12352b4b6cdSEnrico Granata auto entry = GetEntry(type); 124b9c1b51eSKate Stone if (entry.IsFormatCached()) { 12552b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 12652b4b6cdSEnrico Granata m_cache_hits++; 12752b4b6cdSEnrico Granata #endif 12852b4b6cdSEnrico Granata format_sp = entry.GetFormat(); 12952b4b6cdSEnrico Granata return true; 13052b4b6cdSEnrico Granata } 13152b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 13252b4b6cdSEnrico Granata m_cache_misses++; 13352b4b6cdSEnrico Granata #endif 13452b4b6cdSEnrico Granata format_sp.reset(); 13552b4b6cdSEnrico Granata return false; 13652b4b6cdSEnrico Granata } 13752b4b6cdSEnrico Granata 138b9c1b51eSKate Stone bool FormatCache::GetSummary(const ConstString &type, 139b9c1b51eSKate Stone lldb::TypeSummaryImplSP &summary_sp) { 14016ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 1415548cb50SEnrico Granata auto entry = GetEntry(type); 142b9c1b51eSKate Stone if (entry.IsSummaryCached()) { 1435548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1445548cb50SEnrico Granata m_cache_hits++; 1455548cb50SEnrico Granata #endif 1465548cb50SEnrico Granata summary_sp = entry.GetSummary(); 1475548cb50SEnrico Granata return true; 1485548cb50SEnrico Granata } 1495548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1505548cb50SEnrico Granata m_cache_misses++; 1515548cb50SEnrico Granata #endif 1525548cb50SEnrico Granata summary_sp.reset(); 1535548cb50SEnrico Granata return false; 1545548cb50SEnrico Granata } 1555548cb50SEnrico Granata 156b9c1b51eSKate Stone bool FormatCache::GetSynthetic(const ConstString &type, 157b9c1b51eSKate Stone lldb::SyntheticChildrenSP &synthetic_sp) { 15816ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 1595548cb50SEnrico Granata auto entry = GetEntry(type); 160b9c1b51eSKate Stone if (entry.IsSyntheticCached()) { 1615548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1625548cb50SEnrico Granata m_cache_hits++; 1635548cb50SEnrico Granata #endif 1645548cb50SEnrico Granata synthetic_sp = entry.GetSynthetic(); 1655548cb50SEnrico Granata return true; 1665548cb50SEnrico Granata } 1675548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1685548cb50SEnrico Granata m_cache_misses++; 1695548cb50SEnrico Granata #endif 1705548cb50SEnrico Granata synthetic_sp.reset(); 1715548cb50SEnrico Granata return false; 1725548cb50SEnrico Granata } 1735548cb50SEnrico Granata 174b9c1b51eSKate Stone bool FormatCache::GetValidator(const ConstString &type, 175b9c1b51eSKate Stone lldb::TypeValidatorImplSP &validator_sp) { 17616ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 177c582713cSEnrico Granata auto entry = GetEntry(type); 178b9c1b51eSKate Stone if (entry.IsValidatorCached()) { 179c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 180c582713cSEnrico Granata m_cache_hits++; 181c582713cSEnrico Granata #endif 182c582713cSEnrico Granata validator_sp = entry.GetValidator(); 183c582713cSEnrico Granata return true; 184c582713cSEnrico Granata } 185c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 186c582713cSEnrico Granata m_cache_misses++; 187c582713cSEnrico Granata #endif 188c582713cSEnrico Granata validator_sp.reset(); 189c582713cSEnrico Granata return false; 190c582713cSEnrico Granata } 191c582713cSEnrico Granata 192b9c1b51eSKate Stone void FormatCache::SetFormat(const ConstString &type, 193b9c1b51eSKate Stone lldb::TypeFormatImplSP &format_sp) { 19416ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 19552b4b6cdSEnrico Granata GetEntry(type).SetFormat(format_sp); 19652b4b6cdSEnrico Granata } 19752b4b6cdSEnrico Granata 198b9c1b51eSKate Stone void FormatCache::SetSummary(const ConstString &type, 199b9c1b51eSKate Stone lldb::TypeSummaryImplSP &summary_sp) { 20016ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 2015548cb50SEnrico Granata GetEntry(type).SetSummary(summary_sp); 2025548cb50SEnrico Granata } 2035548cb50SEnrico Granata 204b9c1b51eSKate Stone void FormatCache::SetSynthetic(const ConstString &type, 205b9c1b51eSKate Stone lldb::SyntheticChildrenSP &synthetic_sp) { 20616ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 2075548cb50SEnrico Granata GetEntry(type).SetSynthetic(synthetic_sp); 2085548cb50SEnrico Granata } 2095548cb50SEnrico Granata 210b9c1b51eSKate Stone void FormatCache::SetValidator(const ConstString &type, 211b9c1b51eSKate Stone lldb::TypeValidatorImplSP &validator_sp) { 21216ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 213c582713cSEnrico Granata GetEntry(type).SetValidator(validator_sp); 214c582713cSEnrico Granata } 215c582713cSEnrico Granata 216b9c1b51eSKate Stone void FormatCache::Clear() { 21716ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 2185548cb50SEnrico Granata m_map.clear(); 2195548cb50SEnrico Granata } 220