15548cb50SEnrico Granata //===-- FormatCache.cpp ------------------------------------------*- C++ -*-===// 25548cb50SEnrico Granata // 35548cb50SEnrico Granata // The LLVM Compiler Infrastructure 45548cb50SEnrico Granata // 55548cb50SEnrico Granata // This file is distributed under the University of Illinois Open Source 65548cb50SEnrico Granata // License. See LICENSE.TXT for details. 75548cb50SEnrico Granata // 85548cb50SEnrico Granata //===----------------------------------------------------------------------===// 95548cb50SEnrico Granata 105548cb50SEnrico Granata // C Includes 115548cb50SEnrico Granata 125548cb50SEnrico Granata // C++ Includes 135548cb50SEnrico Granata 145548cb50SEnrico Granata // Other libraries and framework includes 155548cb50SEnrico Granata 165548cb50SEnrico Granata // Project includes 175548cb50SEnrico Granata #include "lldb/DataFormatters/FormatCache.h" 185548cb50SEnrico Granata 195548cb50SEnrico Granata using namespace lldb; 205548cb50SEnrico Granata using namespace lldb_private; 215548cb50SEnrico Granata 225548cb50SEnrico Granata FormatCache::Entry::Entry () : 2352b4b6cdSEnrico Granata m_format_cached(false), 245548cb50SEnrico Granata m_summary_cached(false), 255548cb50SEnrico Granata m_synthetic_cached(false), 26c582713cSEnrico Granata m_validator_cached(false), 2752b4b6cdSEnrico Granata m_format_sp(), 2830b95a36SDaniel Malea m_summary_sp(), 29c582713cSEnrico Granata m_synthetic_sp(), 30c582713cSEnrico Granata m_validator_sp() 315548cb50SEnrico Granata {} 325548cb50SEnrico Granata 3352b4b6cdSEnrico Granata FormatCache::Entry::Entry (lldb::TypeFormatImplSP format_sp) : 3452b4b6cdSEnrico Granata m_summary_cached(false), 350b464d48SDaniel Malea m_synthetic_cached(false), 36c582713cSEnrico Granata m_validator_cached(false), 3752b4b6cdSEnrico Granata m_summary_sp(), 38c582713cSEnrico Granata m_synthetic_sp(), 39c582713cSEnrico Granata m_validator_sp() 4052b4b6cdSEnrico Granata { 4152b4b6cdSEnrico Granata SetFormat (format_sp); 4252b4b6cdSEnrico Granata } 4352b4b6cdSEnrico Granata 4452b4b6cdSEnrico Granata FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp) : 4552b4b6cdSEnrico Granata m_format_cached(false), 4652b4b6cdSEnrico Granata m_synthetic_cached(false), 47c582713cSEnrico Granata m_validator_cached(false), 4852b4b6cdSEnrico Granata m_format_sp(), 49c582713cSEnrico Granata m_synthetic_sp(), 50c582713cSEnrico Granata m_validator_sp() 515548cb50SEnrico Granata { 525548cb50SEnrico Granata SetSummary (summary_sp); 535548cb50SEnrico Granata } 545548cb50SEnrico Granata 550b464d48SDaniel Malea FormatCache::Entry::Entry (lldb::SyntheticChildrenSP synthetic_sp) : 5652b4b6cdSEnrico Granata m_format_cached(false), 570b464d48SDaniel Malea m_summary_cached(false), 58c582713cSEnrico Granata m_validator_cached(false), 5952b4b6cdSEnrico Granata m_format_sp(), 60c582713cSEnrico Granata m_summary_sp(), 61c582713cSEnrico Granata m_validator_sp() 625548cb50SEnrico Granata { 635548cb50SEnrico Granata SetSynthetic (synthetic_sp); 645548cb50SEnrico Granata } 655548cb50SEnrico Granata 66c582713cSEnrico Granata FormatCache::Entry::Entry (lldb::TypeValidatorImplSP validator_sp) : 67c582713cSEnrico Granata m_format_cached(false), 68c582713cSEnrico Granata m_summary_cached(false), 69c582713cSEnrico Granata m_synthetic_cached(false), 70c582713cSEnrico Granata m_format_sp(), 71c582713cSEnrico Granata m_summary_sp(), 72c582713cSEnrico Granata m_synthetic_sp() 73c582713cSEnrico Granata { 74c582713cSEnrico Granata SetValidator (validator_sp); 75c582713cSEnrico Granata } 76c582713cSEnrico Granata 77c582713cSEnrico Granata FormatCache::Entry::Entry (lldb::TypeFormatImplSP format_sp, lldb::TypeSummaryImplSP summary_sp, lldb::SyntheticChildrenSP synthetic_sp, lldb::TypeValidatorImplSP validator_sp) 785548cb50SEnrico Granata { 7952b4b6cdSEnrico Granata SetFormat (format_sp); 805548cb50SEnrico Granata SetSummary (summary_sp); 815548cb50SEnrico Granata SetSynthetic (synthetic_sp); 82c582713cSEnrico Granata SetValidator (validator_sp); 835548cb50SEnrico Granata } 845548cb50SEnrico Granata 855548cb50SEnrico Granata bool 8652b4b6cdSEnrico Granata FormatCache::Entry::IsFormatCached () 8752b4b6cdSEnrico Granata { 8852b4b6cdSEnrico Granata return m_format_cached; 8952b4b6cdSEnrico Granata } 9052b4b6cdSEnrico Granata 9152b4b6cdSEnrico Granata bool 925548cb50SEnrico Granata FormatCache::Entry::IsSummaryCached () 935548cb50SEnrico Granata { 945548cb50SEnrico Granata return m_summary_cached; 955548cb50SEnrico Granata } 965548cb50SEnrico Granata 975548cb50SEnrico Granata bool 985548cb50SEnrico Granata FormatCache::Entry::IsSyntheticCached () 995548cb50SEnrico Granata { 1005548cb50SEnrico Granata return m_synthetic_cached; 1015548cb50SEnrico Granata } 1025548cb50SEnrico Granata 103c582713cSEnrico Granata bool 104c582713cSEnrico Granata FormatCache::Entry::IsValidatorCached () 105c582713cSEnrico Granata { 106c582713cSEnrico Granata return m_validator_cached; 107c582713cSEnrico Granata } 108c582713cSEnrico Granata 10952b4b6cdSEnrico Granata lldb::TypeFormatImplSP 11052b4b6cdSEnrico Granata FormatCache::Entry::GetFormat () 11152b4b6cdSEnrico Granata { 11252b4b6cdSEnrico Granata return m_format_sp; 11352b4b6cdSEnrico Granata } 11452b4b6cdSEnrico Granata 1155548cb50SEnrico Granata lldb::TypeSummaryImplSP 1165548cb50SEnrico Granata FormatCache::Entry::GetSummary () 1175548cb50SEnrico Granata { 1185548cb50SEnrico Granata return m_summary_sp; 1195548cb50SEnrico Granata } 1205548cb50SEnrico Granata 1215548cb50SEnrico Granata lldb::SyntheticChildrenSP 1225548cb50SEnrico Granata FormatCache::Entry::GetSynthetic () 1235548cb50SEnrico Granata { 1245548cb50SEnrico Granata return m_synthetic_sp; 1255548cb50SEnrico Granata } 1265548cb50SEnrico Granata 127c582713cSEnrico Granata lldb::TypeValidatorImplSP 128c582713cSEnrico Granata FormatCache::Entry::GetValidator () 129c582713cSEnrico Granata { 130c582713cSEnrico Granata return m_validator_sp; 131c582713cSEnrico Granata } 132c582713cSEnrico Granata 1335548cb50SEnrico Granata void 13452b4b6cdSEnrico Granata FormatCache::Entry::SetFormat (lldb::TypeFormatImplSP format_sp) 13552b4b6cdSEnrico Granata { 13652b4b6cdSEnrico Granata m_format_cached = true; 13752b4b6cdSEnrico Granata m_format_sp = format_sp; 13852b4b6cdSEnrico Granata } 13952b4b6cdSEnrico Granata 14052b4b6cdSEnrico Granata void 1415548cb50SEnrico Granata FormatCache::Entry::SetSummary (lldb::TypeSummaryImplSP summary_sp) 1425548cb50SEnrico Granata { 1435548cb50SEnrico Granata m_summary_cached = true; 1445548cb50SEnrico Granata m_summary_sp = summary_sp; 1455548cb50SEnrico Granata } 1465548cb50SEnrico Granata 1475548cb50SEnrico Granata void 1485548cb50SEnrico Granata FormatCache::Entry::SetSynthetic (lldb::SyntheticChildrenSP synthetic_sp) 1495548cb50SEnrico Granata { 1505548cb50SEnrico Granata m_synthetic_cached = true; 1515548cb50SEnrico Granata m_synthetic_sp = synthetic_sp; 1525548cb50SEnrico Granata } 1535548cb50SEnrico Granata 154c582713cSEnrico Granata void 155c582713cSEnrico Granata FormatCache::Entry::SetValidator (lldb::TypeValidatorImplSP validator_sp) 156c582713cSEnrico Granata { 157c582713cSEnrico Granata m_validator_cached = true; 158c582713cSEnrico Granata m_validator_sp = validator_sp; 159c582713cSEnrico Granata } 160c582713cSEnrico Granata 161*16ff8604SSaleem Abdulrasool FormatCache::FormatCache() 162*16ff8604SSaleem Abdulrasool : m_map(), 163*16ff8604SSaleem Abdulrasool m_mutex() 1645548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 165*16ff8604SSaleem Abdulrasool , 166*16ff8604SSaleem Abdulrasool m_cache_hits(0), 167*16ff8604SSaleem Abdulrasool m_cache_misses(0) 1685548cb50SEnrico Granata #endif 1695548cb50SEnrico Granata { 1705548cb50SEnrico Granata } 1715548cb50SEnrico Granata 1725548cb50SEnrico Granata FormatCache::Entry& 1735548cb50SEnrico Granata FormatCache::GetEntry (const ConstString& type) 1745548cb50SEnrico Granata { 1755548cb50SEnrico Granata auto i = m_map.find(type), 1765548cb50SEnrico Granata e = m_map.end(); 1775548cb50SEnrico Granata if (i != e) 1785548cb50SEnrico Granata return i->second; 1795548cb50SEnrico Granata m_map[type] = FormatCache::Entry(); 1805548cb50SEnrico Granata return m_map[type]; 1815548cb50SEnrico Granata } 1825548cb50SEnrico Granata 1835548cb50SEnrico Granata bool 18452b4b6cdSEnrico Granata FormatCache::GetFormat (const ConstString& type,lldb::TypeFormatImplSP& format_sp) 18552b4b6cdSEnrico Granata { 186*16ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 18752b4b6cdSEnrico Granata auto entry = GetEntry(type); 188c525d3d4SEnrico Granata if (entry.IsFormatCached()) 18952b4b6cdSEnrico Granata { 19052b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 19152b4b6cdSEnrico Granata m_cache_hits++; 19252b4b6cdSEnrico Granata #endif 19352b4b6cdSEnrico Granata format_sp = entry.GetFormat(); 19452b4b6cdSEnrico Granata return true; 19552b4b6cdSEnrico Granata } 19652b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 19752b4b6cdSEnrico Granata m_cache_misses++; 19852b4b6cdSEnrico Granata #endif 19952b4b6cdSEnrico Granata format_sp.reset(); 20052b4b6cdSEnrico Granata return false; 20152b4b6cdSEnrico Granata } 20252b4b6cdSEnrico Granata 20352b4b6cdSEnrico Granata bool 2045548cb50SEnrico Granata FormatCache::GetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp) 2055548cb50SEnrico Granata { 206*16ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 2075548cb50SEnrico Granata auto entry = GetEntry(type); 2085548cb50SEnrico Granata if (entry.IsSummaryCached()) 2095548cb50SEnrico Granata { 2105548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 2115548cb50SEnrico Granata m_cache_hits++; 2125548cb50SEnrico Granata #endif 2135548cb50SEnrico Granata summary_sp = entry.GetSummary(); 2145548cb50SEnrico Granata return true; 2155548cb50SEnrico Granata } 2165548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 2175548cb50SEnrico Granata m_cache_misses++; 2185548cb50SEnrico Granata #endif 2195548cb50SEnrico Granata summary_sp.reset(); 2205548cb50SEnrico Granata return false; 2215548cb50SEnrico Granata } 2225548cb50SEnrico Granata 2235548cb50SEnrico Granata bool 2245548cb50SEnrico Granata FormatCache::GetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp) 2255548cb50SEnrico Granata { 226*16ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 2275548cb50SEnrico Granata auto entry = GetEntry(type); 2285548cb50SEnrico Granata if (entry.IsSyntheticCached()) 2295548cb50SEnrico Granata { 2305548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 2315548cb50SEnrico Granata m_cache_hits++; 2325548cb50SEnrico Granata #endif 2335548cb50SEnrico Granata synthetic_sp = entry.GetSynthetic(); 2345548cb50SEnrico Granata return true; 2355548cb50SEnrico Granata } 2365548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 2375548cb50SEnrico Granata m_cache_misses++; 2385548cb50SEnrico Granata #endif 2395548cb50SEnrico Granata synthetic_sp.reset(); 2405548cb50SEnrico Granata return false; 2415548cb50SEnrico Granata } 2425548cb50SEnrico Granata 243c582713cSEnrico Granata bool 244c582713cSEnrico Granata FormatCache::GetValidator (const ConstString& type,lldb::TypeValidatorImplSP& validator_sp) 245c582713cSEnrico Granata { 246*16ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 247c582713cSEnrico Granata auto entry = GetEntry(type); 248c582713cSEnrico Granata if (entry.IsValidatorCached()) 249c582713cSEnrico Granata { 250c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 251c582713cSEnrico Granata m_cache_hits++; 252c582713cSEnrico Granata #endif 253c582713cSEnrico Granata validator_sp = entry.GetValidator(); 254c582713cSEnrico Granata return true; 255c582713cSEnrico Granata } 256c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 257c582713cSEnrico Granata m_cache_misses++; 258c582713cSEnrico Granata #endif 259c582713cSEnrico Granata validator_sp.reset(); 260c582713cSEnrico Granata return false; 261c582713cSEnrico Granata } 262c582713cSEnrico Granata 2635548cb50SEnrico Granata void 26452b4b6cdSEnrico Granata FormatCache::SetFormat (const ConstString& type,lldb::TypeFormatImplSP& format_sp) 26552b4b6cdSEnrico Granata { 266*16ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 26752b4b6cdSEnrico Granata GetEntry(type).SetFormat(format_sp); 26852b4b6cdSEnrico Granata } 26952b4b6cdSEnrico Granata 27052b4b6cdSEnrico Granata void 2715548cb50SEnrico Granata FormatCache::SetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp) 2725548cb50SEnrico Granata { 273*16ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 2745548cb50SEnrico Granata GetEntry(type).SetSummary(summary_sp); 2755548cb50SEnrico Granata } 2765548cb50SEnrico Granata 2775548cb50SEnrico Granata void 2785548cb50SEnrico Granata FormatCache::SetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp) 2795548cb50SEnrico Granata { 280*16ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 2815548cb50SEnrico Granata GetEntry(type).SetSynthetic(synthetic_sp); 2825548cb50SEnrico Granata } 2835548cb50SEnrico Granata 2845548cb50SEnrico Granata void 285c582713cSEnrico Granata FormatCache::SetValidator (const ConstString& type,lldb::TypeValidatorImplSP& validator_sp) 286c582713cSEnrico Granata { 287*16ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 288c582713cSEnrico Granata GetEntry(type).SetValidator(validator_sp); 289c582713cSEnrico Granata } 290c582713cSEnrico Granata 291c582713cSEnrico Granata void 2925548cb50SEnrico Granata FormatCache::Clear () 2935548cb50SEnrico Granata { 294*16ff8604SSaleem Abdulrasool std::lock_guard<std::recursive_mutex> guard(m_mutex); 2955548cb50SEnrico Granata m_map.clear(); 2965548cb50SEnrico Granata } 2975548cb50SEnrico Granata 298