summaryrefslogtreecommitdiffstats
path: root/lldb/source
diff options
context:
space:
mode:
authorEnrico Granata <egranata@apple.com>2015-09-16 18:28:11 +0000
committerEnrico Granata <egranata@apple.com>2015-09-16 18:28:11 +0000
commit7cb59e1a0f000e11d4dfb839f0ddbb0cba34f179 (patch)
tree6c1bdc8b7fd46d5d37e35aee64d32c1514a3d394 /lldb/source
parentb33bac9a7001a44047b21a67acbfcabd6c3741b2 (diff)
downloadbcm5719-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.cpp132
-rw-r--r--lldb/source/DataFormatters/LanguageCategory.cpp124
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp73
-rw-r--r--lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h6
-rw-r--r--lldb/source/Target/Language.cpp24
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)
{
OpenPOWER on IntegriCloud