diff options
author | Enrico Granata <egranata@apple.com> | 2015-09-16 18:28:11 +0000 |
---|---|---|
committer | Enrico Granata <egranata@apple.com> | 2015-09-16 18:28:11 +0000 |
commit | 7cb59e1a0f000e11d4dfb839f0ddbb0cba34f179 (patch) | |
tree | 6c1bdc8b7fd46d5d37e35aee64d32c1514a3d394 /lldb/source | |
parent | b33bac9a7001a44047b21a67acbfcabd6c3741b2 (diff) | |
download | bcm5719-llvm-7cb59e1a0f000e11d4dfb839f0ddbb0cba34f179.tar.gz bcm5719-llvm-7cb59e1a0f000e11d4dfb839f0ddbb0cba34f179.zip |
Move hardcoded formatters from the FormatManager to the Language plugins
llvm-svn: 247831
Diffstat (limited to 'lldb/source')
-rw-r--r-- | lldb/source/DataFormatters/FormatManager.cpp | 132 | ||||
-rw-r--r-- | lldb/source/DataFormatters/LanguageCategory.cpp | 124 | ||||
-rw-r--r-- | lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp | 73 | ||||
-rw-r--r-- | lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h | 6 | ||||
-rw-r--r-- | lldb/source/Target/Language.cpp | 24 |
5 files changed, 261 insertions, 98 deletions
diff --git a/lldb/source/DataFormatters/FormatManager.cpp b/lldb/source/DataFormatters/FormatManager.cpp index 37b33f24eb6..8fcb8217c39 100644 --- a/lldb/source/DataFormatters/FormatManager.cpp +++ b/lldb/source/DataFormatters/FormatManager.cpp @@ -15,8 +15,6 @@ // Project includes #include "lldb/Core/Debugger.h" -#include "lldb/DataFormatters/CXXFunctionPointer.h" -#include "lldb/DataFormatters/VectorType.h" #include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/DataFormatters/LanguageCategory.h" #include "lldb/Target/ExecutionContext.h" @@ -686,13 +684,18 @@ lldb::TypeFormatImplSP FormatManager::GetHardcodedFormat (ValueObject& valobj, lldb::DynamicValueType use_dynamic) { - for (const auto& candidate: m_hardcoded_formats) + TypeFormatImplSP retval_sp; + + for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj)) { - auto result = candidate(valobj,use_dynamic,*this); - if (result) - return result; + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->GetHardcoded(valobj, use_dynamic, *this, retval_sp)) + break; + } } - return nullptr; + + return retval_sp; } lldb::TypeFormatImplSP @@ -766,13 +769,18 @@ lldb::TypeSummaryImplSP FormatManager::GetHardcodedSummaryFormat (ValueObject& valobj, lldb::DynamicValueType use_dynamic) { - for (const auto& candidate: m_hardcoded_summaries) + TypeSummaryImplSP retval_sp; + + for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj)) { - auto result = candidate(valobj,use_dynamic,*this); - if (result) - return result; + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->GetHardcoded(valobj, use_dynamic, *this, retval_sp)) + break; + } } - return nullptr; + + return retval_sp; } lldb::TypeSummaryImplSP @@ -847,13 +855,18 @@ lldb::SyntheticChildrenSP FormatManager::GetHardcodedSyntheticChildren (ValueObject& valobj, lldb::DynamicValueType use_dynamic) { - for (const auto& candidate: m_hardcoded_synthetics) + SyntheticChildrenSP retval_sp; + + for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj)) { - auto result = candidate(valobj,use_dynamic,*this); - if (result) - return result; + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->GetHardcoded(valobj, use_dynamic, *this, retval_sp)) + break; + } } - return nullptr; + + return retval_sp; } lldb::SyntheticChildrenSP @@ -995,13 +1008,18 @@ lldb::TypeValidatorImplSP FormatManager::GetHardcodedValidator (ValueObject& valobj, lldb::DynamicValueType use_dynamic) { - for (const auto& candidate: m_hardcoded_validators) + TypeValidatorImplSP retval_sp; + + for (lldb::LanguageType lang_type : GetCandidateLanguages(valobj)) { - auto result = candidate(valobj,use_dynamic,*this); - if (result) - return result; + if (LanguageCategory* lang_category = GetCategoryForLanguage(lang_type)) + { + if (lang_category->GetHardcoded(valobj, use_dynamic, *this, retval_sp)) + break; + } } - return nullptr; + + return retval_sp; } FormatManager::FormatManager() : @@ -1013,16 +1031,10 @@ FormatManager::FormatManager() : m_language_categories_mutex(Mutex::eMutexTypeRecursive), m_default_category_name(ConstString("default")), m_system_category_name(ConstString("system")), - m_vectortypes_category_name(ConstString("VectorTypes")), - m_hardcoded_formats(), - m_hardcoded_summaries(), - m_hardcoded_synthetics(), - m_hardcoded_validators() - + m_vectortypes_category_name(ConstString("VectorTypes")) { LoadSystemFormatters(); LoadVectorFormatters(); - LoadHardcodedFormatters(); EnableCategory(m_vectortypes_category_name,TypeCategoryMap::Last); EnableCategory(m_system_category_name,TypeCategoryMap::Last); @@ -1156,65 +1168,3 @@ FormatManager::LoadVectorFormatters() ConstString("vBool32"), vector_flags); } - -void -FormatManager::LoadHardcodedFormatters() -{ - { - // insert code to load formats here - } - { - // insert code to load summaries here - m_hardcoded_summaries.push_back( - [](lldb_private::ValueObject& valobj, - lldb::DynamicValueType, - FormatManager&) -> TypeSummaryImpl::SharedPointer { - static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags(), lldb_private::formatters::CXXFunctionPointerSummaryProvider, "Function pointer summary provider")); - if (valobj.GetCompilerType().IsFunctionPointerType()) - { - return formatter_sp; - } - return nullptr; - }); - m_hardcoded_summaries.push_back( - [](lldb_private::ValueObject& valobj, - lldb::DynamicValueType, - FormatManager& fmt_mgr) -> TypeSummaryImpl::SharedPointer { - static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags() - .SetCascades(true) - .SetDontShowChildren(true) - .SetHideItemNames(true) - .SetShowMembersOneLiner(true) - .SetSkipPointers(true) - .SetSkipReferences(false), - lldb_private::formatters::VectorTypeSummaryProvider, - "vector_type pointer summary provider")); - if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr)) - { - if (fmt_mgr.GetCategory(fmt_mgr.m_vectortypes_category_name)->IsEnabled()) - return formatter_sp; - } - return nullptr; - }); - } - { - // insert code to load synthetics here - m_hardcoded_synthetics.push_back( - [](lldb_private::ValueObject& valobj, - lldb::DynamicValueType, - FormatManager& fmt_mgr) -> SyntheticChildren::SharedPointer { - static CXXSyntheticChildren::SharedPointer formatter_sp(new CXXSyntheticChildren(SyntheticChildren::Flags().SetCascades(true).SetSkipPointers(true).SetSkipReferences(true).SetNonCacheable(true), - "vector_type synthetic children", - lldb_private::formatters::VectorTypeSyntheticFrontEndCreator)); - if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr)) - { - if (fmt_mgr.GetCategory(fmt_mgr.m_vectortypes_category_name)->IsEnabled()) - return formatter_sp; - } - return nullptr; - }); - } - { - // insert code to load validators here - } -} diff --git a/lldb/source/DataFormatters/LanguageCategory.cpp b/lldb/source/DataFormatters/LanguageCategory.cpp index 3d4d5cf984d..8d099e58aec 100644 --- a/lldb/source/DataFormatters/LanguageCategory.cpp +++ b/lldb/source/DataFormatters/LanguageCategory.cpp @@ -26,12 +26,22 @@ using namespace lldb_private; LanguageCategory::LanguageCategory (lldb::LanguageType lang_type) : m_category_sp(), - m_format_cache() + m_hardcoded_formats(), + m_hardcoded_summaries(), + m_hardcoded_synthetics(), + m_hardcoded_validators(), + m_format_cache(), + m_enabled(false) { if (Language* language_plugin = Language::FindPlugin(lang_type)) + { m_category_sp = language_plugin->GetFormatters(); - if (m_category_sp) - m_category_sp->Enable(true, 1); + m_hardcoded_formats = language_plugin->GetHardcodedFormats(); + m_hardcoded_summaries = language_plugin->GetHardcodedSummaries(); + m_hardcoded_synthetics = language_plugin->GetHardcodedSynthetics(); + m_hardcoded_validators = language_plugin->GetHardcodedValidators(); + } + Enable(); } bool @@ -43,7 +53,7 @@ LanguageCategory::Get (ValueObject& valobj, if (!m_category_sp) return false; - if (!m_category_sp->IsEnabled()) + if (!IsEnabled()) return false; ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic); @@ -69,7 +79,7 @@ LanguageCategory::Get (ValueObject& valobj, if (!m_category_sp) return false; - if (!m_category_sp->IsEnabled()) + if (!IsEnabled()) return false; ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic); @@ -95,7 +105,7 @@ LanguageCategory::Get (ValueObject& valobj, if (!m_category_sp) return false; - if (!m_category_sp->IsEnabled()) + if (!IsEnabled()) return false; ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic); @@ -121,7 +131,7 @@ LanguageCategory::Get (ValueObject& valobj, if (!m_category_sp) return false; - if (!m_category_sp->IsEnabled()) + if (!IsEnabled()) return false; ConstString type_name = FormatManager::GetTypeForCache(valobj, dynamic); @@ -138,6 +148,98 @@ LanguageCategory::Get (ValueObject& valobj, return result; } +bool +LanguageCategory::GetHardcoded (ValueObject& valobj, + lldb::DynamicValueType use_dynamic, + FormatManager& fmt_mgr, + lldb::TypeFormatImplSP& format_sp) +{ + if (!IsEnabled()) + return false; + + ConstString type_name = FormatManager::GetTypeForCache(valobj, use_dynamic); + + for (auto& candidate : m_hardcoded_formats) + { + if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr))) + break; + } + if (type_name && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetFormat(type_name, format_sp); + } + return format_sp.get() != nullptr; +} + +bool +LanguageCategory::GetHardcoded (ValueObject& valobj, + lldb::DynamicValueType use_dynamic, + FormatManager& fmt_mgr, + lldb::TypeSummaryImplSP& format_sp) +{ + if (!IsEnabled()) + return false; + + ConstString type_name = FormatManager::GetTypeForCache(valobj, use_dynamic); + + for (auto& candidate : m_hardcoded_summaries) + { + if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr))) + break; + } + if (type_name && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetSummary(type_name, format_sp); + } + return format_sp.get() != nullptr; +} + +bool +LanguageCategory::GetHardcoded (ValueObject& valobj, + lldb::DynamicValueType use_dynamic, + FormatManager& fmt_mgr, + lldb::SyntheticChildrenSP& format_sp) +{ + if (!IsEnabled()) + return false; + + ConstString type_name = FormatManager::GetTypeForCache(valobj, use_dynamic); + + for (auto& candidate : m_hardcoded_synthetics) + { + if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr))) + break; + } + if (type_name && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetSynthetic(type_name, format_sp); + } + return format_sp.get() != nullptr; +} + +bool +LanguageCategory::GetHardcoded (ValueObject& valobj, + lldb::DynamicValueType use_dynamic, + FormatManager& fmt_mgr, + lldb::TypeValidatorImplSP& format_sp) +{ + if (!IsEnabled()) + return false; + + ConstString type_name = FormatManager::GetTypeForCache(valobj, use_dynamic); + + for (auto& candidate : m_hardcoded_validators) + { + if ((format_sp = candidate(valobj, use_dynamic, fmt_mgr))) + break; + } + if (type_name && (!format_sp || !format_sp->NonCacheable())) + { + m_format_cache.SetValidator(type_name, format_sp); + } + return format_sp.get() != nullptr; +} + lldb::TypeCategoryImplSP LanguageCategory::GetCategory () const { @@ -149,6 +251,7 @@ LanguageCategory::Enable () { if (m_category_sp) m_category_sp->Enable(true, TypeCategoryMap::Default); + m_enabled = true; } void @@ -156,4 +259,11 @@ LanguageCategory::Disable () { if (m_category_sp) m_category_sp->Disable(); + m_enabled = false; +} + +bool +LanguageCategory::IsEnabled () +{ + return m_enabled; } diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 77064797fde..6a9070b5f50 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -17,8 +17,10 @@ #include "lldb/Core/PluginManager.h" #include "lldb/Core/RegularExpression.h" #include "lldb/Core/UniqueCStringMap.h" +#include "lldb/DataFormatters/CXXFunctionPointer.h" #include "lldb/DataFormatters/DataVisualization.h" #include "lldb/DataFormatters/FormattersHelpers.h" +#include "lldb/DataFormatters/VectorType.h" #include "CxxStringTypes.h" #include "LibCxx.h" @@ -669,3 +671,74 @@ CPlusPlusLanguage::GetFormatters () return g_category; } +HardcodedFormatters::HardcodedSummaryFinder +CPlusPlusLanguage::GetHardcodedSummaries () +{ + static std::once_flag g_initialize; + static ConstString g_vectortypes("VectorTypes"); + static HardcodedFormatters::HardcodedSummaryFinder g_formatters; + + std::call_once(g_initialize, [] () -> void { + g_formatters.push_back( + [](lldb_private::ValueObject& valobj, + lldb::DynamicValueType, + FormatManager&) -> TypeSummaryImpl::SharedPointer { + static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags(), lldb_private::formatters::CXXFunctionPointerSummaryProvider, "Function pointer summary provider")); + if (valobj.GetCompilerType().IsFunctionPointerType()) + { + return formatter_sp; + } + return nullptr; + }); + g_formatters.push_back( + [](lldb_private::ValueObject& valobj, + lldb::DynamicValueType, + FormatManager& fmt_mgr) -> TypeSummaryImpl::SharedPointer { + static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags() + .SetCascades(true) + .SetDontShowChildren(true) + .SetHideItemNames(true) + .SetShowMembersOneLiner(true) + .SetSkipPointers(true) + .SetSkipReferences(false), + lldb_private::formatters::VectorTypeSummaryProvider, + "vector_type pointer summary provider")); + if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr)) + { + if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled()) + return formatter_sp; + } + return nullptr; + }); + }); + + return g_formatters; +} + +HardcodedFormatters::HardcodedSyntheticFinder +CPlusPlusLanguage::GetHardcodedSynthetics () +{ + static std::once_flag g_initialize; + static ConstString g_vectortypes("VectorTypes"); + static HardcodedFormatters::HardcodedSyntheticFinder g_formatters; + + std::call_once(g_initialize, [] () -> void { + g_formatters.push_back( + [](lldb_private::ValueObject& valobj, + lldb::DynamicValueType, + FormatManager& fmt_mgr) -> SyntheticChildren::SharedPointer { + static CXXSyntheticChildren::SharedPointer formatter_sp(new CXXSyntheticChildren(SyntheticChildren::Flags().SetCascades(true).SetSkipPointers(true).SetSkipReferences(true).SetNonCacheable(true), + "vector_type synthetic children", + lldb_private::formatters::VectorTypeSyntheticFrontEndCreator)); + if (valobj.GetCompilerType().IsVectorType(nullptr, nullptr)) + { + if (fmt_mgr.GetCategory(g_vectortypes)->IsEnabled()) + return formatter_sp; + } + return nullptr; + }); + }); + + return g_formatters; +} + diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h index 1dba19b13a2..ec2681af759 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h @@ -129,6 +129,12 @@ public: lldb::TypeCategoryImplSP GetFormatters () override; + HardcodedFormatters::HardcodedSummaryFinder + GetHardcodedSummaries () override; + + HardcodedFormatters::HardcodedSyntheticFinder + GetHardcodedSynthetics () override; + //------------------------------------------------------------------ // Static Functions //------------------------------------------------------------------ diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp index dea0dd83005..13d843441e7 100644 --- a/lldb/source/Target/Language.cpp +++ b/lldb/source/Target/Language.cpp @@ -95,6 +95,30 @@ Language::GetFormatters () return nullptr; } +HardcodedFormatters::HardcodedFormatFinder +Language::GetHardcodedFormats () +{ + return {}; +} + +HardcodedFormatters::HardcodedSummaryFinder +Language::GetHardcodedSummaries () +{ + return {}; +} + +HardcodedFormatters::HardcodedSyntheticFinder +Language::GetHardcodedSynthetics () +{ + return {}; +} + +HardcodedFormatters::HardcodedValidatorFinder +Language::GetHardcodedValidators () +{ + return {}; +} + std::vector<ConstString> Language::GetPossibleFormattersMatches (ValueObject& valobj, lldb::DynamicValueType use_dynamic) { |