From 62a6d9770450f93a2dcdf04710a73341af2f54fa Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Mon, 9 Dec 2019 16:38:19 -0800 Subject: Do not cache hardcoded formats in FormatManager The cache in FormatCache uses only a type name as key. The hardcoded formats, synthetic children, etc inspect an entire ValueObject to determine their eligibility, which isn't modelled in the cache. This leads to bugs such as the one in this patch (where two similarly named types in different files have different hardcoded summary providers). The problem is exaggerated in the Swift language plugin due to the language's dynamic nature. rdar://problem/57756763 Differential Revision: https://reviews.llvm.org/D71233 --- lldb/source/DataFormatters/FormatManager.cpp | 30 +++++++++++++++++----------- 1 file changed, 18 insertions(+), 12 deletions(-) (limited to 'lldb/source/DataFormatters/FormatManager.cpp') diff --git a/lldb/source/DataFormatters/FormatManager.cpp b/lldb/source/DataFormatters/FormatManager.cpp index c8ddbd45594..db15a7f7a4c 100644 --- a/lldb/source/DataFormatters/FormatManager.cpp +++ b/lldb/source/DataFormatters/FormatManager.cpp @@ -622,11 +622,21 @@ ImplSP FormatManager::GetHardcoded(FormattersMatchData &match_data) { return retval_sp; } -template ImplSP -FormatManager::GetCached(ValueObject &valobj, - lldb::DynamicValueType use_dynamic) { - ImplSP retval_sp; +template +ImplSP FormatManager::Get(ValueObject &valobj, + lldb::DynamicValueType use_dynamic) { FormattersMatchData match_data(valobj, use_dynamic); + if (ImplSP retval_sp = GetCached(match_data)) + return retval_sp; + + Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DATAFORMATTERS)); + LLDB_LOGF(log, "[%s] Search failed. Giving hardcoded a chance.", __FUNCTION__); + return GetHardcoded(match_data); +} + +template +ImplSP FormatManager::GetCached(FormattersMatchData &match_data) { + ImplSP retval_sp; Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_DATAFORMATTERS)); if (match_data.GetTypeForCache()) { LLDB_LOGF(log, "\n\n[%s] Looking into cache for type %s", __FUNCTION__, @@ -659,10 +669,6 @@ FormatManager::GetCached(ValueObject &valobj, return retval_sp; } } - if (!retval_sp) { - LLDB_LOGF(log, "[%s] Search failed. Giving hardcoded a chance.", __FUNCTION__); - retval_sp = GetHardcoded(match_data); - } if (match_data.GetTypeForCache() && (!retval_sp || !retval_sp->NonCacheable())) { LLDB_LOGF(log, "[%s] Caching %p for type %s", __FUNCTION__, @@ -678,25 +684,25 @@ FormatManager::GetCached(ValueObject &valobj, lldb::TypeFormatImplSP FormatManager::GetFormat(ValueObject &valobj, lldb::DynamicValueType use_dynamic) { - return GetCached(valobj, use_dynamic); + return Get(valobj, use_dynamic); } lldb::TypeSummaryImplSP FormatManager::GetSummaryFormat(ValueObject &valobj, lldb::DynamicValueType use_dynamic) { - return GetCached(valobj, use_dynamic); + return Get(valobj, use_dynamic); } lldb::SyntheticChildrenSP FormatManager::GetSyntheticChildren(ValueObject &valobj, lldb::DynamicValueType use_dynamic) { - return GetCached(valobj, use_dynamic); + return Get(valobj, use_dynamic); } lldb::TypeValidatorImplSP FormatManager::GetValidator(ValueObject &valobj, lldb::DynamicValueType use_dynamic) { - return GetCached(valobj, use_dynamic); + return Get(valobj, use_dynamic); } FormatManager::FormatManager() -- cgit v1.2.3