1*b9c1b51eSKate Stone //===-- FormatCache.cpp ------------------------------------------*- C++ 2*b9c1b51eSKate Stone //-*-===// 35548cb50SEnrico Granata // 45548cb50SEnrico Granata // The LLVM Compiler Infrastructure 55548cb50SEnrico Granata // 65548cb50SEnrico Granata // This file is distributed under the University of Illinois Open Source 75548cb50SEnrico Granata // License. See LICENSE.TXT for details. 85548cb50SEnrico Granata // 95548cb50SEnrico Granata //===----------------------------------------------------------------------===// 105548cb50SEnrico Granata 115548cb50SEnrico Granata // C Includes 125548cb50SEnrico Granata 135548cb50SEnrico Granata // C++ Includes 145548cb50SEnrico Granata 155548cb50SEnrico Granata // Other libraries and framework includes 165548cb50SEnrico Granata 175548cb50SEnrico Granata // Project includes 185548cb50SEnrico Granata #include "lldb/DataFormatters/FormatCache.h" 195548cb50SEnrico Granata 205548cb50SEnrico Granata using namespace lldb; 215548cb50SEnrico Granata using namespace lldb_private; 225548cb50SEnrico Granata 23*b9c1b51eSKate Stone FormatCache::Entry::Entry() 24*b9c1b51eSKate Stone : m_format_cached(false), m_summary_cached(false), 25*b9c1b51eSKate Stone m_synthetic_cached(false), m_validator_cached(false), m_format_sp(), 26*b9c1b51eSKate Stone m_summary_sp(), m_synthetic_sp(), m_validator_sp() {} 275548cb50SEnrico Granata 28*b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeFormatImplSP format_sp) 29*b9c1b51eSKate Stone : m_summary_cached(false), m_synthetic_cached(false), 30*b9c1b51eSKate Stone m_validator_cached(false), m_summary_sp(), m_synthetic_sp(), 31*b9c1b51eSKate Stone m_validator_sp() { 3252b4b6cdSEnrico Granata SetFormat(format_sp); 3352b4b6cdSEnrico Granata } 3452b4b6cdSEnrico Granata 35*b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeSummaryImplSP summary_sp) 36*b9c1b51eSKate Stone : m_format_cached(false), m_synthetic_cached(false), 37*b9c1b51eSKate Stone m_validator_cached(false), m_format_sp(), m_synthetic_sp(), 38*b9c1b51eSKate Stone m_validator_sp() { 395548cb50SEnrico Granata SetSummary(summary_sp); 405548cb50SEnrico Granata } 415548cb50SEnrico Granata 42*b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::SyntheticChildrenSP synthetic_sp) 43*b9c1b51eSKate Stone : m_format_cached(false), m_summary_cached(false), 44*b9c1b51eSKate Stone m_validator_cached(false), m_format_sp(), m_summary_sp(), 45*b9c1b51eSKate Stone m_validator_sp() { 465548cb50SEnrico Granata SetSynthetic(synthetic_sp); 475548cb50SEnrico Granata } 485548cb50SEnrico Granata 49*b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeValidatorImplSP validator_sp) 50*b9c1b51eSKate Stone : m_format_cached(false), m_summary_cached(false), 51*b9c1b51eSKate Stone m_synthetic_cached(false), m_format_sp(), m_summary_sp(), 52*b9c1b51eSKate Stone m_synthetic_sp() { 53c582713cSEnrico Granata SetValidator(validator_sp); 54c582713cSEnrico Granata } 55c582713cSEnrico Granata 56*b9c1b51eSKate Stone FormatCache::Entry::Entry(lldb::TypeFormatImplSP format_sp, 57*b9c1b51eSKate Stone lldb::TypeSummaryImplSP summary_sp, 58*b9c1b51eSKate Stone lldb::SyntheticChildrenSP synthetic_sp, 59*b9c1b51eSKate Stone lldb::TypeValidatorImplSP validator_sp) { 6052b4b6cdSEnrico Granata SetFormat(format_sp); 615548cb50SEnrico Granata SetSummary(summary_sp); 625548cb50SEnrico Granata SetSynthetic(synthetic_sp); 63c582713cSEnrico Granata SetValidator(validator_sp); 645548cb50SEnrico Granata } 655548cb50SEnrico Granata 66*b9c1b51eSKate Stone bool FormatCache::Entry::IsFormatCached() { return m_format_cached; } 6752b4b6cdSEnrico Granata 68*b9c1b51eSKate Stone bool FormatCache::Entry::IsSummaryCached() { return m_summary_cached; } 695548cb50SEnrico Granata 70*b9c1b51eSKate Stone bool FormatCache::Entry::IsSyntheticCached() { return m_synthetic_cached; } 715548cb50SEnrico Granata 72*b9c1b51eSKate Stone bool FormatCache::Entry::IsValidatorCached() { return m_validator_cached; } 73c582713cSEnrico Granata 74*b9c1b51eSKate Stone lldb::TypeFormatImplSP FormatCache::Entry::GetFormat() { return m_format_sp; } 7552b4b6cdSEnrico Granata 76*b9c1b51eSKate Stone lldb::TypeSummaryImplSP FormatCache::Entry::GetSummary() { 775548cb50SEnrico Granata return m_summary_sp; 785548cb50SEnrico Granata } 795548cb50SEnrico Granata 80*b9c1b51eSKate Stone lldb::SyntheticChildrenSP FormatCache::Entry::GetSynthetic() { 815548cb50SEnrico Granata return m_synthetic_sp; 825548cb50SEnrico Granata } 835548cb50SEnrico Granata 84*b9c1b51eSKate Stone lldb::TypeValidatorImplSP FormatCache::Entry::GetValidator() { 85c582713cSEnrico Granata return m_validator_sp; 86c582713cSEnrico Granata } 87c582713cSEnrico Granata 88*b9c1b51eSKate Stone void FormatCache::Entry::SetFormat(lldb::TypeFormatImplSP format_sp) { 8952b4b6cdSEnrico Granata m_format_cached = true; 9052b4b6cdSEnrico Granata m_format_sp = format_sp; 9152b4b6cdSEnrico Granata } 9252b4b6cdSEnrico Granata 93*b9c1b51eSKate Stone void FormatCache::Entry::SetSummary(lldb::TypeSummaryImplSP summary_sp) { 945548cb50SEnrico Granata m_summary_cached = true; 955548cb50SEnrico Granata m_summary_sp = summary_sp; 965548cb50SEnrico Granata } 975548cb50SEnrico Granata 98*b9c1b51eSKate Stone void FormatCache::Entry::SetSynthetic(lldb::SyntheticChildrenSP synthetic_sp) { 995548cb50SEnrico Granata m_synthetic_cached = true; 1005548cb50SEnrico Granata m_synthetic_sp = synthetic_sp; 1015548cb50SEnrico Granata } 1025548cb50SEnrico Granata 103*b9c1b51eSKate Stone void FormatCache::Entry::SetValidator(lldb::TypeValidatorImplSP validator_sp) { 104c582713cSEnrico Granata m_validator_cached = true; 105c582713cSEnrico Granata m_validator_sp = validator_sp; 106c582713cSEnrico Granata } 107c582713cSEnrico Granata 10816ff8604SSaleem Abdulrasool FormatCache::FormatCache() 109*b9c1b51eSKate Stone : m_map(), m_mutex() 1105548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 11116ff8604SSaleem Abdulrasool , 112*b9c1b51eSKate Stone m_cache_hits(0), m_cache_misses(0) 1135548cb50SEnrico Granata #endif 1145548cb50SEnrico Granata { 1155548cb50SEnrico Granata } 1165548cb50SEnrico Granata 117*b9c1b51eSKate Stone FormatCache::Entry &FormatCache::GetEntry(const ConstString &type) { 118*b9c1b51eSKate Stone auto i = m_map.find(type), e = m_map.end(); 1195548cb50SEnrico Granata if (i != e) 1205548cb50SEnrico Granata return i->second; 1215548cb50SEnrico Granata m_map[type] = FormatCache::Entry(); 1225548cb50SEnrico Granata return m_map[type]; 1235548cb50SEnrico Granata } 1245548cb50SEnrico Granata 125*b9c1b51eSKate Stone bool FormatCache::GetFormat(const ConstString &type, 126*b9c1b51eSKate Stone lldb::TypeFormatImplSP &format_sp) { 12716ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 12852b4b6cdSEnrico Granata auto entry = GetEntry(type); 129*b9c1b51eSKate Stone if (entry.IsFormatCached()) { 13052b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 13152b4b6cdSEnrico Granata m_cache_hits++; 13252b4b6cdSEnrico Granata #endif 13352b4b6cdSEnrico Granata format_sp = entry.GetFormat(); 13452b4b6cdSEnrico Granata return true; 13552b4b6cdSEnrico Granata } 13652b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 13752b4b6cdSEnrico Granata m_cache_misses++; 13852b4b6cdSEnrico Granata #endif 13952b4b6cdSEnrico Granata format_sp.reset(); 14052b4b6cdSEnrico Granata return false; 14152b4b6cdSEnrico Granata } 14252b4b6cdSEnrico Granata 143*b9c1b51eSKate Stone bool FormatCache::GetSummary(const ConstString &type, 144*b9c1b51eSKate Stone lldb::TypeSummaryImplSP &summary_sp) { 14516ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 1465548cb50SEnrico Granata auto entry = GetEntry(type); 147*b9c1b51eSKate Stone if (entry.IsSummaryCached()) { 1485548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1495548cb50SEnrico Granata m_cache_hits++; 1505548cb50SEnrico Granata #endif 1515548cb50SEnrico Granata summary_sp = entry.GetSummary(); 1525548cb50SEnrico Granata return true; 1535548cb50SEnrico Granata } 1545548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1555548cb50SEnrico Granata m_cache_misses++; 1565548cb50SEnrico Granata #endif 1575548cb50SEnrico Granata summary_sp.reset(); 1585548cb50SEnrico Granata return false; 1595548cb50SEnrico Granata } 1605548cb50SEnrico Granata 161*b9c1b51eSKate Stone bool FormatCache::GetSynthetic(const ConstString &type, 162*b9c1b51eSKate Stone lldb::SyntheticChildrenSP &synthetic_sp) { 16316ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 1645548cb50SEnrico Granata auto entry = GetEntry(type); 165*b9c1b51eSKate Stone if (entry.IsSyntheticCached()) { 1665548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1675548cb50SEnrico Granata m_cache_hits++; 1685548cb50SEnrico Granata #endif 1695548cb50SEnrico Granata synthetic_sp = entry.GetSynthetic(); 1705548cb50SEnrico Granata return true; 1715548cb50SEnrico Granata } 1725548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1735548cb50SEnrico Granata m_cache_misses++; 1745548cb50SEnrico Granata #endif 1755548cb50SEnrico Granata synthetic_sp.reset(); 1765548cb50SEnrico Granata return false; 1775548cb50SEnrico Granata } 1785548cb50SEnrico Granata 179*b9c1b51eSKate Stone bool FormatCache::GetValidator(const ConstString &type, 180*b9c1b51eSKate Stone lldb::TypeValidatorImplSP &validator_sp) { 18116ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 182c582713cSEnrico Granata auto entry = GetEntry(type); 183*b9c1b51eSKate Stone if (entry.IsValidatorCached()) { 184c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 185c582713cSEnrico Granata m_cache_hits++; 186c582713cSEnrico Granata #endif 187c582713cSEnrico Granata validator_sp = entry.GetValidator(); 188c582713cSEnrico Granata return true; 189c582713cSEnrico Granata } 190c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 191c582713cSEnrico Granata m_cache_misses++; 192c582713cSEnrico Granata #endif 193c582713cSEnrico Granata validator_sp.reset(); 194c582713cSEnrico Granata return false; 195c582713cSEnrico Granata } 196c582713cSEnrico Granata 197*b9c1b51eSKate Stone void FormatCache::SetFormat(const ConstString &type, 198*b9c1b51eSKate Stone lldb::TypeFormatImplSP &format_sp) { 19916ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 20052b4b6cdSEnrico Granata GetEntry(type).SetFormat(format_sp); 20152b4b6cdSEnrico Granata } 20252b4b6cdSEnrico Granata 203*b9c1b51eSKate Stone void FormatCache::SetSummary(const ConstString &type, 204*b9c1b51eSKate Stone lldb::TypeSummaryImplSP &summary_sp) { 20516ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 2065548cb50SEnrico Granata GetEntry(type).SetSummary(summary_sp); 2075548cb50SEnrico Granata } 2085548cb50SEnrico Granata 209*b9c1b51eSKate Stone void FormatCache::SetSynthetic(const ConstString &type, 210*b9c1b51eSKate Stone lldb::SyntheticChildrenSP &synthetic_sp) { 21116ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 2125548cb50SEnrico Granata GetEntry(type).SetSynthetic(synthetic_sp); 2135548cb50SEnrico Granata } 2145548cb50SEnrico Granata 215*b9c1b51eSKate Stone void FormatCache::SetValidator(const ConstString &type, 216*b9c1b51eSKate Stone lldb::TypeValidatorImplSP &validator_sp) { 21716ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 218c582713cSEnrico Granata GetEntry(type).SetValidator(validator_sp); 219c582713cSEnrico Granata } 220c582713cSEnrico Granata 221*b9c1b51eSKate Stone void FormatCache::Clear() { 22216ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 2235548cb50SEnrico Granata m_map.clear(); 2245548cb50SEnrico Granata } 225