Index: lldb/include/lldb/DataFormatters/FormatCache.h =================================================================== --- lldb/include/lldb/DataFormatters/FormatCache.h +++ lldb/include/lldb/DataFormatters/FormatCache.h @@ -33,36 +33,22 @@ public: Entry(); - Entry(lldb::TypeFormatImplSP); - Entry(lldb::TypeSummaryImplSP); - Entry(lldb::SyntheticChildrenSP); - Entry(lldb::TypeValidatorImplSP); - Entry(lldb::TypeFormatImplSP, lldb::TypeSummaryImplSP, - lldb::SyntheticChildrenSP, lldb::TypeValidatorImplSP); + template bool IsCached(); bool IsFormatCached(); - bool IsSummaryCached(); - bool IsSyntheticCached(); - bool IsValidatorCached(); - lldb::TypeFormatImplSP GetFormat(); - - lldb::TypeSummaryImplSP GetSummary(); - - lldb::SyntheticChildrenSP GetSynthetic(); - - lldb::TypeValidatorImplSP GetValidator(); - - void SetFormat(lldb::TypeFormatImplSP); - - void SetSummary(lldb::TypeSummaryImplSP); + void Get(lldb::TypeFormatImplSP &); + void Get(lldb::TypeSummaryImplSP &); + void Get(lldb::SyntheticChildrenSP &); + void Get(lldb::TypeValidatorImplSP &); - void SetSynthetic(lldb::SyntheticChildrenSP); - - void SetValidator(lldb::TypeValidatorImplSP); + void Set(lldb::TypeFormatImplSP); + void Set(lldb::TypeSummaryImplSP); + void Set(lldb::SyntheticChildrenSP); + void Set(lldb::TypeValidatorImplSP); }; typedef std::map CacheMap; CacheMap m_map; @@ -76,25 +62,13 @@ public: FormatCache(); - bool GetFormat(ConstString type, lldb::TypeFormatImplSP &format_sp); - - bool GetSummary(ConstString type, lldb::TypeSummaryImplSP &summary_sp); - - bool GetSynthetic(ConstString type, - lldb::SyntheticChildrenSP &synthetic_sp); - - bool GetValidator(ConstString type, - lldb::TypeValidatorImplSP &summary_sp); + template + bool Get(ConstString type, ImplSP &format_impl_sp); - void SetFormat(ConstString type, lldb::TypeFormatImplSP &format_sp); - - void SetSummary(ConstString type, lldb::TypeSummaryImplSP &summary_sp); - - void SetSynthetic(ConstString type, - lldb::SyntheticChildrenSP &synthetic_sp); - - void SetValidator(ConstString type, - lldb::TypeValidatorImplSP &synthetic_sp); + void Set(ConstString type, lldb::TypeFormatImplSP &format_sp); + void Set(ConstString type, lldb::TypeSummaryImplSP &summary_sp); + void Set(ConstString type, lldb::SyntheticChildrenSP &synthetic_sp); + void Set(ConstString type, lldb::TypeValidatorImplSP &synthetic_sp); void Clear(); @@ -102,6 +76,7 @@ uint64_t GetCacheMisses() { return m_cache_misses; } }; + } // namespace lldb_private #endif // lldb_FormatCache_h_ Index: lldb/include/lldb/DataFormatters/FormatManager.h =================================================================== --- lldb/include/lldb/DataFormatters/FormatManager.h +++ lldb/include/lldb/DataFormatters/FormatManager.h @@ -211,14 +211,10 @@ ConstString m_system_category_name; ConstString m_vectortypes_category_name; - lldb::TypeFormatImplSP GetHardcodedFormat(FormattersMatchData &); - - lldb::TypeSummaryImplSP GetHardcodedSummaryFormat(FormattersMatchData &); - - lldb::SyntheticChildrenSP - GetHardcodedSyntheticChildren(FormattersMatchData &); - - lldb::TypeValidatorImplSP GetHardcodedValidator(FormattersMatchData &); + template + void GetCached(ValueObject &valobj, lldb::DynamicValueType use_dynamic, + ImplSP &retval); + template void GetHardcoded(FormattersMatchData &, ImplSP &); TypeCategoryMap &GetCategories() { return m_categories_map; } Index: lldb/include/lldb/DataFormatters/TypeCategoryMap.h =================================================================== --- lldb/include/lldb/DataFormatters/TypeCategoryMap.h +++ lldb/include/lldb/DataFormatters/TypeCategoryMap.h @@ -77,14 +77,7 @@ uint32_t GetCount() { return m_map.size(); } - lldb::TypeFormatImplSP GetFormat(FormattersMatchData &match_data); - - lldb::TypeSummaryImplSP GetSummaryFormat(FormattersMatchData &match_data); - - lldb::SyntheticChildrenSP - GetSyntheticChildren(FormattersMatchData &match_data); - - lldb::TypeValidatorImplSP GetValidator(FormattersMatchData &match_data); + template void Get(FormattersMatchData &, ImplSP &); private: class delete_matching_categories { Index: lldb/source/DataFormatters/FormatCache.cpp =================================================================== --- lldb/source/DataFormatters/FormatCache.cpp +++ lldb/source/DataFormatters/FormatCache.cpp @@ -17,46 +17,7 @@ FormatCache::Entry::Entry() : m_format_cached(false), m_summary_cached(false), - m_synthetic_cached(false), m_validator_cached(false), m_format_sp(), - m_summary_sp(), m_synthetic_sp(), m_validator_sp() {} - -FormatCache::Entry::Entry(lldb::TypeFormatImplSP format_sp) - : m_summary_cached(false), m_synthetic_cached(false), - m_validator_cached(false), m_summary_sp(), m_synthetic_sp(), - m_validator_sp() { - SetFormat(format_sp); -} - -FormatCache::Entry::Entry(lldb::TypeSummaryImplSP summary_sp) - : m_format_cached(false), m_synthetic_cached(false), - m_validator_cached(false), m_format_sp(), m_synthetic_sp(), - m_validator_sp() { - SetSummary(summary_sp); -} - -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(), - m_synthetic_sp() { - SetValidator(validator_sp); -} - -FormatCache::Entry::Entry(lldb::TypeFormatImplSP format_sp, - lldb::TypeSummaryImplSP summary_sp, - lldb::SyntheticChildrenSP synthetic_sp, - lldb::TypeValidatorImplSP validator_sp) { - SetFormat(format_sp); - SetSummary(summary_sp); - SetSynthetic(synthetic_sp); - SetValidator(validator_sp); -} + m_synthetic_cached(false), m_validator_cached(false) {} bool FormatCache::Entry::IsFormatCached() { return m_format_cached; } @@ -66,36 +27,38 @@ bool FormatCache::Entry::IsValidatorCached() { return m_validator_cached; } -lldb::TypeFormatImplSP FormatCache::Entry::GetFormat() { return m_format_sp; } +void FormatCache::Entry::Get(lldb::TypeFormatImplSP &retval) { + retval = m_format_sp; +} -lldb::TypeSummaryImplSP FormatCache::Entry::GetSummary() { - return m_summary_sp; +void FormatCache::Entry::Get(lldb::TypeSummaryImplSP &retval) { + retval = m_summary_sp; } -lldb::SyntheticChildrenSP FormatCache::Entry::GetSynthetic() { - return m_synthetic_sp; +void FormatCache::Entry::Get(lldb::SyntheticChildrenSP &retval) { + retval = m_synthetic_sp; } -lldb::TypeValidatorImplSP FormatCache::Entry::GetValidator() { - return m_validator_sp; +void FormatCache::Entry::Get(lldb::TypeValidatorImplSP &retval) { + retval = m_validator_sp; } -void FormatCache::Entry::SetFormat(lldb::TypeFormatImplSP format_sp) { +void FormatCache::Entry::Set(lldb::TypeFormatImplSP format_sp) { m_format_cached = true; m_format_sp = format_sp; } -void FormatCache::Entry::SetSummary(lldb::TypeSummaryImplSP summary_sp) { +void FormatCache::Entry::Set(lldb::TypeSummaryImplSP summary_sp) { m_summary_cached = true; m_summary_sp = summary_sp; } -void FormatCache::Entry::SetSynthetic(lldb::SyntheticChildrenSP synthetic_sp) { +void FormatCache::Entry::Set(lldb::SyntheticChildrenSP synthetic_sp) { m_synthetic_cached = true; m_synthetic_sp = synthetic_sp; } -void FormatCache::Entry::SetValidator(lldb::TypeValidatorImplSP validator_sp) { +void FormatCache::Entry::Set(lldb::TypeValidatorImplSP validator_sp) { m_validator_cached = true; m_validator_sp = validator_sp; } @@ -117,100 +80,72 @@ return m_map[type]; } -bool FormatCache::GetFormat(ConstString type, - lldb::TypeFormatImplSP &format_sp) { - std::lock_guard guard(m_mutex); - auto entry = GetEntry(type); - if (entry.IsFormatCached()) { -#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; +template<> bool FormatCache::Entry::IsCached() { + return IsFormatCached(); } - -bool FormatCache::GetSummary(ConstString type, - lldb::TypeSummaryImplSP &summary_sp) { - std::lock_guard guard(m_mutex); - 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; +template<> bool FormatCache::Entry::IsCached () { + return IsSummaryCached(); } - -bool FormatCache::GetSynthetic(ConstString type, - lldb::SyntheticChildrenSP &synthetic_sp) { - std::lock_guard guard(m_mutex); - 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; +template<> bool FormatCache::Entry::IsCached() { + return IsSyntheticCached(); +} +template<> bool FormatCache::Entry::IsCached() { + return IsValidatorCached(); } -bool FormatCache::GetValidator(ConstString type, - lldb::TypeValidatorImplSP &validator_sp) { +template +bool FormatCache::Get(ConstString type, ImplSP &format_impl_sp) { std::lock_guard guard(m_mutex); auto entry = GetEntry(type); - if (entry.IsValidatorCached()) { + if (entry.IsCached()) { #ifdef LLDB_CONFIGURATION_DEBUG m_cache_hits++; #endif - validator_sp = entry.GetValidator(); + entry.Get(format_impl_sp); return true; } #ifdef LLDB_CONFIGURATION_DEBUG m_cache_misses++; #endif - validator_sp.reset(); + format_impl_sp.reset(); return false; } -void FormatCache::SetFormat(ConstString type, - lldb::TypeFormatImplSP &format_sp) { +/// Explicit instantiations for the four types. +/// \{ +template bool FormatCache::Get( + ConstString type, lldb::TypeValidatorImplSP &format_impl_sp); + +template bool FormatCache::Get( + ConstString type, lldb::TypeFormatImplSP &format_impl_sp); +template +bool FormatCache::Get( + ConstString type, lldb::TypeSummaryImplSP &format_impl_sp); +template +bool FormatCache::Get( + ConstString type, lldb::SyntheticChildrenSP &format_impl_sp); +/// \} + +void FormatCache::Set(ConstString type, lldb::TypeFormatImplSP &format_sp) { std::lock_guard guard(m_mutex); - GetEntry(type).SetFormat(format_sp); + GetEntry(type).Set(format_sp); } -void FormatCache::SetSummary(ConstString type, - lldb::TypeSummaryImplSP &summary_sp) { +void FormatCache::Set(ConstString type, lldb::TypeSummaryImplSP &summary_sp) { std::lock_guard guard(m_mutex); - GetEntry(type).SetSummary(summary_sp); + GetEntry(type).Set(summary_sp); } -void FormatCache::SetSynthetic(ConstString type, - lldb::SyntheticChildrenSP &synthetic_sp) { +void FormatCache::Set(ConstString type, + lldb::SyntheticChildrenSP &synthetic_sp) { std::lock_guard guard(m_mutex); - GetEntry(type).SetSynthetic(synthetic_sp); + GetEntry(type).Set(synthetic_sp); } -void FormatCache::SetValidator(ConstString type, - lldb::TypeValidatorImplSP &validator_sp) { +void FormatCache::Set(ConstString type, + lldb::TypeValidatorImplSP &validator_sp) { std::lock_guard guard(m_mutex); - GetEntry(type).SetValidator(validator_sp); + GetEntry(type).Set(validator_sp); } void FormatCache::Clear() { Index: lldb/source/DataFormatters/FormatManager.cpp =================================================================== --- lldb/source/DataFormatters/FormatManager.cpp +++ lldb/source/DataFormatters/FormatManager.cpp @@ -614,51 +614,42 @@ return lang_category; } -lldb::TypeFormatImplSP -FormatManager::GetHardcodedFormat(FormattersMatchData &match_data) { - TypeFormatImplSP retval_sp; - +template +void FormatManager::GetHardcoded(FormattersMatchData &match_data, + ImplSP &retval_sp) { for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) { if (LanguageCategory *lang_category = GetCategoryForLanguage(lang_type)) { if (lang_category->GetHardcoded(*this, match_data, retval_sp)) - break; + return; } } - - return retval_sp; } -lldb::TypeFormatImplSP -FormatManager::GetFormat(ValueObject &valobj, - lldb::DynamicValueType use_dynamic) { +template void +FormatManager::GetCached(ValueObject &valobj, + lldb::DynamicValueType use_dynamic, ImplSP &retval) { FormattersMatchData match_data(valobj, use_dynamic); - - TypeFormatImplSP retval; Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DATAFORMATTERS)); if (match_data.GetTypeForCache()) { - LLDB_LOGF(log, - "\n\n[FormatManager::GetFormat] Looking into cache for type %s", + LLDB_LOGF(log, "\n\n[%s] Looking into cache for type %s", __FUNCTION__, match_data.GetTypeForCache().AsCString("")); - if (m_format_cache.GetFormat(match_data.GetTypeForCache(), retval)) { + if (m_format_cache.Get(match_data.GetTypeForCache(), retval)) { if (log) { - LLDB_LOGF( - log, "[FormatManager::GetFormat] Cache search success. Returning."); + LLDB_LOGF(log, "[%s] Cache search success. Returning.", __FUNCTION__); LLDB_LOGV(log, "Cache hits: {0} - Cache Misses: {1}", m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); } - return retval; + return; } - LLDB_LOGF( - log, - "[FormatManager::GetFormat] Cache search failed. Going normal route"); + LLDB_LOGF(log, "[%s] Cache search failed. Going normal route", + __FUNCTION__); } - retval = m_categories_map.GetFormat(match_data); + m_categories_map.Get(match_data, retval); if (!retval) { - LLDB_LOGF(log, - "[FormatManager::GetFormat] Search failed. Giving language a " - "chance."); + LLDB_LOGF(log, "[%s] Search failed. Giving language a chance.", + __FUNCTION__); for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) { if (LanguageCategory *lang_category = GetCategoryForLanguage(lang_type)) { if (lang_category->Get(match_data, retval)) @@ -666,252 +657,57 @@ } } if (retval) { - LLDB_LOGF( - log, - "[FormatManager::GetFormat] Language search success. Returning."); - return retval; + LLDB_LOGF(log, "[%s] Language search success. Returning.", __FUNCTION__); + return; } } if (!retval) { - LLDB_LOGF(log, "[FormatManager::GetFormat] Search failed. Giving hardcoded " - "a chance."); - retval = GetHardcodedFormat(match_data); + LLDB_LOGF(log, "[%s] Search failed. Giving hardcoded a chance.", __FUNCTION__); + GetHardcoded(match_data, retval); } if (match_data.GetTypeForCache() && (!retval || !retval->NonCacheable())) { - LLDB_LOGF(log, "[FormatManager::GetFormat] Caching %p for type %s", + LLDB_LOGF(log, "[%s] Caching %p for type %s", __FUNCTION__, static_cast(retval.get()), match_data.GetTypeForCache().AsCString("")); - m_format_cache.SetFormat(match_data.GetTypeForCache(), retval); + m_format_cache.Set(match_data.GetTypeForCache(), retval); } LLDB_LOGV(log, "Cache hits: {0} - Cache Misses: {1}", m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); - return retval; } -lldb::TypeSummaryImplSP -FormatManager::GetHardcodedSummaryFormat(FormattersMatchData &match_data) { - TypeSummaryImplSP retval_sp; - - for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) { - if (LanguageCategory *lang_category = GetCategoryForLanguage(lang_type)) { - if (lang_category->GetHardcoded(*this, match_data, retval_sp)) - break; - } - } - - return retval_sp; +lldb::TypeFormatImplSP +FormatManager::GetFormat(ValueObject &valobj, + lldb::DynamicValueType use_dynamic) { + TypeFormatImplSP retval; + GetCached(valobj, use_dynamic, retval); + return retval; } lldb::TypeSummaryImplSP FormatManager::GetSummaryFormat(ValueObject &valobj, lldb::DynamicValueType use_dynamic) { - FormattersMatchData match_data(valobj, use_dynamic); - TypeSummaryImplSP retval; - Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DATAFORMATTERS)); - if (match_data.GetTypeForCache()) { - LLDB_LOGF(log, - "\n\n[FormatManager::GetSummaryFormat] Looking into cache " - "for type %s", - match_data.GetTypeForCache().AsCString("")); - if (m_format_cache.GetSummary(match_data.GetTypeForCache(), retval)) { - if (log) { - LLDB_LOGF(log, - "[FormatManager::GetSummaryFormat] Cache search success. " - "Returning."); - LLDB_LOGV(log, "Cache hits: {0} - Cache Misses: {1}", - m_format_cache.GetCacheHits(), - m_format_cache.GetCacheMisses()); - } - return retval; - } - LLDB_LOGF(log, "[FormatManager::GetSummaryFormat] Cache search failed. " - "Going normal route"); - } - - retval = m_categories_map.GetSummaryFormat(match_data); - if (!retval) { - LLDB_LOGF(log, "[FormatManager::GetSummaryFormat] Search failed. Giving " - "language a chance."); - for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) { - if (LanguageCategory *lang_category = GetCategoryForLanguage(lang_type)) { - if (lang_category->Get(match_data, retval)) - break; - } - } - if (retval) { - LLDB_LOGF(log, "[FormatManager::GetSummaryFormat] Language search " - "success. Returning."); - return retval; - } - } - if (!retval) { - LLDB_LOGF(log, "[FormatManager::GetSummaryFormat] Search failed. Giving " - "hardcoded a chance."); - retval = GetHardcodedSummaryFormat(match_data); - } - - if (match_data.GetTypeForCache() && (!retval || !retval->NonCacheable())) { - LLDB_LOGF(log, "[FormatManager::GetSummaryFormat] Caching %p for type %s", - static_cast(retval.get()), - match_data.GetTypeForCache().AsCString("")); - m_format_cache.SetSummary(match_data.GetTypeForCache(), retval); - } - LLDB_LOGV(log, "Cache hits: {0} - Cache Misses: {1}", - m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); + GetCached(valobj, use_dynamic, retval); return retval; } -lldb::SyntheticChildrenSP -FormatManager::GetHardcodedSyntheticChildren(FormattersMatchData &match_data) { - SyntheticChildrenSP retval_sp; - - for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) { - if (LanguageCategory *lang_category = GetCategoryForLanguage(lang_type)) { - if (lang_category->GetHardcoded(*this, match_data, retval_sp)) - break; - } - } - - return retval_sp; -} - lldb::SyntheticChildrenSP FormatManager::GetSyntheticChildren(ValueObject &valobj, lldb::DynamicValueType use_dynamic) { - FormattersMatchData match_data(valobj, use_dynamic); - SyntheticChildrenSP retval; - Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DATAFORMATTERS)); - if (match_data.GetTypeForCache()) { - LLDB_LOGF(log, - "\n\n[FormatManager::GetSyntheticChildren] Looking into " - "cache for type %s", - match_data.GetTypeForCache().AsCString("")); - if (m_format_cache.GetSynthetic(match_data.GetTypeForCache(), retval)) { - if (log) { - LLDB_LOGF(log, "[FormatManager::GetSyntheticChildren] Cache search " - "success. Returning."); - LLDB_LOGV(log, "Cache hits: {0} - Cache Misses: {1}", - m_format_cache.GetCacheHits(), - m_format_cache.GetCacheMisses()); - } - return retval; - } - LLDB_LOGF(log, "[FormatManager::GetSyntheticChildren] Cache search failed. " - "Going normal route"); - } - - retval = m_categories_map.GetSyntheticChildren(match_data); - if (!retval) { - LLDB_LOGF(log, - "[FormatManager::GetSyntheticChildren] Search failed. Giving " - "language a chance."); - for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) { - if (LanguageCategory *lang_category = GetCategoryForLanguage(lang_type)) { - if (lang_category->Get(match_data, retval)) - break; - } - } - if (retval) { - LLDB_LOGF(log, "[FormatManager::GetSyntheticChildren] Language search " - "success. Returning."); - return retval; - } - } - if (!retval) { - LLDB_LOGF(log, - "[FormatManager::GetSyntheticChildren] Search failed. Giving " - "hardcoded a chance."); - retval = GetHardcodedSyntheticChildren(match_data); - } - - if (match_data.GetTypeForCache() && (!retval || !retval->NonCacheable())) { - LLDB_LOGF(log, - "[FormatManager::GetSyntheticChildren] Caching %p for type %s", - static_cast(retval.get()), - match_data.GetTypeForCache().AsCString("")); - m_format_cache.SetSynthetic(match_data.GetTypeForCache(), retval); - } - LLDB_LOGV(log, "Cache hits: {0} - Cache Misses: {1}", - m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); + GetCached(valobj, use_dynamic, retval); return retval; } lldb::TypeValidatorImplSP FormatManager::GetValidator(ValueObject &valobj, lldb::DynamicValueType use_dynamic) { - FormattersMatchData match_data(valobj, use_dynamic); - TypeValidatorImplSP retval; - Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DATAFORMATTERS)); - if (match_data.GetTypeForCache()) { - LLDB_LOGF( - log, "\n\n[FormatManager::GetValidator] Looking into cache for type %s", - match_data.GetTypeForCache().AsCString("")); - if (m_format_cache.GetValidator(match_data.GetTypeForCache(), retval)) { - if (log) { - LLDB_LOGF( - log, - "[FormatManager::GetValidator] Cache search success. Returning."); - LLDB_LOGV(log, "Cache hits: {0} - Cache Misses: {1}", - m_format_cache.GetCacheHits(), - m_format_cache.GetCacheMisses()); - } - return retval; - } - LLDB_LOGF(log, "[FormatManager::GetValidator] Cache search failed. Going " - "normal route"); - } - - retval = m_categories_map.GetValidator(match_data); - if (!retval) { - LLDB_LOGF(log, "[FormatManager::GetValidator] Search failed. Giving " - "language a chance."); - for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) { - if (LanguageCategory *lang_category = GetCategoryForLanguage(lang_type)) { - if (lang_category->Get(match_data, retval)) - break; - } - } - if (retval) { - LLDB_LOGF(log, "[FormatManager::GetValidator] Language search success. " - "Returning."); - return retval; - } - } - if (!retval) { - LLDB_LOGF(log, "[FormatManager::GetValidator] Search failed. Giving " - "hardcoded a chance."); - retval = GetHardcodedValidator(match_data); - } - - if (match_data.GetTypeForCache() && (!retval || !retval->NonCacheable())) { - LLDB_LOGF(log, "[FormatManager::GetValidator] Caching %p for type %s", - static_cast(retval.get()), - match_data.GetTypeForCache().AsCString("")); - m_format_cache.SetValidator(match_data.GetTypeForCache(), retval); - } - LLDB_LOGV(log, "Cache hits: {0} - Cache Misses: {1}", - m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); + GetCached(valobj, use_dynamic, retval); return retval; } -lldb::TypeValidatorImplSP -FormatManager::GetHardcodedValidator(FormattersMatchData &match_data) { - TypeValidatorImplSP retval_sp; - - for (lldb::LanguageType lang_type : match_data.GetCandidateLanguages()) { - if (LanguageCategory *lang_category = GetCategoryForLanguage(lang_type)) { - if (lang_category->GetHardcoded(*this, match_data, retval_sp)) - break; - } - } - - return retval_sp; -} - FormatManager::FormatManager() : m_last_revision(0), m_format_cache(), m_language_categories_mutex(), m_language_categories_map(), m_named_summaries_map(this), Index: lldb/source/DataFormatters/LanguageCategory.cpp =================================================================== --- lldb/source/DataFormatters/LanguageCategory.cpp +++ lldb/source/DataFormatters/LanguageCategory.cpp @@ -43,7 +43,7 @@ return false; if (match_data.GetTypeForCache()) { - if (m_format_cache.GetFormat(match_data.GetTypeForCache(), format_sp)) + if (m_format_cache.Get(match_data.GetTypeForCache(), format_sp)) return format_sp.get() != nullptr; } @@ -52,7 +52,7 @@ m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp); if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) { - m_format_cache.SetFormat(match_data.GetTypeForCache(), format_sp); + m_format_cache.Set(match_data.GetTypeForCache(), format_sp); } return result; } @@ -66,7 +66,7 @@ return false; if (match_data.GetTypeForCache()) { - if (m_format_cache.GetSummary(match_data.GetTypeForCache(), format_sp)) + if (m_format_cache.Get(match_data.GetTypeForCache(), format_sp)) return format_sp.get() != nullptr; } @@ -75,7 +75,7 @@ m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp); if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) { - m_format_cache.SetSummary(match_data.GetTypeForCache(), format_sp); + m_format_cache.Set(match_data.GetTypeForCache(), format_sp); } return result; } @@ -89,7 +89,7 @@ return false; if (match_data.GetTypeForCache()) { - if (m_format_cache.GetSynthetic(match_data.GetTypeForCache(), format_sp)) + if (m_format_cache.Get(match_data.GetTypeForCache(), format_sp)) return format_sp.get() != nullptr; } @@ -98,7 +98,7 @@ m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp); if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) { - m_format_cache.SetSynthetic(match_data.GetTypeForCache(), format_sp); + m_format_cache.Set(match_data.GetTypeForCache(), format_sp); } return result; } @@ -112,7 +112,7 @@ return false; if (match_data.GetTypeForCache()) { - if (m_format_cache.GetValidator(match_data.GetTypeForCache(), format_sp)) + if (m_format_cache.Get(match_data.GetTypeForCache(), format_sp)) return format_sp.get() != nullptr; } @@ -121,7 +121,7 @@ m_category_sp->Get(valobj, match_data.GetMatchesVector(), format_sp); if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) { - m_format_cache.SetValidator(match_data.GetTypeForCache(), format_sp); + m_format_cache.Set(match_data.GetTypeForCache(), format_sp); } return result; } @@ -141,7 +141,7 @@ } if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) { - m_format_cache.SetFormat(match_data.GetTypeForCache(), format_sp); + m_format_cache.Set(match_data.GetTypeForCache(), format_sp); } return format_sp.get() != nullptr; } @@ -161,7 +161,7 @@ } if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) { - m_format_cache.SetSummary(match_data.GetTypeForCache(), format_sp); + m_format_cache.Set(match_data.GetTypeForCache(), format_sp); } return format_sp.get() != nullptr; } @@ -181,7 +181,7 @@ } if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) { - m_format_cache.SetSynthetic(match_data.GetTypeForCache(), format_sp); + m_format_cache.Set(match_data.GetTypeForCache(), format_sp); } return format_sp.get() != nullptr; } @@ -201,7 +201,7 @@ } if (match_data.GetTypeForCache() && (!format_sp || !format_sp->NonCacheable())) { - m_format_cache.SetValidator(match_data.GetTypeForCache(), format_sp); + m_format_cache.Set(match_data.GetTypeForCache(), format_sp); } return format_sp.get() != nullptr; } Index: lldb/source/DataFormatters/TypeCategoryMap.cpp =================================================================== --- lldb/source/DataFormatters/TypeCategoryMap.cpp +++ lldb/source/DataFormatters/TypeCategoryMap.cpp @@ -169,8 +169,8 @@ return false; } -lldb::TypeFormatImplSP -TypeCategoryMap::GetFormat(FormattersMatchData &match_data) { +template +void TypeCategoryMap::Get(FormattersMatchData &match_data, ImplSP &retval) { std::lock_guard guard(m_map_mutex); uint32_t reason_why; @@ -182,8 +182,8 @@ for (auto match : match_data.GetMatchesVector()) { LLDB_LOGF( log, - "[CategoryMap::GetFormat] candidate match = %s %s %s %s reason = " - "%" PRIu32, + "[%s] candidate match = %s %s %s %s reason = %" PRIu32, + __FUNCTION__, match.GetTypeName().GetCString(), match.DidStripPointer() ? "strip-pointers" : "no-strip-pointers", match.DidStripReference() ? "strip-reference" : "no-strip-reference", @@ -194,140 +194,34 @@ for (begin = m_active_categories.begin(); begin != end; begin++) { lldb::TypeCategoryImplSP category_sp = *begin; - lldb::TypeFormatImplSP current_format; - LLDB_LOGF(log, "[TypeCategoryMap::GetFormat] Trying to use category %s", + ImplSP current_format; + LLDB_LOGF(log, "[%s] Trying to use category %s", __FUNCTION__, category_sp->GetName()); if (!category_sp->Get(match_data.GetValueObject(), match_data.GetMatchesVector(), current_format, &reason_why)) continue; - return current_format; - } - LLDB_LOGF(log, - "[TypeCategoryMap::GetFormat] nothing found - returning empty SP"); - return lldb::TypeFormatImplSP(); -} - -lldb::TypeSummaryImplSP -TypeCategoryMap::GetSummaryFormat(FormattersMatchData &match_data) { - std::lock_guard guard(m_map_mutex); - - uint32_t reason_why; - ActiveCategoriesIterator begin, end = m_active_categories.end(); - - Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DATAFORMATTERS)); - - if (log) { - for (auto match : match_data.GetMatchesVector()) { - LLDB_LOGF( - log, - "[CategoryMap::GetSummaryFormat] candidate match = %s %s %s %s " - "reason = %" PRIu32, - match.GetTypeName().GetCString(), - match.DidStripPointer() ? "strip-pointers" : "no-strip-pointers", - match.DidStripReference() ? "strip-reference" : "no-strip-reference", - match.DidStripTypedef() ? "strip-typedef" : "no-strip-typedef", - match.GetReason()); - } - } - - for (begin = m_active_categories.begin(); begin != end; begin++) { - lldb::TypeCategoryImplSP category_sp = *begin; - lldb::TypeSummaryImplSP current_format; - LLDB_LOGF(log, "[CategoryMap::GetSummaryFormat] Trying to use category %s", - category_sp->GetName()); - if (!category_sp->Get(match_data.GetValueObject(), - match_data.GetMatchesVector(), current_format, - &reason_why)) - continue; - return current_format; - } - LLDB_LOGF( - log, - "[CategoryMap::GetSummaryFormat] nothing found - returning empty SP"); - return lldb::TypeSummaryImplSP(); -} - -lldb::SyntheticChildrenSP -TypeCategoryMap::GetSyntheticChildren(FormattersMatchData &match_data) { - std::lock_guard guard(m_map_mutex); - - uint32_t reason_why; - - ActiveCategoriesIterator begin, end = m_active_categories.end(); - - Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DATAFORMATTERS)); - - if (log) { - for (auto match : match_data.GetMatchesVector()) { - LLDB_LOGF( - log, - "[CategoryMap::GetSyntheticChildren] candidate match = %s %s %s %s " - "reason = %" PRIu32, - match.GetTypeName().GetCString(), - match.DidStripPointer() ? "strip-pointers" : "no-strip-pointers", - match.DidStripReference() ? "strip-reference" : "no-strip-reference", - match.DidStripTypedef() ? "strip-typedef" : "no-strip-typedef", - match.GetReason()); - } - } - for (begin = m_active_categories.begin(); begin != end; begin++) { - lldb::TypeCategoryImplSP category_sp = *begin; - lldb::SyntheticChildrenSP current_format; - LLDB_LOGF(log, - "[CategoryMap::GetSyntheticChildren] Trying to use category %s", - category_sp->GetName()); - if (!category_sp->Get(match_data.GetValueObject(), - match_data.GetMatchesVector(), current_format, - &reason_why)) - continue; - return current_format; + retval = std::move(current_format); + return; } - LLDB_LOGF(log, - "[CategoryMap::GetSyntheticChildren] nothing found - returning " - "empty SP"); - return lldb::SyntheticChildrenSP(); + LLDB_LOGF(log, "[%s] nothing found - returning empty SP", __FUNCTION__); } -lldb::TypeValidatorImplSP -TypeCategoryMap::GetValidator(FormattersMatchData &match_data) { - std::lock_guard guard(m_map_mutex); - - uint32_t reason_why; - ActiveCategoriesIterator begin, end = m_active_categories.end(); - - Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DATAFORMATTERS)); - - if (log) { - for (auto match : match_data.GetMatchesVector()) { - LLDB_LOGF( - log, - "[CategoryMap::GetValidator] candidate match = %s %s %s %s reason = " - "%" PRIu32, - match.GetTypeName().GetCString(), - match.DidStripPointer() ? "strip-pointers" : "no-strip-pointers", - match.DidStripReference() ? "strip-reference" : "no-strip-reference", - match.DidStripTypedef() ? "strip-typedef" : "no-strip-typedef", - match.GetReason()); - } - } - - for (begin = m_active_categories.begin(); begin != end; begin++) { - lldb::TypeCategoryImplSP category_sp = *begin; - lldb::TypeValidatorImplSP current_format; - LLDB_LOGF(log, "[CategoryMap::GetValidator] Trying to use category %s", - category_sp->GetName()); - if (!category_sp->Get(match_data.GetValueObject(), - match_data.GetMatchesVector(), current_format, - &reason_why)) - continue; - return current_format; - } - LLDB_LOGF(log, - "[CategoryMap::GetValidator] nothing found - returning empty SP"); - return lldb::TypeValidatorImplSP(); -} +/// Explicit instantiations for the four types. +/// \{ +template void TypeCategoryMap::Get( + FormattersMatchData &match_data, lldb::TypeValidatorImplSP &retval); + +template void +TypeCategoryMap::Get(FormattersMatchData &match_data, + lldb::TypeFormatImplSP &retval); +template void +TypeCategoryMap::Get(FormattersMatchData &match_data, + lldb::TypeSummaryImplSP &retval); +template void TypeCategoryMap::Get( + FormattersMatchData &match_data, lldb::SyntheticChildrenSP &retval); +/// \} void TypeCategoryMap::ForEach(ForEachCallback callback) { if (callback) {