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 () : 25*52b4b6cdSEnrico Granata m_format_cached(false), 265548cb50SEnrico Granata m_summary_cached(false), 275548cb50SEnrico Granata m_synthetic_cached(false), 28*52b4b6cdSEnrico Granata m_format_sp(), 2930b95a36SDaniel Malea m_summary_sp(), 3030b95a36SDaniel Malea m_synthetic_sp() 315548cb50SEnrico Granata {} 325548cb50SEnrico Granata 33*52b4b6cdSEnrico Granata FormatCache::Entry::Entry (lldb::TypeFormatImplSP format_sp) : 34*52b4b6cdSEnrico Granata m_summary_cached(false), 350b464d48SDaniel Malea m_synthetic_cached(false), 36*52b4b6cdSEnrico Granata m_summary_sp(), 37*52b4b6cdSEnrico Granata m_synthetic_sp() 38*52b4b6cdSEnrico Granata { 39*52b4b6cdSEnrico Granata SetFormat (format_sp); 40*52b4b6cdSEnrico Granata } 41*52b4b6cdSEnrico Granata 42*52b4b6cdSEnrico Granata FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp) : 43*52b4b6cdSEnrico Granata m_format_cached(false), 44*52b4b6cdSEnrico Granata m_synthetic_cached(false), 45*52b4b6cdSEnrico Granata m_format_sp(), 460b464d48SDaniel Malea m_synthetic_sp() 475548cb50SEnrico Granata { 485548cb50SEnrico Granata SetSummary (summary_sp); 495548cb50SEnrico Granata } 505548cb50SEnrico Granata 510b464d48SDaniel Malea FormatCache::Entry::Entry (lldb::SyntheticChildrenSP synthetic_sp) : 52*52b4b6cdSEnrico Granata m_format_cached(false), 530b464d48SDaniel Malea m_summary_cached(false), 54*52b4b6cdSEnrico Granata m_format_sp(), 550b464d48SDaniel Malea m_summary_sp() 565548cb50SEnrico Granata { 575548cb50SEnrico Granata SetSynthetic (synthetic_sp); 585548cb50SEnrico Granata } 595548cb50SEnrico Granata 60*52b4b6cdSEnrico Granata FormatCache::Entry::Entry (lldb::TypeFormatImplSP format_sp, lldb::TypeSummaryImplSP summary_sp, lldb::SyntheticChildrenSP synthetic_sp) 615548cb50SEnrico Granata { 62*52b4b6cdSEnrico Granata SetFormat (format_sp); 635548cb50SEnrico Granata SetSummary (summary_sp); 645548cb50SEnrico Granata SetSynthetic (synthetic_sp); 655548cb50SEnrico Granata } 665548cb50SEnrico Granata 675548cb50SEnrico Granata bool 68*52b4b6cdSEnrico Granata FormatCache::Entry::IsFormatCached () 69*52b4b6cdSEnrico Granata { 70*52b4b6cdSEnrico Granata return m_format_cached; 71*52b4b6cdSEnrico Granata } 72*52b4b6cdSEnrico Granata 73*52b4b6cdSEnrico Granata bool 745548cb50SEnrico Granata FormatCache::Entry::IsSummaryCached () 755548cb50SEnrico Granata { 765548cb50SEnrico Granata return m_summary_cached; 775548cb50SEnrico Granata } 785548cb50SEnrico Granata 795548cb50SEnrico Granata bool 805548cb50SEnrico Granata FormatCache::Entry::IsSyntheticCached () 815548cb50SEnrico Granata { 825548cb50SEnrico Granata return m_synthetic_cached; 835548cb50SEnrico Granata } 845548cb50SEnrico Granata 85*52b4b6cdSEnrico Granata lldb::TypeFormatImplSP 86*52b4b6cdSEnrico Granata FormatCache::Entry::GetFormat () 87*52b4b6cdSEnrico Granata { 88*52b4b6cdSEnrico Granata return m_format_sp; 89*52b4b6cdSEnrico Granata } 90*52b4b6cdSEnrico Granata 915548cb50SEnrico Granata lldb::TypeSummaryImplSP 925548cb50SEnrico Granata FormatCache::Entry::GetSummary () 935548cb50SEnrico Granata { 945548cb50SEnrico Granata return m_summary_sp; 955548cb50SEnrico Granata } 965548cb50SEnrico Granata 975548cb50SEnrico Granata lldb::SyntheticChildrenSP 985548cb50SEnrico Granata FormatCache::Entry::GetSynthetic () 995548cb50SEnrico Granata { 1005548cb50SEnrico Granata return m_synthetic_sp; 1015548cb50SEnrico Granata } 1025548cb50SEnrico Granata 1035548cb50SEnrico Granata void 104*52b4b6cdSEnrico Granata FormatCache::Entry::SetFormat (lldb::TypeFormatImplSP format_sp) 105*52b4b6cdSEnrico Granata { 106*52b4b6cdSEnrico Granata m_format_cached = true; 107*52b4b6cdSEnrico Granata m_format_sp = format_sp; 108*52b4b6cdSEnrico Granata } 109*52b4b6cdSEnrico Granata 110*52b4b6cdSEnrico Granata void 1115548cb50SEnrico Granata FormatCache::Entry::SetSummary (lldb::TypeSummaryImplSP summary_sp) 1125548cb50SEnrico Granata { 1135548cb50SEnrico Granata m_summary_cached = true; 1145548cb50SEnrico Granata m_summary_sp = summary_sp; 1155548cb50SEnrico Granata } 1165548cb50SEnrico Granata 1175548cb50SEnrico Granata void 1185548cb50SEnrico Granata FormatCache::Entry::SetSynthetic (lldb::SyntheticChildrenSP synthetic_sp) 1195548cb50SEnrico Granata { 1205548cb50SEnrico Granata m_synthetic_cached = true; 1215548cb50SEnrico Granata m_synthetic_sp = synthetic_sp; 1225548cb50SEnrico Granata } 1235548cb50SEnrico Granata 1245548cb50SEnrico Granata FormatCache::FormatCache () : 1255548cb50SEnrico Granata m_map(), 1265548cb50SEnrico Granata m_mutex (Mutex::eMutexTypeRecursive) 1275548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1285548cb50SEnrico Granata ,m_cache_hits(0),m_cache_misses(0) 1295548cb50SEnrico Granata #endif 1305548cb50SEnrico Granata { 1315548cb50SEnrico Granata } 1325548cb50SEnrico Granata 1335548cb50SEnrico Granata FormatCache::Entry& 1345548cb50SEnrico Granata FormatCache::GetEntry (const ConstString& type) 1355548cb50SEnrico Granata { 1365548cb50SEnrico Granata auto i = m_map.find(type), 1375548cb50SEnrico Granata e = m_map.end(); 1385548cb50SEnrico Granata if (i != e) 1395548cb50SEnrico Granata return i->second; 1405548cb50SEnrico Granata m_map[type] = FormatCache::Entry(); 1415548cb50SEnrico Granata return m_map[type]; 1425548cb50SEnrico Granata } 1435548cb50SEnrico Granata 1445548cb50SEnrico Granata bool 145*52b4b6cdSEnrico Granata FormatCache::GetFormat (const ConstString& type,lldb::TypeFormatImplSP& format_sp) 146*52b4b6cdSEnrico Granata { 147*52b4b6cdSEnrico Granata Mutex::Locker lock(m_mutex); 148*52b4b6cdSEnrico Granata auto entry = GetEntry(type); 149*52b4b6cdSEnrico Granata if (entry.IsSummaryCached()) 150*52b4b6cdSEnrico Granata { 151*52b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 152*52b4b6cdSEnrico Granata m_cache_hits++; 153*52b4b6cdSEnrico Granata #endif 154*52b4b6cdSEnrico Granata format_sp = entry.GetFormat(); 155*52b4b6cdSEnrico Granata return true; 156*52b4b6cdSEnrico Granata } 157*52b4b6cdSEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 158*52b4b6cdSEnrico Granata m_cache_misses++; 159*52b4b6cdSEnrico Granata #endif 160*52b4b6cdSEnrico Granata format_sp.reset(); 161*52b4b6cdSEnrico Granata return false; 162*52b4b6cdSEnrico Granata } 163*52b4b6cdSEnrico Granata 164*52b4b6cdSEnrico Granata bool 1655548cb50SEnrico Granata FormatCache::GetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp) 1665548cb50SEnrico Granata { 1675548cb50SEnrico Granata Mutex::Locker lock(m_mutex); 1685548cb50SEnrico Granata auto entry = GetEntry(type); 1695548cb50SEnrico Granata if (entry.IsSummaryCached()) 1705548cb50SEnrico Granata { 1715548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1725548cb50SEnrico Granata m_cache_hits++; 1735548cb50SEnrico Granata #endif 1745548cb50SEnrico Granata summary_sp = entry.GetSummary(); 1755548cb50SEnrico Granata return true; 1765548cb50SEnrico Granata } 1775548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1785548cb50SEnrico Granata m_cache_misses++; 1795548cb50SEnrico Granata #endif 1805548cb50SEnrico Granata summary_sp.reset(); 1815548cb50SEnrico Granata return false; 1825548cb50SEnrico Granata } 1835548cb50SEnrico Granata 1845548cb50SEnrico Granata bool 1855548cb50SEnrico Granata FormatCache::GetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp) 1865548cb50SEnrico Granata { 1875548cb50SEnrico Granata Mutex::Locker lock(m_mutex); 1885548cb50SEnrico Granata auto entry = GetEntry(type); 1895548cb50SEnrico Granata if (entry.IsSyntheticCached()) 1905548cb50SEnrico Granata { 1915548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1925548cb50SEnrico Granata m_cache_hits++; 1935548cb50SEnrico Granata #endif 1945548cb50SEnrico Granata synthetic_sp = entry.GetSynthetic(); 1955548cb50SEnrico Granata return true; 1965548cb50SEnrico Granata } 1975548cb50SEnrico Granata #ifdef LLDB_CONFIGURATION_DEBUG 1985548cb50SEnrico Granata m_cache_misses++; 1995548cb50SEnrico Granata #endif 2005548cb50SEnrico Granata synthetic_sp.reset(); 2015548cb50SEnrico Granata return false; 2025548cb50SEnrico Granata } 2035548cb50SEnrico Granata 2045548cb50SEnrico Granata void 205*52b4b6cdSEnrico Granata FormatCache::SetFormat (const ConstString& type,lldb::TypeFormatImplSP& format_sp) 206*52b4b6cdSEnrico Granata { 207*52b4b6cdSEnrico Granata Mutex::Locker lock(m_mutex); 208*52b4b6cdSEnrico Granata GetEntry(type).SetFormat(format_sp); 209*52b4b6cdSEnrico Granata } 210*52b4b6cdSEnrico Granata 211*52b4b6cdSEnrico Granata void 2125548cb50SEnrico Granata FormatCache::SetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp) 2135548cb50SEnrico Granata { 2145548cb50SEnrico Granata Mutex::Locker lock(m_mutex); 2155548cb50SEnrico Granata GetEntry(type).SetSummary(summary_sp); 2165548cb50SEnrico Granata } 2175548cb50SEnrico Granata 2185548cb50SEnrico Granata void 2195548cb50SEnrico Granata FormatCache::SetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp) 2205548cb50SEnrico Granata { 2215548cb50SEnrico Granata Mutex::Locker lock(m_mutex); 2225548cb50SEnrico Granata GetEntry(type).SetSynthetic(synthetic_sp); 2235548cb50SEnrico Granata } 2245548cb50SEnrico Granata 2255548cb50SEnrico Granata void 2265548cb50SEnrico Granata FormatCache::Clear () 2275548cb50SEnrico Granata { 2285548cb50SEnrico Granata Mutex::Locker lock(m_mutex); 2295548cb50SEnrico Granata m_map.clear(); 2305548cb50SEnrico Granata } 2315548cb50SEnrico Granata 232