summaryrefslogtreecommitdiffstats
path: root/lldb/source/DataFormatters
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/DataFormatters')
-rw-r--r--lldb/source/DataFormatters/DataVisualization.cpp2
-rw-r--r--lldb/source/DataFormatters/FormatManager.cpp4
-rw-r--r--lldb/source/DataFormatters/FormattersHelpers.cpp11
-rw-r--r--lldb/source/DataFormatters/TypeCategory.cpp151
-rw-r--r--lldb/source/DataFormatters/TypeCategoryMap.cpp10
5 files changed, 164 insertions, 14 deletions
diff --git a/lldb/source/DataFormatters/DataVisualization.cpp b/lldb/source/DataFormatters/DataVisualization.cpp
index 16e600201d2..fdf86832ed6 100644
--- a/lldb/source/DataFormatters/DataVisualization.cpp
+++ b/lldb/source/DataFormatters/DataVisualization.cpp
@@ -164,7 +164,7 @@ DataVisualization::Categories::Enable (const ConstString& category,
{
if (GetFormatManager().GetCategory(category)->IsEnabled())
GetFormatManager().DisableCategory(category);
- GetFormatManager().EnableCategory(category, pos);
+ GetFormatManager().EnableCategory(category, pos, std::initializer_list<lldb::LanguageType>());
}
void
diff --git a/lldb/source/DataFormatters/FormatManager.cpp b/lldb/source/DataFormatters/FormatManager.cpp
index 8fcb8217c39..c6dd146c2b7 100644
--- a/lldb/source/DataFormatters/FormatManager.cpp
+++ b/lldb/source/DataFormatters/FormatManager.cpp
@@ -1036,8 +1036,8 @@ FormatManager::FormatManager() :
LoadSystemFormatters();
LoadVectorFormatters();
- EnableCategory(m_vectortypes_category_name,TypeCategoryMap::Last);
- EnableCategory(m_system_category_name,TypeCategoryMap::Last);
+ EnableCategory(m_vectortypes_category_name,TypeCategoryMap::Last, lldb::eLanguageTypeObjC_plus_plus);
+ EnableCategory(m_system_category_name,TypeCategoryMap::Last, lldb::eLanguageTypeObjC_plus_plus);
}
void
diff --git a/lldb/source/DataFormatters/FormattersHelpers.cpp b/lldb/source/DataFormatters/FormattersHelpers.cpp
index ba5f6c04f78..c2fcb98ec88 100644
--- a/lldb/source/DataFormatters/FormattersHelpers.cpp
+++ b/lldb/source/DataFormatters/FormattersHelpers.cpp
@@ -40,6 +40,17 @@ lldb_private::formatters::AddFormat (TypeCategoryImpl::SharedPointer category_sp
category_sp->GetTypeFormatsContainer()->Add(type_name, format_sp);
}
+void
+lldb_private::formatters::AddSummary(TypeCategoryImpl::SharedPointer category_sp,
+ TypeSummaryImplSP summary_sp,
+ ConstString type_name,
+ bool regex)
+{
+ if (regex)
+ category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())),summary_sp);
+ else
+ category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp);
+}
void
lldb_private::formatters::AddStringSummary(TypeCategoryImpl::SharedPointer category_sp,
diff --git a/lldb/source/DataFormatters/TypeCategory.cpp b/lldb/source/DataFormatters/TypeCategory.cpp
index b05cea55ff5..636d935b762 100644
--- a/lldb/source/DataFormatters/TypeCategory.cpp
+++ b/lldb/source/DataFormatters/TypeCategory.cpp
@@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#include "lldb/DataFormatters/TypeCategory.h"
+#include "lldb/Target/Language.h"
// C Includes
// C++ Includes
@@ -18,7 +19,8 @@ using namespace lldb;
using namespace lldb_private;
TypeCategoryImpl::TypeCategoryImpl(IFormatChangeListener* clist,
- ConstString name) :
+ ConstString name,
+ std::initializer_list<lldb::LanguageType> langs) :
m_format_cont("format","regex-format",clist),
m_summary_cont("summary","regex-summary",clist),
m_filter_cont("filter","regex-filter",clist),
@@ -29,8 +31,118 @@ m_validator_cont("validator","regex-validator",clist),
m_enabled(false),
m_change_listener(clist),
m_mutex(Mutex::eMutexTypeRecursive),
-m_name(name)
-{}
+m_name(name),
+m_languages()
+{
+ for (const lldb::LanguageType lang : langs)
+ AddLanguage(lang);
+}
+
+static bool
+IsApplicable(lldb::LanguageType category_lang,
+ lldb::LanguageType valobj_lang)
+{
+ switch (category_lang)
+ {
+ // these are not languages that LLDB would ordinarily deal with
+ // only allow an exact equality here, since we really don't know
+ // any better
+ case eLanguageTypeAda83:
+ case eLanguageTypeCobol74:
+ case eLanguageTypeCobol85:
+ case eLanguageTypeFortran77:
+ case eLanguageTypeFortran90:
+ case eLanguageTypePascal83:
+ case eLanguageTypeModula2:
+ case eLanguageTypeJava:
+ case eLanguageTypeAda95:
+ case eLanguageTypeFortran95:
+ case eLanguageTypePLI:
+ case eLanguageTypeUPC:
+ case eLanguageTypeD:
+ case eLanguageTypePython:
+ return category_lang == valobj_lang;
+
+ // the C family, we consider it as one
+ case eLanguageTypeC89:
+ case eLanguageTypeC:
+ case eLanguageTypeC99:
+ return valobj_lang == eLanguageTypeC89 ||
+ valobj_lang == eLanguageTypeC ||
+ valobj_lang == eLanguageTypeC99;
+
+ // ObjC knows about C and itself
+ case eLanguageTypeObjC:
+ return valobj_lang == eLanguageTypeC89 ||
+ valobj_lang == eLanguageTypeC ||
+ valobj_lang == eLanguageTypeC99 ||
+ valobj_lang == eLanguageTypeObjC;
+
+ // C++ knows about C and C++
+ case eLanguageTypeC_plus_plus:
+ return valobj_lang == eLanguageTypeC89 ||
+ valobj_lang == eLanguageTypeC ||
+ valobj_lang == eLanguageTypeC99 ||
+ valobj_lang == eLanguageTypeC_plus_plus;
+
+ // ObjC++ knows about C,C++,ObjC and ObjC++
+ case eLanguageTypeObjC_plus_plus:
+ return valobj_lang == eLanguageTypeC89 ||
+ valobj_lang == eLanguageTypeC ||
+ valobj_lang == eLanguageTypeC99 ||
+ valobj_lang == eLanguageTypeC_plus_plus ||
+ valobj_lang == eLanguageTypeObjC;
+
+ default:
+ case eLanguageTypeUnknown:
+ return true;
+ }
+}
+
+bool
+TypeCategoryImpl::IsApplicable (ValueObject& valobj)
+{
+ lldb::LanguageType valobj_lang = valobj.GetObjectRuntimeLanguage();
+ for (size_t idx = 0;
+ idx < GetNumLanguages();
+ idx++)
+ {
+ const lldb::LanguageType category_lang = GetLanguageAtIndex(idx);
+ if (::IsApplicable(category_lang,valobj_lang))
+ return true;
+ }
+ return false;
+}
+
+size_t
+TypeCategoryImpl::GetNumLanguages ()
+{
+ if (m_languages.empty())
+ return 1;
+ return m_languages.size();
+}
+
+lldb::LanguageType
+TypeCategoryImpl::GetLanguageAtIndex (size_t idx)
+{
+ if (m_languages.empty())
+ return lldb::eLanguageTypeUnknown;
+ return m_languages[idx];
+}
+
+void
+TypeCategoryImpl::AddLanguage (lldb::LanguageType lang)
+{
+ m_languages.push_back(lang);
+}
+
+bool
+TypeCategoryImpl::HasLanguage (lldb::LanguageType lang)
+{
+ const auto iter = std::find(m_languages.begin(), m_languages.end(), lang),
+ end = m_languages.end();
+ return (iter != end);
+}
bool
TypeCategoryImpl::Get (ValueObject& valobj,
@@ -38,7 +150,7 @@ TypeCategoryImpl::Get (ValueObject& valobj,
lldb::TypeFormatImplSP& entry,
uint32_t* reason)
{
- if (!IsEnabled())
+ if (!IsEnabled() || !IsApplicable(valobj))
return false;
if (GetTypeFormatsContainer()->Get(candidates, entry, reason))
return true;
@@ -54,7 +166,7 @@ TypeCategoryImpl::Get (ValueObject& valobj,
lldb::TypeSummaryImplSP& entry,
uint32_t* reason)
{
- if (!IsEnabled())
+ if (!IsEnabled() || !IsApplicable(valobj))
return false;
if (GetTypeSummariesContainer()->Get(candidates, entry, reason))
return true;
@@ -70,7 +182,7 @@ TypeCategoryImpl::Get (ValueObject& valobj,
lldb::SyntheticChildrenSP& entry,
uint32_t* reason)
{
- if (!IsEnabled())
+ if (!IsEnabled() || !IsApplicable(valobj))
return false;
TypeFilterImpl::SharedPointer filter_sp;
uint32_t reason_filter = 0;
@@ -567,3 +679,30 @@ TypeCategoryImpl::Enable (bool value, uint32_t position)
if (m_change_listener)
m_change_listener->Changed();
}
+
+std::string
+TypeCategoryImpl::GetDescription ()
+{
+ StreamString stream;
+ stream.Printf("%s (%s",
+ GetName(),
+ (IsEnabled() ? "enabled" : "disabled"));
+ StreamString lang_stream;
+ lang_stream.Printf(", applicable for language(s): ");
+ bool print_lang = false;
+ for (size_t idx = 0;
+ idx < GetNumLanguages();
+ idx++)
+ {
+ const lldb::LanguageType lang = GetLanguageAtIndex(idx);
+ if (lang != lldb::eLanguageTypeUnknown)
+ print_lang = true;
+ lang_stream.Printf("%s%s",
+ Language::GetNameForLanguageType(lang),
+ idx+1<GetNumLanguages() ? ", " : "");
+ }
+ if (print_lang)
+ stream.Printf("%s",lang_stream.GetData());
+ stream.PutChar(')');
+ return stream.GetData();
+}
diff --git a/lldb/source/DataFormatters/TypeCategoryMap.cpp b/lldb/source/DataFormatters/TypeCategoryMap.cpp
index fbfeeab9269..1ebfbd528b9 100644
--- a/lldb/source/DataFormatters/TypeCategoryMap.cpp
+++ b/lldb/source/DataFormatters/TypeCategoryMap.cpp
@@ -247,7 +247,7 @@ TypeCategoryMap::GetFormat (ValueObject& valobj,
lldb::TypeCategoryImplSP category_sp = *begin;
lldb::TypeFormatImplSP current_format;
if (log)
- log->Printf("\n[TypeCategoryMap::GetFormat] Trying to use category %s", category_sp->GetName());
+ log->Printf("[TypeCategoryMap::GetFormat] Trying to use category %s", category_sp->GetName());
if (!category_sp->Get(valobj, matches, current_format, &reason_why))
continue;
return current_format;
@@ -287,7 +287,7 @@ TypeCategoryMap::GetSummaryFormat (ValueObject& valobj,
lldb::TypeCategoryImplSP category_sp = *begin;
lldb::TypeSummaryImplSP current_format;
if (log)
- log->Printf("\n[CategoryMap::GetSummaryFormat] Trying to use category %s", category_sp->GetName());
+ log->Printf("[CategoryMap::GetSummaryFormat] Trying to use category %s", category_sp->GetName());
if (!category_sp->Get(valobj, matches, current_format, &reason_why))
continue;
return current_format;
@@ -329,7 +329,7 @@ TypeCategoryMap::GetSyntheticChildren (ValueObject& valobj,
lldb::TypeCategoryImplSP category_sp = *begin;
lldb::SyntheticChildrenSP current_format;
if (log)
- log->Printf("\n[CategoryMap::GetSyntheticChildren] Trying to use category %s", category_sp->GetName());
+ log->Printf("[CategoryMap::GetSyntheticChildren] Trying to use category %s", category_sp->GetName());
if (!category_sp->Get(valobj, matches, current_format, &reason_why))
continue;
return current_format;
@@ -356,7 +356,7 @@ TypeCategoryMap::GetValidator (ValueObject& valobj,
{
for (auto match : matches)
{
- log->Printf("[CategoryMap::GetSummaryFormat] candidate match = %s %s %s %s reason = %" PRIu32,
+ log->Printf("[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",
@@ -370,7 +370,7 @@ TypeCategoryMap::GetValidator (ValueObject& valobj,
lldb::TypeCategoryImplSP category_sp = *begin;
lldb::TypeValidatorImplSP current_format;
if (log)
- log->Printf("\n[CategoryMap::GetValidator] Trying to use category %s", category_sp->GetName());
+ log->Printf("[CategoryMap::GetValidator] Trying to use category %s", category_sp->GetName());
if (!category_sp->Get(valobj, matches, current_format, &reason_why))
continue;
return current_format;
OpenPOWER on IntegriCloud