summaryrefslogtreecommitdiffstats
path: root/lldb/source
diff options
context:
space:
mode:
authorEnrico Granata <granata.enrico@gmail.com>2012-02-02 23:34:52 +0000
committerEnrico Granata <granata.enrico@gmail.com>2012-02-02 23:34:52 +0000
commita6a60d0d87192d1cd99e46664c00e8e1d8d21da3 (patch)
treea68c05857e652796984fad930d2af47063d444c4 /lldb/source
parente30365bfc28be0ab425ab1dc24a6fd726b796abb (diff)
downloadbcm5719-llvm-a6a60d0d87192d1cd99e46664c00e8e1d8d21da3.tar.gz
bcm5719-llvm-a6a60d0d87192d1cd99e46664c00e8e1d8d21da3.zip
Added a new --omit-names (-O, uppercase letter o) option to "type summary add".
When used in conjunction with --inline-children, this option will cause the names of the values to be omitted from the output. This can be beneficial in cases such as vFloat, where it will compact the representation from ([0]=1,[1]=2,[2]=3,[3]=4) to (1, 2, 3, 4). Added a test case to check that the new option works correctly. Also took some time to revisit SummaryFormat and related classes and tweak them for added readability and maintainability. Finally, added a new class name to which the std::string summary should be applied. llvm-svn: 149644
Diffstat (limited to 'lldb/source')
-rw-r--r--lldb/source/Commands/CommandObjectType.cpp101
-rw-r--r--lldb/source/Core/FormatClasses.cpp80
-rw-r--r--lldb/source/Core/FormatManager.cpp59
3 files changed, 89 insertions, 151 deletions
diff --git a/lldb/source/Commands/CommandObjectType.cpp b/lldb/source/Commands/CommandObjectType.cpp
index d9ca0791384..5739bbe5e2b 100644
--- a/lldb/source/Commands/CommandObjectType.cpp
+++ b/lldb/source/Commands/CommandObjectType.cpp
@@ -37,38 +37,22 @@ class ScriptAddOptions
public:
- bool m_skip_pointers;
- bool m_skip_references;
- bool m_cascade;
+ SummaryFormat::Flags m_flags;
+
StringList m_target_types;
StringList m_user_source;
- bool m_no_children;
- bool m_no_value;
- bool m_one_liner;
bool m_regex;
-
+
ConstString m_name;
std::string m_category;
- ScriptAddOptions(bool sptr,
- bool sref,
- bool casc,
- bool noch,
- bool novl,
- bool onel,
+ ScriptAddOptions(const SummaryFormat::Flags& flags,
bool regx,
const ConstString& name,
std::string catg) :
- m_skip_pointers(sptr),
- m_skip_references(sref),
- m_cascade(casc),
- m_target_types(),
- m_user_source(),
- m_no_children(noch),
- m_no_value(novl),
- m_one_liner(onel),
+ m_flags(flags),
m_regex(regx),
m_name(name),
m_category(catg)
@@ -149,12 +133,7 @@ private:
// Instance variables to hold the values for command options.
- bool m_cascade;
- bool m_no_children;
- bool m_no_value;
- bool m_one_liner;
- bool m_skip_references;
- bool m_skip_pointers;
+ SummaryFormat::Flags m_flags;
bool m_regex;
std::string m_format_string;
ConstString m_name;
@@ -872,12 +851,7 @@ public:
// now I have a valid function name, let's add this as script for every type in the list
SummaryFormatSP script_format;
- script_format.reset(new ScriptSummaryFormat(options->m_cascade,
- options->m_skip_pointers,
- options->m_skip_references,
- options->m_no_children,
- options->m_no_value,
- options->m_one_liner,
+ script_format.reset(new ScriptSummaryFormat(options->m_flags,
std::string(funct_name),
options->m_user_source.CopyList(" ")));
@@ -951,27 +925,27 @@ CommandObjectTypeSummaryAdd::CommandOptions::SetOptionValue (uint32_t option_idx
switch (short_option)
{
case 'C':
- m_cascade = Args::StringToBoolean(option_arg, true, &success);
+ m_flags.SetCascades(Args::StringToBoolean(option_arg, true, &success));
if (!success)
error.SetErrorStringWithFormat("invalid value for cascade: %s", option_arg);
break;
case 'e':
- m_no_children = false;
+ m_flags.SetDontShowChildren(false);
break;
case 'v':
- m_no_value = true;
+ m_flags.SetDontShowValue(true);
break;
case 'c':
- m_one_liner = true;
+ m_flags.SetShowMembersOneLiner(true);
break;
case 's':
m_format_string = std::string(option_arg);
break;
case 'p':
- m_skip_pointers = true;
+ m_flags.SetSkipPointers(true);
break;
case 'r':
- m_skip_references = true;
+ m_flags.SetSkipReferences(true);
break;
case 'x':
m_regex = true;
@@ -993,6 +967,9 @@ CommandObjectTypeSummaryAdd::CommandOptions::SetOptionValue (uint32_t option_idx
case 'w':
m_category = std::string(option_arg);
break;
+ case 'O':
+ m_flags.SetHideItemNames(true);
+ break;
default:
error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
break;
@@ -1004,12 +981,9 @@ CommandObjectTypeSummaryAdd::CommandOptions::SetOptionValue (uint32_t option_idx
void
CommandObjectTypeSummaryAdd::CommandOptions::OptionParsingStarting ()
{
- m_cascade = true;
- m_no_children = true;
- m_no_value = false;
- m_one_liner = false;
- m_skip_references = false;
- m_skip_pointers = false;
+ m_flags.Clear().SetCascades().SetDontShowChildren().SetDontShowValue(false);
+ m_flags.SetShowMembersOneLiner(false).SetSkipPointers(false).SetSkipReferences(false).SetHideItemNames(false);
+
m_regex = false;
m_name.Clear();
m_python_script = "";
@@ -1080,12 +1054,7 @@ CommandObjectTypeSummaryAdd::Execute_ScriptSummary (Args& command, CommandReturn
return false;
}
- script_format.reset(new ScriptSummaryFormat(m_options.m_cascade,
- m_options.m_skip_pointers,
- m_options.m_skip_references,
- m_options.m_no_children,
- m_options.m_no_value,
- m_options.m_one_liner,
+ script_format.reset(new ScriptSummaryFormat(m_options.m_flags,
std::string(funct_name),
" " + m_options.m_python_function + "(valobj,dict)"));
}
@@ -1122,23 +1091,13 @@ CommandObjectTypeSummaryAdd::Execute_ScriptSummary (Args& command, CommandReturn
return false;
}
- script_format.reset(new ScriptSummaryFormat(m_options.m_cascade,
- m_options.m_skip_pointers,
- m_options.m_skip_references,
- m_options.m_no_children,
- m_options.m_no_value,
- m_options.m_one_liner,
+ script_format.reset(new ScriptSummaryFormat(m_options.m_flags,
std::string(funct_name),
" " + m_options.m_python_script));
}
else // use an InputReader to grab Python code from the user
{
- ScriptAddOptions *options = new ScriptAddOptions(m_options.m_skip_pointers,
- m_options.m_skip_references,
- m_options.m_cascade,
- m_options.m_no_children,
- m_options.m_no_value,
- m_options.m_one_liner,
+ ScriptAddOptions *options = new ScriptAddOptions(m_options.m_flags,
m_options.m_regex,
m_options.m_name,
m_options.m_category);
@@ -1211,14 +1170,14 @@ CommandObjectTypeSummaryAdd::Execute_StringSummary (Args& command, CommandReturn
return false;
}
- if (!m_options.m_one_liner && m_options.m_format_string.empty())
+ if (!m_options.m_flags.GetShowMembersOneLiner() && m_options.m_format_string.empty())
{
result.AppendError("empty summary strings not allowed");
result.SetStatus(eReturnStatusFailed);
return false;
}
- const char* format_cstr = (m_options.m_one_liner ? "" : m_options.m_format_string.c_str());
+ const char* format_cstr = (m_options.m_flags.GetShowMembersOneLiner() ? "" : m_options.m_format_string.c_str());
// ${var%S} is an endless recursion, prevent it
if (strcmp(format_cstr, "${var%S}") == 0)
@@ -1230,15 +1189,10 @@ CommandObjectTypeSummaryAdd::Execute_StringSummary (Args& command, CommandReturn
Error error;
- lldb::SummaryFormatSP entry(new StringSummaryFormat(m_options.m_cascade,
- m_options.m_skip_pointers,
- m_options.m_skip_references,
- m_options.m_no_children,
- m_options.m_no_value,
- m_options.m_one_liner,
- format_cstr));
+ lldb::SummaryFormatSP entry(new StringSummaryFormat(m_options.m_flags,
+ format_cstr));
- if (error.Fail())
+ if (error.Fail())
{
result.AppendError(error.AsCString());
result.SetStatus(eReturnStatusFailed);
@@ -1435,6 +1389,7 @@ CommandObjectTypeSummaryAdd::CommandOptions::g_option_table[] =
{ LLDB_OPT_SET_ALL, false, "skip-references", 'r', no_argument, NULL, 0, eArgTypeNone, "Don't use this format for references-to-type objects."},
{ LLDB_OPT_SET_ALL, false, "regex", 'x', no_argument, NULL, 0, eArgTypeNone, "Type names are actually regular expressions."},
{ LLDB_OPT_SET_1 , true, "inline-children", 'c', no_argument, NULL, 0, eArgTypeNone, "If true, inline all child values into summary string."},
+ { LLDB_OPT_SET_1 , false, "omit-names", 'O', no_argument, NULL, 0, eArgTypeNone, "If true, omit value names in the summary display."},
{ LLDB_OPT_SET_2 , true, "summary-string", 's', required_argument, NULL, 0, eArgTypeSummaryString, "Summary string used to display text and object contents."},
{ LLDB_OPT_SET_3, false, "python-script", 'o', required_argument, NULL, 0, eArgTypePythonScript, "Give a one-liner Python script as part of the command."},
{ LLDB_OPT_SET_3, false, "python-function", 'F', required_argument, NULL, 0, eArgTypePythonFunction, "Give the name of a Python function to use for this type."},
diff --git a/lldb/source/Core/FormatClasses.cpp b/lldb/source/Core/FormatClasses.cpp
index 30254d36994..07fcb4140c5 100644
--- a/lldb/source/Core/FormatClasses.cpp
+++ b/lldb/source/Core/FormatClasses.cpp
@@ -55,34 +55,14 @@ ValueFormat::ValueFormat (lldb::Format f,
{
}
-SummaryFormat::SummaryFormat(bool casc,
- bool skipptr,
- bool skipref,
- bool nochildren,
- bool novalue,
- bool oneliner) :
- m_cascades(casc),
- m_skip_pointers(skipptr),
- m_skip_references(skipref),
- m_dont_show_children(nochildren),
- m_dont_show_value(novalue),
- m_show_members_oneliner(oneliner)
+SummaryFormat::SummaryFormat(const SummaryFormat::Flags& flags) :
+ m_flags(flags)
{
}
-StringSummaryFormat::StringSummaryFormat(bool casc,
- bool skipptr,
- bool skipref,
- bool nochildren,
- bool novalue,
- bool oneliner,
+StringSummaryFormat::StringSummaryFormat(const SummaryFormat::Flags& flags,
std::string f) :
- SummaryFormat(casc,
- skipptr,
- skipref,
- nochildren,
- novalue,
- oneliner),
+ SummaryFormat(flags),
m_format(f)
{
}
@@ -102,7 +82,7 @@ StringSummaryFormat::FormatObject(lldb::ValueObjectSP object)
if (frame)
sc = frame->GetSymbolContext(lldb::eSymbolContextEverything);
- if (m_show_members_oneliner)
+ if (IsOneliner())
{
ValueObjectSP synth_valobj = object->GetSyntheticValue(lldb::eUseSyntheticFilter);
const uint32_t num_children = synth_valobj->GetNumChildren();
@@ -117,8 +97,11 @@ StringSummaryFormat::FormatObject(lldb::ValueObjectSP object)
{
if (idx)
s.PutCString(", ");
- s.PutCString(child_sp.get()->GetName().AsCString());
- s.PutChar('=');
+ if (!HideNames())
+ {
+ s.PutCString(child_sp.get()->GetName().AsCString());
+ s.PutChar('=');
+ }
child_sp.get()->GetPrintableRepresentation(s);
}
}
@@ -144,32 +127,24 @@ std::string
StringSummaryFormat::GetDescription()
{
StreamString sstr;
- sstr.Printf ("`%s`%s%s%s%s%s%s", m_format.c_str(),
- m_cascades ? "" : " (not cascading)",
- m_dont_show_children ? "" : " (show children)",
- m_dont_show_value ? " (hide value)" : "",
- m_show_members_oneliner ? " (one-line printout)" : "",
- m_skip_pointers ? " (skip pointers)" : "",
- m_skip_references ? " (skip references)" : "");
+
+ sstr.Printf ("`%s`%s%s%s%s%s%s%s", m_format.c_str(),
+ Cascades() ? "" : " (not cascading)",
+ !DoesPrintChildren() ? "" : " (show children)",
+ !DoesPrintValue() ? " (hide value)" : "",
+ IsOneliner() ? " (one-line printout)" : "",
+ SkipsPointers() ? " (skip pointers)" : "",
+ SkipsReferences() ? " (skip references)" : "",
+ HideNames() ? " (hide member names)" : "");
return sstr.GetString();
}
#ifndef LLDB_DISABLE_PYTHON
-ScriptSummaryFormat::ScriptSummaryFormat(bool casc,
- bool skipptr,
- bool skipref,
- bool nochildren,
- bool novalue,
- bool oneliner,
+ScriptSummaryFormat::ScriptSummaryFormat(const SummaryFormat::Flags& flags,
std::string fname,
std::string pscri) :
- SummaryFormat(casc,
- skipptr,
- skipref,
- nochildren,
- novalue,
- oneliner),
+ SummaryFormat(flags),
m_function_name(fname),
m_python_script(pscri)
{
@@ -187,12 +162,13 @@ std::string
ScriptSummaryFormat::GetDescription()
{
StreamString sstr;
- sstr.Printf ("%s%s%s%s%s%s\n%s", m_cascades ? "" : " (not cascading)",
- m_dont_show_children ? "" : " (show children)",
- m_dont_show_value ? " (hide value)" : "",
- m_show_members_oneliner ? " (one-line printout)" : "",
- m_skip_pointers ? " (skip pointers)" : "",
- m_skip_references ? " (skip references)" : "",
+ sstr.Printf ("%s%s%s%s%s%s%s\n%s", Cascades() ? "" : " (not cascading)",
+ !DoesPrintChildren() ? "" : " (show children)",
+ !DoesPrintValue() ? " (hide value)" : "",
+ IsOneliner() ? " (one-line printout)" : "",
+ SkipsPointers() ? " (skip pointers)" : "",
+ SkipsReferences() ? " (skip references)" : "",
+ HideNames() ? " (hide member names)" : "",
m_python_script.c_str());
return sstr.GetString();
diff --git a/lldb/source/Core/FormatManager.cpp b/lldb/source/Core/FormatManager.cpp
index 90762965d10..fb24f17d3ee 100644
--- a/lldb/source/Core/FormatManager.cpp
+++ b/lldb/source/Core/FormatManager.cpp
@@ -566,22 +566,24 @@ FormatManager::FormatManager() :
// add some default stuff
// most formats, summaries, ... actually belong to the users' lldbinit file rather than here
- lldb::SummaryFormatSP string_format(new StringSummaryFormat(false,
- true,
- false,
- true,
- false,
- false,
- "${var%s}"));
+ lldb::SummaryFormatSP string_format(new StringSummaryFormat(SummaryFormat::Flags().SetCascades(false)
+ .SetSkipPointers(true)
+ .SetSkipReferences(false)
+ .SetDontShowChildren(true)
+ .SetDontShowValue(false)
+ .SetShowMembersOneLiner(false)
+ .SetHideItemNames(false),
+ "${var%s}"));
- lldb::SummaryFormatSP string_array_format(new StringSummaryFormat(false,
- true,
- false,
- false,
- false,
- false,
- "${var%s}"));
+ lldb::SummaryFormatSP string_array_format(new StringSummaryFormat(SummaryFormat::Flags().SetCascades(false)
+ .SetSkipPointers(true)
+ .SetSkipReferences(false)
+ .SetDontShowChildren(false)
+ .SetDontShowValue(true)
+ .SetShowMembersOneLiner(false)
+ .SetHideItemNames(false),
+ "${var%s}"));
lldb::RegularExpressionSP any_size_char_arr(new RegularExpression("char \\[[0-9]+\\]"));
@@ -600,12 +602,13 @@ FormatManager::FormatManager() :
// the GNU libstdc++ are defined regardless, and enabled by default
// This is going to be moved to some platform-dependent location
// (in the meanwhile, these formatters should work for Mac OS X & Linux)
- lldb::SummaryFormatSP std_string_summary_sp(new StringSummaryFormat(true,
- false,
- false,
- true,
- true,
- false,
+ lldb::SummaryFormatSP std_string_summary_sp(new StringSummaryFormat(SummaryFormat::Flags().SetCascades(true)
+ .SetSkipPointers(false)
+ .SetSkipReferences(false)
+ .SetDontShowChildren(true)
+ .SetDontShowValue(true)
+ .SetShowMembersOneLiner(false)
+ .SetHideItemNames(false),
"${var._M_dataplus._M_p}"));
FormatCategory::SharedPointer gnu_category_sp = GetCategory(m_gnu_cpp_category_name);
@@ -616,6 +619,9 @@ FormatManager::FormatManager() :
std_string_summary_sp);
gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<char,std::char_traits<char>,std::allocator<char> >"),
std_string_summary_sp);
+ gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<char, class std::char_traits<char>, class std::allocator<char> >"),
+ std_string_summary_sp);
+
#ifndef LLDB_DISABLE_PYTHON
gnu_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^(std::)?vector<.+>$")),
@@ -634,12 +640,13 @@ FormatManager::FormatManager() :
false,
"gnu_libstdcpp.StdListSynthProvider")));
- lldb::SummaryFormatSP ObjC_BOOL_summary(new ScriptSummaryFormat(false,
- false,
- false,
- true,
- true,
- false,
+ lldb::SummaryFormatSP ObjC_BOOL_summary(new ScriptSummaryFormat(SummaryFormat::Flags().SetCascades(false)
+ .SetSkipPointers(false)
+ .SetSkipReferences(false)
+ .SetDontShowChildren(true)
+ .SetDontShowValue(true)
+ .SetShowMembersOneLiner(false)
+ .SetHideItemNames(false),
"objc.BOOL_SummaryProvider",
""));
FormatCategory::SharedPointer objc_category_sp = GetCategory(m_objc_category_name);
OpenPOWER on IntegriCloud