1f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//===-- FormatCache.cpp ------------------------------------------*- C++ -*-===// 2f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// 3f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// The LLVM Compiler Infrastructure 4f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// 5f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// This file is distributed under the University of Illinois Open Source 6f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// License. See LICENSE.TXT for details. 7f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// 8f509c5ec066599a3399fced39ea36996184939e8Enrico Granata//===----------------------------------------------------------------------===// 9f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 10fe21d4f351f560921e615a6677afe1c057aa7f28Matt Kopec#include "lldb/lldb-python.h" 11fe21d4f351f560921e615a6677afe1c057aa7f28Matt Kopec 12f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// C Includes 13f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 14f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// C++ Includes 15f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 16f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// Other libraries and framework includes 17f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 18f509c5ec066599a3399fced39ea36996184939e8Enrico Granata// Project includes 19f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#include "lldb/DataFormatters/FormatCache.h" 20f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 21f509c5ec066599a3399fced39ea36996184939e8Enrico Granatausing namespace lldb; 22f509c5ec066599a3399fced39ea36996184939e8Enrico Granatausing namespace lldb_private; 23f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 24f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::Entry () : 25f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_summary_cached(false), 26f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_synthetic_cached(false), 2777332ba5320cb506c5ccec65cc6d4e6107aaa374Daniel Maleam_summary_sp(), 2877332ba5320cb506c5ccec65cc6d4e6107aaa374Daniel Maleam_synthetic_sp() 29f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{} 30f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 318aaa52329ade20107fe28af7085b0a1f395816a8Todd FialaFormatCache::Entry::Entry (const Entry& rhs) : 328aaa52329ade20107fe28af7085b0a1f395816a8Todd Fialam_summary_cached(rhs.m_summary_cached), 338aaa52329ade20107fe28af7085b0a1f395816a8Todd Fialam_synthetic_cached(rhs.m_synthetic_cached), 348aaa52329ade20107fe28af7085b0a1f395816a8Todd Fialam_summary_sp(rhs.m_summary_sp), 358aaa52329ade20107fe28af7085b0a1f395816a8Todd Fialam_synthetic_sp(rhs.m_synthetic_sp) 368aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala{} 378aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala 3804334199f3c719e958c7eec6e25152c2bab9ad5eDaniel MaleaFormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp) : 3904334199f3c719e958c7eec6e25152c2bab9ad5eDaniel Maleam_synthetic_cached(false), 4004334199f3c719e958c7eec6e25152c2bab9ad5eDaniel Maleam_synthetic_sp() 41f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 42f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SetSummary (summary_sp); 43f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 44f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 4504334199f3c719e958c7eec6e25152c2bab9ad5eDaniel MaleaFormatCache::Entry::Entry (lldb::SyntheticChildrenSP synthetic_sp) : 4604334199f3c719e958c7eec6e25152c2bab9ad5eDaniel Maleam_summary_cached(false), 4704334199f3c719e958c7eec6e25152c2bab9ad5eDaniel Maleam_summary_sp() 48f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 49f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SetSynthetic (synthetic_sp); 50f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 51f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 5204334199f3c719e958c7eec6e25152c2bab9ad5eDaniel MaleaFormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp,lldb::SyntheticChildrenSP synthetic_sp) 53f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 54f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SetSummary (summary_sp); 55f509c5ec066599a3399fced39ea36996184939e8Enrico Granata SetSynthetic (synthetic_sp); 56f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 57f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 588aaa52329ade20107fe28af7085b0a1f395816a8Todd FialaFormatCache::Entry& FormatCache::Entry::operator= (const Entry& rhs) 598aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala{ 608aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala if (this == &rhs) 618aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala return *this; 628aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala 638aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala m_summary_cached = rhs.m_summary_cached; 648aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala m_synthetic_cached = rhs.m_synthetic_cached; 658aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala m_summary_sp = rhs.m_summary_sp; 668aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala m_synthetic_sp = rhs.m_synthetic_sp; 678aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala return *this; 688aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala} 698aaa52329ade20107fe28af7085b0a1f395816a8Todd Fiala 70f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool 71f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::IsSummaryCached () 72f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 73f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return m_summary_cached; 74f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 75f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 76f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool 77f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::IsSyntheticCached () 78f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 79f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return m_synthetic_cached; 80f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 81f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 82f509c5ec066599a3399fced39ea36996184939e8Enrico Granatalldb::TypeSummaryImplSP 83f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::GetSummary () 84f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 85f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return m_summary_sp; 86f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 87f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 88f509c5ec066599a3399fced39ea36996184939e8Enrico Granatalldb::SyntheticChildrenSP 89f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::GetSynthetic () 90f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 91f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return m_synthetic_sp; 92f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 93f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 94f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid 95f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::SetSummary (lldb::TypeSummaryImplSP summary_sp) 96f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 97f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_summary_cached = true; 98f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_summary_sp = summary_sp; 99f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 100f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 101f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid 102f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry::SetSynthetic (lldb::SyntheticChildrenSP synthetic_sp) 103f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 104f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_synthetic_cached = true; 105f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_synthetic_sp = synthetic_sp; 106f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 107f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 108f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::FormatCache () : 109f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_map(), 110f509c5ec066599a3399fced39ea36996184939e8Enrico Granatam_mutex (Mutex::eMutexTypeRecursive) 111f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG 112f509c5ec066599a3399fced39ea36996184939e8Enrico Granata,m_cache_hits(0),m_cache_misses(0) 113f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif 114f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 115f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 116f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 117f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Entry& 118f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::GetEntry (const ConstString& type) 119f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 120f509c5ec066599a3399fced39ea36996184939e8Enrico Granata auto i = m_map.find(type), 121f509c5ec066599a3399fced39ea36996184939e8Enrico Granata e = m_map.end(); 122f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (i != e) 123f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return i->second; 124f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_map[type] = FormatCache::Entry(); 125f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return m_map[type]; 126f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 127f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 128f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool 129f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::GetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp) 130f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 131f509c5ec066599a3399fced39ea36996184939e8Enrico Granata Mutex::Locker lock(m_mutex); 132f509c5ec066599a3399fced39ea36996184939e8Enrico Granata auto entry = GetEntry(type); 133f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (entry.IsSummaryCached()) 134f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 135f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG 136f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_cache_hits++; 137f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif 138f509c5ec066599a3399fced39ea36996184939e8Enrico Granata summary_sp = entry.GetSummary(); 139f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return true; 140f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 141f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG 142f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_cache_misses++; 143f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif 144f509c5ec066599a3399fced39ea36996184939e8Enrico Granata summary_sp.reset(); 145f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return false; 146f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 147f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 148f509c5ec066599a3399fced39ea36996184939e8Enrico Granatabool 149f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::GetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp) 150f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 151f509c5ec066599a3399fced39ea36996184939e8Enrico Granata Mutex::Locker lock(m_mutex); 152f509c5ec066599a3399fced39ea36996184939e8Enrico Granata auto entry = GetEntry(type); 153f509c5ec066599a3399fced39ea36996184939e8Enrico Granata if (entry.IsSyntheticCached()) 154f509c5ec066599a3399fced39ea36996184939e8Enrico Granata { 155f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG 156f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_cache_hits++; 157f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif 158f509c5ec066599a3399fced39ea36996184939e8Enrico Granata synthetic_sp = entry.GetSynthetic(); 159f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return true; 160f509c5ec066599a3399fced39ea36996184939e8Enrico Granata } 161f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#ifdef LLDB_CONFIGURATION_DEBUG 162f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_cache_misses++; 163f509c5ec066599a3399fced39ea36996184939e8Enrico Granata#endif 164f509c5ec066599a3399fced39ea36996184939e8Enrico Granata synthetic_sp.reset(); 165f509c5ec066599a3399fced39ea36996184939e8Enrico Granata return false; 166f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 167f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 168f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid 169f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::SetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp) 170f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 171f509c5ec066599a3399fced39ea36996184939e8Enrico Granata Mutex::Locker lock(m_mutex); 172f509c5ec066599a3399fced39ea36996184939e8Enrico Granata GetEntry(type).SetSummary(summary_sp); 173f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 174f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 175f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid 176f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::SetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp) 177f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 178f509c5ec066599a3399fced39ea36996184939e8Enrico Granata Mutex::Locker lock(m_mutex); 179f509c5ec066599a3399fced39ea36996184939e8Enrico Granata GetEntry(type).SetSynthetic(synthetic_sp); 180f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 181f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 182f509c5ec066599a3399fced39ea36996184939e8Enrico Granatavoid 183f509c5ec066599a3399fced39ea36996184939e8Enrico GranataFormatCache::Clear () 184f509c5ec066599a3399fced39ea36996184939e8Enrico Granata{ 185f509c5ec066599a3399fced39ea36996184939e8Enrico Granata Mutex::Locker lock(m_mutex); 186f509c5ec066599a3399fced39ea36996184939e8Enrico Granata m_map.clear(); 187f509c5ec066599a3399fced39ea36996184939e8Enrico Granata} 188f509c5ec066599a3399fced39ea36996184939e8Enrico Granata 189