diff options
Diffstat (limited to 'contrib/llvm-project/lldb/source/DataFormatters/FormatCache.cpp')
-rw-r--r-- | contrib/llvm-project/lldb/source/DataFormatters/FormatCache.cpp | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/contrib/llvm-project/lldb/source/DataFormatters/FormatCache.cpp b/contrib/llvm-project/lldb/source/DataFormatters/FormatCache.cpp new file mode 100644 index 000000000000..6c83b36e79de --- /dev/null +++ b/contrib/llvm-project/lldb/source/DataFormatters/FormatCache.cpp @@ -0,0 +1,113 @@ +//===-- FormatCache.cpp ---------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + + + + +#include "lldb/DataFormatters/FormatCache.h" + +using namespace lldb; +using namespace lldb_private; + +FormatCache::Entry::Entry() + : m_format_cached(false), m_summary_cached(false), + m_synthetic_cached(false) {} + +bool FormatCache::Entry::IsFormatCached() { return m_format_cached; } + +bool FormatCache::Entry::IsSummaryCached() { return m_summary_cached; } + +bool FormatCache::Entry::IsSyntheticCached() { return m_synthetic_cached; } + +void FormatCache::Entry::Get(lldb::TypeFormatImplSP &retval) { + retval = m_format_sp; +} + +void FormatCache::Entry::Get(lldb::TypeSummaryImplSP &retval) { + retval = m_summary_sp; +} + +void FormatCache::Entry::Get(lldb::SyntheticChildrenSP &retval) { + retval = m_synthetic_sp; +} + +void FormatCache::Entry::Set(lldb::TypeFormatImplSP format_sp) { + m_format_cached = true; + m_format_sp = format_sp; +} + +void FormatCache::Entry::Set(lldb::TypeSummaryImplSP summary_sp) { + m_summary_cached = true; + m_summary_sp = summary_sp; +} + +void FormatCache::Entry::Set(lldb::SyntheticChildrenSP synthetic_sp) { + m_synthetic_cached = true; + m_synthetic_sp = synthetic_sp; +} + +namespace lldb_private { + +template<> bool FormatCache::Entry::IsCached<lldb::TypeFormatImplSP>() { + return IsFormatCached(); +} +template<> bool FormatCache::Entry::IsCached<lldb::TypeSummaryImplSP> () { + return IsSummaryCached(); +} +template<> bool FormatCache::Entry::IsCached<lldb::SyntheticChildrenSP>() { + return IsSyntheticCached(); +} + +} // namespace lldb_private + +template <typename ImplSP> +bool FormatCache::Get(ConstString type, ImplSP &format_impl_sp) { + std::lock_guard<std::recursive_mutex> guard(m_mutex); + auto entry = m_entries[type]; + if (entry.IsCached<ImplSP>()) { + m_cache_hits++; + entry.Get(format_impl_sp); + return true; + } + m_cache_misses++; + format_impl_sp.reset(); + return false; +} + +/// Explicit instantiations for the three types. +/// \{ +template bool +FormatCache::Get<lldb::TypeFormatImplSP>(ConstString, lldb::TypeFormatImplSP &); +template bool +FormatCache::Get<lldb::TypeSummaryImplSP>(ConstString, + lldb::TypeSummaryImplSP &); +template bool +FormatCache::Get<lldb::SyntheticChildrenSP>(ConstString, + lldb::SyntheticChildrenSP &); +/// \} + +void FormatCache::Set(ConstString type, lldb::TypeFormatImplSP &format_sp) { + std::lock_guard<std::recursive_mutex> guard(m_mutex); + m_entries[type].Set(format_sp); +} + +void FormatCache::Set(ConstString type, lldb::TypeSummaryImplSP &summary_sp) { + std::lock_guard<std::recursive_mutex> guard(m_mutex); + m_entries[type].Set(summary_sp); +} + +void FormatCache::Set(ConstString type, + lldb::SyntheticChildrenSP &synthetic_sp) { + std::lock_guard<std::recursive_mutex> guard(m_mutex); + m_entries[type].Set(synthetic_sp); +} + +void FormatCache::Clear() { + std::lock_guard<std::recursive_mutex> guard(m_mutex); + m_entries.clear(); +} |