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 10676a4875SMatt Kopec #include "lldb/lldb-python.h" 11676a4875SMatt Kopec 125548cb50SEnrico Granata // C Includes 135548cb50SEnrico Granata 145548cb50SEnrico Granata // C++ Includes 155548cb50SEnrico Granata 165548cb50SEnrico Granata // Other libraries and framework includes 175548cb50SEnrico Granata 185548cb50SEnrico Granata // Project includes 195548cb50SEnrico Granata #include "lldb/DataFormatters/FormatCache.h" 205548cb50SEnrico Granata 215548cb50SEnrico Granata using namespace lldb; 225548cb50SEnrico Granata using namespace lldb_private; 235548cb50SEnrico Granata 245548cb50SEnrico Granata FormatCache::Entry::Entry () : 2552b4b6cdSEnrico Granata m_format_cached(false), 265548cb50SEnrico Granata m_summary_cached(false), 275548cb50SEnrico Granata m_synthetic_cached(false), 28*c582713cSEnrico Granata m_validator_cached(false), 2952b4b6cdSEnrico Granata m_format_sp(), 3030b95a36SDaniel Malea m_summary_sp(), 31*c582713cSEnrico Granata m_synthetic_sp(), 32*c582713cSEnrico Granata m_validator_sp() 335548cb50SEnrico Granata {} 345548cb50SEnrico Granata 3552b4b6cdSEnrico Granata FormatCache::Entry::Entry (lldb::TypeFormatImplSP format_sp) : 3652b4b6cdSEnrico Granata m_summary_cached(false), 370b464d48SDaniel Malea m_synthetic_cached(false), 38*c582713cSEnrico Granata m_validator_cached(false), 3952b4b6cdSEnrico Granata m_summary_sp(), 40*c582713cSEnrico Granata m_synthetic_sp(), 41*c582713cSEnrico Granata m_validator_sp() 4252b4b6cdSEnrico Granata { 4352b4b6cdSEnrico Granata SetFormat (format_sp); 4452b4b6cdSEnrico Granata } 4552b4b6cdSEnrico Granata 4652b4b6cdSEnrico Granata FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp) : 4752b4b6cdSEnrico Granata m_format_cached(false), 4852b4b6cdSEnrico Granata m_synthetic_cached(false), 49*c582713cSEnrico Granata m_validator_cached(false), 5052b4b6cdSEnrico Granata m_format_sp(), 51*c582713cSEnrico Granata m_synthetic_sp(), 52*c582713cSEnrico Granata m_validator_sp() 535548cb50SEnrico Granata { 545548cb50SEnrico Granata SetSummary (summary_sp); 555548cb50SEnrico Granata } 565548cb50SEnrico Granata 570b464d48SDaniel Malea FormatCache::Entry::Entry (lldb::SyntheticChildrenSP synthetic_sp) : 5852b4b6cdSEnrico Granata m_format_cached(false), 590b464d48SDaniel Malea m_summary_cached(false), 60*c582713cSEnrico Granata m_validator_cached(false), 6152b4b6cdSEnrico Granata m_format_sp(), 62*c582713cSEnrico Granata m_summary_sp(), 63*c582713cSEnrico Granata m_validator_sp() 645548cb50SEnrico Granata { 655548cb50SEnrico Granata SetSynthetic (synthetic_sp); 665548cb50SEnrico Granata } 675548cb50SEnrico Granata 68*c582713cSEnrico Granata FormatCache::Entry::Entry (lldb::TypeValidatorImplSP validator_sp) : 69*c582713cSEnrico Granata m_format_cached(false), 70*c582713cSEnrico Granata m_summary_cached(false), 71*c582713cSEnrico Granata m_synthetic_cached(false), 72*c582713cSEnrico Granata m_format_sp(), 73*c582713cSEnrico Granata m_summary_sp(), 74*c582713cSEnrico Granata m_synthetic_sp() 75*c582713cSEnrico Granata { 76*c582713cSEnrico Granata SetValidator (validator_sp); 77*c582713cSEnrico Granata } 78*c582713cSEnrico Granata 79*c582713cSEnrico Granata FormatCache::Entry::Entry (lldb::TypeFormatImplSP format_sp, lldb::TypeSummaryImplSP summary_sp, lldb::SyntheticChildrenSP synthetic_sp, lldb::TypeValidatorImplSP validator_sp) 805548cb50SEnrico Granata { 8152b4b6cdSEnrico Granata SetFormat (format_sp); 825548cb50SEnrico Granata SetSummary (summary_sp); 835548cb50SEnrico Granata SetSynthetic (synthetic_sp); 84*c582713cSEnrico Granata SetValidator (validator_sp); 855548cb50SEnrico Granata } 865548cb50SEnrico Granata 875548cb50SEnrico Granata bool 8852b4b6cdSEnrico Granata FormatCache::Entry::IsFormatCached () 8952b4b6cdSEnrico Granata { 9052b4b6cdSEnrico Granata return m_format_cached; 9152b4b6cdSEnrico Granata } 9252b4b6cdSEnrico Granata 9352b4b6cdSEnrico Granata bool 945548cb50SEnrico Granata FormatCache::Entry::IsSummaryCached () 955548cb50SEnrico Granata { 965548cb50SEnrico Granata return m_summary_cached; 975548cb50SEnrico Granata } 985548cb50SEnrico Granata 995548cb50SEnrico Granata bool 1005548cb50SEnrico Granata FormatCache::Entry::IsSyntheticCached () 1015548cb50SEnrico Granata { 1025548cb50SEnrico Granata return m_synthetic_cached; 1035548cb50SEnrico Granata } 1045548cb50SEnrico Granata 105*c582713cSEnrico Granata bool 106*c582713cSEnrico Granata FormatCache::Entry::IsValidatorCached () 107*c582713cSEnrico Granata { 108*c582713cSEnrico Granata return m_validator_cached; 109*c582713cSEnrico Granata } 110*c582713cSEnrico Granata 11152b4b6cdSEnrico Granata lldb::TypeFormatImplSP 11252b4b6cdSEnrico Granata FormatCache::Entry::GetFormat () 11352b4b6cdSEnrico Granata { 11452b4b6cdSEnrico Granata return m_format_sp; 11552b4b6cdSEnrico Granata } 11652b4b6cdSEnrico Granata 1175548cb50SEnrico Granata lldb::TypeSummaryImplSP 1185548cb50SEnrico Granata FormatCache::Entry::GetSummary () 1195548cb50SEnrico Granata { 1205548cb50SEnrico Granata return m_summary_sp; 1215548cb50SEnrico Granata } 1225548cb50SEnrico Granata 1235548cb50SEnrico Granata lldb::SyntheticChildrenSP 1245548cb50SEnrico Granata FormatCache::Entry::GetSynthetic () 1255548cb50SEnrico Granata { 1265548cb50SEnrico Granata return m_synthetic_sp; 1275548cb50SEnrico Granata } 1285548cb50SEnrico Granata 129*c582713cSEnrico Granata lldb::TypeValidatorImplSP 130*c582713cSEnrico Granata FormatCache::Entry::GetValidator () 131*c582713cSEnrico Granata { 132*c582713cSEnrico Granata return m_validator_sp; 133*c582713cSEnrico Granata } 134*c582713cSEnrico Granata 1355548cb50SEnrico Granata void 13652b4b6cdSEnrico Granata FormatCache::Entry::SetFormat (lldb::TypeFormatImplSP format_sp) 13752b4b6cdSEnrico Granata { 13852b4b6cdSEnrico Granata m_format_cached = true; 13952b4b6cdSEnrico Granata m_format_sp = format_sp; 14052b4b6cdSEnrico Granata } 14152b4b6cdSEnrico Granata 14252b4b6cdSEnrico Granata void 1435548cb50SEnrico Granata FormatCache::Entry::SetSummary (lldb::TypeSummaryImplSP summary_sp) 1445548cb50SEnrico Granata { 1455548cb50SEnrico Granata m_summary_cached = true; 1465548cb50SEnrico Granata m_summary_sp = summary_sp; 1475548cb50SEnrico Granata } 1485548cb50SEnrico Granata 1495548cb50SEnrico Granata void 1505548cb50SEnrico Granata FormatCache::Entry::SetSynthetic (lldb::SyntheticChildrenSP synthetic_sp) 1515548cb50SEnrico Granata { 1525548cb50SEnrico Granata m_synthetic_cached = true; 1535548cb50SEnrico Granata m_synthetic_sp = synthetic_sp; 1545548cb50SEnrico Granata } 1555548cb50SEnrico Granata 156*c582713cSEnrico Granata void 157*c582713cSEnrico Granata FormatCache::Entry::SetValidator (lldb::TypeValidatorImplSP validator_sp) 158*c582713cSEnrico Granata { 159*c582713cSEnrico Granata m_validator_cached = true; 160*c582713cSEnrico Granata m_validator_sp = validator_sp; 161*c582713cSEnrico Granata } 162*c582713cSEnrico Granata 1635548cb50SEnrico Granata FormatCache::FormatCache () : 1645548cb50SEnrico Granata m_map(), 1655548cb50SEnrico Granata m_mutex (Mutex::eMutexTypeRecursive) 1665548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1675548cb50SEnrico Granata ,m_cache_hits(0),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 { 18652b4b6cdSEnrico Granata Mutex::Locker lock(m_mutex); 18752b4b6cdSEnrico Granata auto entry = GetEntry(type); 18852b4b6cdSEnrico Granata if (entry.IsSummaryCached()) 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 { 2065548cb50SEnrico Granata Mutex::Locker lock(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 { 2265548cb50SEnrico Granata Mutex::Locker lock(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 243*c582713cSEnrico Granata bool 244*c582713cSEnrico Granata FormatCache::GetValidator (const ConstString& type,lldb::TypeValidatorImplSP& validator_sp) 245*c582713cSEnrico Granata { 246*c582713cSEnrico Granata Mutex::Locker lock(m_mutex); 247*c582713cSEnrico Granata auto entry = GetEntry(type); 248*c582713cSEnrico Granata if (entry.IsValidatorCached()) 249*c582713cSEnrico Granata { 250*c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 251*c582713cSEnrico Granata m_cache_hits++; 252*c582713cSEnrico Granata #endif 253*c582713cSEnrico Granata validator_sp = entry.GetValidator(); 254*c582713cSEnrico Granata return true; 255*c582713cSEnrico Granata } 256*c582713cSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 257*c582713cSEnrico Granata m_cache_misses++; 258*c582713cSEnrico Granata #endif 259*c582713cSEnrico Granata validator_sp.reset(); 260*c582713cSEnrico Granata return false; 261*c582713cSEnrico Granata } 262*c582713cSEnrico Granata 2635548cb50SEnrico Granata void 26452b4b6cdSEnrico Granata FormatCache::SetFormat (const ConstString& type,lldb::TypeFormatImplSP& format_sp) 26552b4b6cdSEnrico Granata { 26652b4b6cdSEnrico Granata Mutex::Locker lock(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 { 2735548cb50SEnrico Granata Mutex::Locker lock(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 { 2805548cb50SEnrico Granata Mutex::Locker lock(m_mutex); 2815548cb50SEnrico Granata GetEntry(type).SetSynthetic(synthetic_sp); 2825548cb50SEnrico Granata } 2835548cb50SEnrico Granata 2845548cb50SEnrico Granata void 285*c582713cSEnrico Granata FormatCache::SetValidator (const ConstString& type,lldb::TypeValidatorImplSP& validator_sp) 286*c582713cSEnrico Granata { 287*c582713cSEnrico Granata Mutex::Locker lock(m_mutex); 288*c582713cSEnrico Granata GetEntry(type).SetValidator(validator_sp); 289*c582713cSEnrico Granata } 290*c582713cSEnrico Granata 291*c582713cSEnrico Granata void 2925548cb50SEnrico Granata FormatCache::Clear () 2935548cb50SEnrico Granata { 2945548cb50SEnrico Granata Mutex::Locker lock(m_mutex); 2955548cb50SEnrico Granata m_map.clear(); 2965548cb50SEnrico Granata } 2975548cb50SEnrico Granata 298