2013-01-29 07:47:25 +08:00
|
|
|
//===-- FormatCache.cpp ------------------------------------------*- C++
|
|
|
|
//-*-===//
|
|
|
|
//
|
2019-01-19 16:50:56 +08:00
|
|
|
// 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
|
2013-01-29 07:47:25 +08:00
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "lldb/DataFormatters/FormatCache.h"
|
|
|
|
|
|
|
|
using namespace lldb;
|
|
|
|
using namespace lldb_private;
|
|
|
|
|
|
|
|
FormatCache::Entry::Entry()
|
|
|
|
: m_format_cached(false), m_summary_cached(false),
|
2013-10-18 06:27:19 +08:00
|
|
|
m_synthetic_cached(false), m_validator_cached(false), m_format_sp(),
|
2014-09-06 04:45:07 +08:00
|
|
|
m_summary_sp(), m_synthetic_sp(), m_validator_sp() {}
|
2013-10-18 06:27:19 +08:00
|
|
|
|
2013-02-07 00:46:40 +08:00
|
|
|
FormatCache::Entry::Entry(lldb::TypeFormatImplSP format_sp)
|
|
|
|
: m_summary_cached(false), m_synthetic_cached(false),
|
2014-09-06 04:45:07 +08:00
|
|
|
m_validator_cached(false), m_summary_sp(), m_synthetic_sp(),
|
|
|
|
m_validator_sp() {
|
2013-01-29 07:47:25 +08:00
|
|
|
SetFormat(format_sp);
|
|
|
|
}
|
|
|
|
|
2013-02-07 00:46:40 +08:00
|
|
|
FormatCache::Entry::Entry(lldb::TypeSummaryImplSP summary_sp)
|
2013-10-18 06:27:19 +08:00
|
|
|
: m_format_cached(false), m_synthetic_cached(false),
|
2014-09-06 04:45:07 +08:00
|
|
|
m_validator_cached(false), m_format_sp(), m_synthetic_sp(),
|
|
|
|
m_validator_sp() {
|
2013-01-29 07:47:25 +08:00
|
|
|
SetSummary(summary_sp);
|
|
|
|
}
|
|
|
|
|
2014-09-06 04:45:07 +08:00
|
|
|
FormatCache::Entry::Entry(lldb::SyntheticChildrenSP synthetic_sp)
|
|
|
|
: m_format_cached(false), m_summary_cached(false),
|
|
|
|
m_validator_cached(false), m_format_sp(), m_summary_sp(),
|
|
|
|
m_validator_sp() {
|
|
|
|
SetSynthetic(synthetic_sp);
|
|
|
|
}
|
|
|
|
|
|
|
|
FormatCache::Entry::Entry(lldb::TypeValidatorImplSP validator_sp)
|
|
|
|
: m_format_cached(false), m_summary_cached(false),
|
|
|
|
m_synthetic_cached(false), m_format_sp(), m_summary_sp(),
|
2013-01-29 07:47:25 +08:00
|
|
|
m_synthetic_sp() {
|
2014-09-06 04:45:07 +08:00
|
|
|
SetValidator(validator_sp);
|
2013-01-29 07:47:25 +08:00
|
|
|
}
|
|
|
|
|
2013-10-18 06:27:19 +08:00
|
|
|
FormatCache::Entry::Entry(lldb::TypeFormatImplSP format_sp,
|
2013-01-29 07:47:25 +08:00
|
|
|
lldb::TypeSummaryImplSP summary_sp,
|
2013-10-18 06:27:19 +08:00
|
|
|
lldb::SyntheticChildrenSP synthetic_sp,
|
2014-09-06 04:45:07 +08:00
|
|
|
lldb::TypeValidatorImplSP validator_sp) {
|
2013-10-18 06:27:19 +08:00
|
|
|
SetFormat(format_sp);
|
2013-01-29 07:47:25 +08:00
|
|
|
SetSummary(summary_sp);
|
|
|
|
SetSynthetic(synthetic_sp);
|
2014-09-06 04:45:07 +08:00
|
|
|
SetValidator(validator_sp);
|
2013-10-18 06:27:19 +08:00
|
|
|
}
|
|
|
|
|
2013-01-29 07:47:25 +08:00
|
|
|
bool FormatCache::Entry::IsFormatCached() { return m_format_cached; }
|
|
|
|
|
|
|
|
bool FormatCache::Entry::IsSummaryCached() { return m_summary_cached; }
|
|
|
|
|
2014-09-06 04:45:07 +08:00
|
|
|
bool FormatCache::Entry::IsSyntheticCached() { return m_synthetic_cached; }
|
|
|
|
|
2013-10-18 06:27:19 +08:00
|
|
|
bool FormatCache::Entry::IsValidatorCached() { return m_validator_cached; }
|
|
|
|
|
2013-01-29 07:47:25 +08:00
|
|
|
lldb::TypeFormatImplSP FormatCache::Entry::GetFormat() { return m_format_sp; }
|
2016-09-07 04:57:50 +08:00
|
|
|
|
2013-01-29 07:47:25 +08:00
|
|
|
lldb::TypeSummaryImplSP FormatCache::Entry::GetSummary() {
|
|
|
|
return m_summary_sp;
|
|
|
|
}
|
|
|
|
|
|
|
|
lldb::SyntheticChildrenSP FormatCache::Entry::GetSynthetic() {
|
|
|
|
return m_synthetic_sp;
|
|
|
|
}
|
|
|
|
|
2014-09-06 04:45:07 +08:00
|
|
|
lldb::TypeValidatorImplSP FormatCache::Entry::GetValidator() {
|
|
|
|
return m_validator_sp;
|
|
|
|
}
|
|
|
|
|
2013-10-18 06:27:19 +08:00
|
|
|
void FormatCache::Entry::SetFormat(lldb::TypeFormatImplSP format_sp) {
|
|
|
|
m_format_cached = true;
|
|
|
|
m_format_sp = format_sp;
|
|
|
|
}
|
|
|
|
|
2013-01-29 07:47:25 +08:00
|
|
|
void FormatCache::Entry::SetSummary(lldb::TypeSummaryImplSP summary_sp) {
|
|
|
|
m_summary_cached = true;
|
|
|
|
m_summary_sp = summary_sp;
|
|
|
|
}
|
|
|
|
|
|
|
|
void FormatCache::Entry::SetSynthetic(lldb::SyntheticChildrenSP synthetic_sp) {
|
|
|
|
m_synthetic_cached = true;
|
|
|
|
m_synthetic_sp = synthetic_sp;
|
|
|
|
}
|
|
|
|
|
2014-09-06 04:45:07 +08:00
|
|
|
void FormatCache::Entry::SetValidator(lldb::TypeValidatorImplSP validator_sp) {
|
|
|
|
m_validator_cached = true;
|
|
|
|
m_validator_sp = validator_sp;
|
|
|
|
}
|
|
|
|
|
2016-05-18 09:59:10 +08:00
|
|
|
FormatCache::FormatCache()
|
|
|
|
: m_map(), m_mutex()
|
2013-01-29 07:47:25 +08:00
|
|
|
#ifdef LLDB_CONFIGURATION_DEBUG
|
2016-05-18 09:59:10 +08:00
|
|
|
,
|
|
|
|
m_cache_hits(0), m_cache_misses(0)
|
2013-01-29 07:47:25 +08:00
|
|
|
#endif
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
FormatCache::Entry &FormatCache::GetEntry(ConstString type) {
|
2013-01-29 07:47:25 +08:00
|
|
|
auto i = m_map.find(type), e = m_map.end();
|
|
|
|
if (i != e)
|
|
|
|
return i->second;
|
|
|
|
m_map[type] = FormatCache::Entry();
|
|
|
|
return m_map[type];
|
|
|
|
}
|
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
bool FormatCache::GetFormat(ConstString type,
|
2013-10-18 06:27:19 +08:00
|
|
|
lldb::TypeFormatImplSP &format_sp) {
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2013-10-18 06:27:19 +08:00
|
|
|
auto entry = GetEntry(type);
|
2016-02-19 03:23:52 +08:00
|
|
|
if (entry.IsFormatCached()) {
|
2013-10-18 06:27:19 +08:00
|
|
|
#ifdef LLDB_CONFIGURATION_DEBUG
|
|
|
|
m_cache_hits++;
|
|
|
|
#endif
|
|
|
|
format_sp = entry.GetFormat();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
#ifdef LLDB_CONFIGURATION_DEBUG
|
|
|
|
m_cache_misses++;
|
|
|
|
#endif
|
|
|
|
format_sp.reset();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
bool FormatCache::GetSummary(ConstString type,
|
2013-01-29 07:47:25 +08:00
|
|
|
lldb::TypeSummaryImplSP &summary_sp) {
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2013-01-29 07:47:25 +08:00
|
|
|
auto entry = GetEntry(type);
|
|
|
|
if (entry.IsSummaryCached()) {
|
|
|
|
#ifdef LLDB_CONFIGURATION_DEBUG
|
|
|
|
m_cache_hits++;
|
|
|
|
#endif
|
|
|
|
summary_sp = entry.GetSummary();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
#ifdef LLDB_CONFIGURATION_DEBUG
|
|
|
|
m_cache_misses++;
|
|
|
|
#endif
|
|
|
|
summary_sp.reset();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
bool FormatCache::GetSynthetic(ConstString type,
|
2013-01-29 07:47:25 +08:00
|
|
|
lldb::SyntheticChildrenSP &synthetic_sp) {
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2013-01-29 07:47:25 +08:00
|
|
|
auto entry = GetEntry(type);
|
|
|
|
if (entry.IsSyntheticCached()) {
|
|
|
|
#ifdef LLDB_CONFIGURATION_DEBUG
|
|
|
|
m_cache_hits++;
|
|
|
|
#endif
|
|
|
|
synthetic_sp = entry.GetSynthetic();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
#ifdef LLDB_CONFIGURATION_DEBUG
|
|
|
|
m_cache_misses++;
|
|
|
|
#endif
|
|
|
|
synthetic_sp.reset();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
bool FormatCache::GetValidator(ConstString type,
|
2014-09-06 04:45:07 +08:00
|
|
|
lldb::TypeValidatorImplSP &validator_sp) {
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2014-09-06 04:45:07 +08:00
|
|
|
auto entry = GetEntry(type);
|
|
|
|
if (entry.IsValidatorCached()) {
|
|
|
|
#ifdef LLDB_CONFIGURATION_DEBUG
|
|
|
|
m_cache_hits++;
|
|
|
|
#endif
|
|
|
|
validator_sp = entry.GetValidator();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
#ifdef LLDB_CONFIGURATION_DEBUG
|
|
|
|
m_cache_misses++;
|
|
|
|
#endif
|
|
|
|
validator_sp.reset();
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
void FormatCache::SetFormat(ConstString type,
|
2013-10-18 06:27:19 +08:00
|
|
|
lldb::TypeFormatImplSP &format_sp) {
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2013-10-18 06:27:19 +08:00
|
|
|
GetEntry(type).SetFormat(format_sp);
|
|
|
|
}
|
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
void FormatCache::SetSummary(ConstString type,
|
2013-01-29 07:47:25 +08:00
|
|
|
lldb::TypeSummaryImplSP &summary_sp) {
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2013-01-29 07:47:25 +08:00
|
|
|
GetEntry(type).SetSummary(summary_sp);
|
|
|
|
}
|
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
void FormatCache::SetSynthetic(ConstString type,
|
2013-01-29 07:47:25 +08:00
|
|
|
lldb::SyntheticChildrenSP &synthetic_sp) {
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2013-01-29 07:47:25 +08:00
|
|
|
GetEntry(type).SetSynthetic(synthetic_sp);
|
|
|
|
}
|
|
|
|
|
2019-03-07 05:22:25 +08:00
|
|
|
void FormatCache::SetValidator(ConstString type,
|
2014-09-06 04:45:07 +08:00
|
|
|
lldb::TypeValidatorImplSP &validator_sp) {
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2014-09-06 04:45:07 +08:00
|
|
|
GetEntry(type).SetValidator(validator_sp);
|
|
|
|
}
|
|
|
|
|
2013-01-29 07:47:25 +08:00
|
|
|
void FormatCache::Clear() {
|
2016-05-18 09:59:10 +08:00
|
|
|
std::lock_guard<std::recursive_mutex> guard(m_mutex);
|
2013-01-29 07:47:25 +08:00
|
|
|
m_map.clear();
|
|
|
|
}
|