blob: c30a978d9577442b089b68a9f1a9890b2b3bd7ff [file] [log] [blame]
Greg Clayton84c39662011-04-27 22:04:39 +00001//===-- OptionGroupValueObjectDisplay.cpp -----------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Johnny Chen4bee32e2011-05-13 20:21:08 +000010#include "lldb/Interpreter/OptionGroupValueObjectDisplay.h"
Greg Clayton84c39662011-04-27 22:04:39 +000011
12// C Includes
13// C++ Includes
14// Other libraries and framework includes
15// Project includes
Enrico Granata4d93b8c2013-09-30 19:11:51 +000016#include "lldb/DataFormatters/ValueObjectPrinter.h"
Vince Harron5275aaa2015-01-15 20:08:35 +000017#include "lldb/Host/StringConvert.h"
Jim Ingham2837b762011-05-04 03:43:18 +000018#include "lldb/Target/Target.h"
19#include "lldb/Interpreter/CommandInterpreter.h"
Johnny Chen7c575b32011-09-10 00:48:33 +000020#include "lldb/Utility/Utils.h"
Greg Clayton84c39662011-04-27 22:04:39 +000021
22using namespace lldb;
23using namespace lldb_private;
24
25OptionGroupValueObjectDisplay::OptionGroupValueObjectDisplay()
26{
27}
28
29OptionGroupValueObjectDisplay::~OptionGroupValueObjectDisplay ()
30{
31}
32
Greg Clayton68ebae62011-04-28 20:55:26 +000033static OptionDefinition
Greg Clayton84c39662011-04-27 22:04:39 +000034g_option_table[] =
35{
Zachary Turnerd37221d2014-07-09 16:31:49 +000036 { LLDB_OPT_SET_1, false, "dynamic-type", 'd', OptionParser::eRequiredArgument, nullptr, g_dynamic_value_types, 0, eArgTypeNone, "Show the object as its full dynamic type, not its static type, if available."},
37 { LLDB_OPT_SET_1, false, "synthetic-type", 'S', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeBoolean, "Show the object obeying its synthetic provider, if available."},
38 { LLDB_OPT_SET_1, false, "depth", 'D', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeCount, "Set the max recurse depth when dumping aggregate types (default is infinity)."},
39 { LLDB_OPT_SET_1, false, "flat", 'F', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Display results in a flat format that uses expression paths for each variable or member."},
40 { LLDB_OPT_SET_1, false, "location", 'L', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Show variable location information."},
41 { LLDB_OPT_SET_1, false, "object-description", 'O', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Print as an Objective-C object."},
42 { LLDB_OPT_SET_1, false, "ptr-depth", 'P', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeCount, "The number of pointers to be traversed when dumping values (default is zero)."},
43 { LLDB_OPT_SET_1, false, "show-types", 'T', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Show variable types when dumping values."},
44 { LLDB_OPT_SET_1, false, "no-summary-depth", 'Y', OptionParser::eOptionalArgument, nullptr, nullptr, 0, eArgTypeCount, "Set the depth at which omitting summary information stops (default is 1)."},
45 { LLDB_OPT_SET_1, false, "raw-output", 'R', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Don't use formatting options."},
46 { LLDB_OPT_SET_1, false, "show-all-children", 'A', OptionParser::eNoArgument, nullptr, nullptr, 0, eArgTypeNone, "Ignore the upper bound on the number of children to show."},
Enrico Granata520a4222016-04-25 00:52:47 +000047 { LLDB_OPT_SET_1, false, "validate", 'V', OptionParser::eRequiredArgument, nullptr, nullptr,0, eArgTypeBoolean, "Show results of type validators."},
48 { LLDB_OPT_SET_1, false, "element-count", 'Z', OptionParser::eRequiredArgument, nullptr, nullptr, 0, eArgTypeCount, "Treat the result of the expression as if its type is an array of this many values."},
Zachary Turnerd37221d2014-07-09 16:31:49 +000049 { 0, false, nullptr, 0, 0, nullptr, nullptr, 0, eArgTypeNone, nullptr }
Greg Clayton84c39662011-04-27 22:04:39 +000050};
51
Greg Clayton84c39662011-04-27 22:04:39 +000052uint32_t
53OptionGroupValueObjectDisplay::GetNumDefinitions ()
54{
Johnny Chen6ebc8c452012-05-15 23:21:36 +000055 return llvm::array_lengthof(g_option_table);
Greg Clayton84c39662011-04-27 22:04:39 +000056}
57
58const OptionDefinition *
59OptionGroupValueObjectDisplay::GetDefinitions ()
60{
61 return g_option_table;
62}
63
64
65Error
66OptionGroupValueObjectDisplay::SetOptionValue (CommandInterpreter &interpreter,
67 uint32_t option_idx,
68 const char *option_arg)
69{
70 Error error;
Greg Clayton3bcdfc02012-12-04 00:32:51 +000071 const int short_option = g_option_table[option_idx].short_option;
Greg Clayton84c39662011-04-27 22:04:39 +000072 bool success = false;
73
74 switch (short_option)
75 {
Jim Ingham2837b762011-05-04 03:43:18 +000076 case 'd':
77 {
Jim Ingham2837b762011-05-04 03:43:18 +000078 int32_t result;
Greg Clayton67cc0632012-08-22 17:17:09 +000079 result = Args::StringToOptionEnum (option_arg, g_dynamic_value_types, 2, error);
Greg Claytoncf0e4f02011-10-07 18:58:12 +000080 if (error.Success())
Jim Ingham2837b762011-05-04 03:43:18 +000081 use_dynamic = (lldb::DynamicValueType) result;
82 }
83 break;
Greg Clayton68ebae62011-04-28 20:55:26 +000084 case 'T': show_types = true; break;
Greg Clayton84c39662011-04-27 22:04:39 +000085 case 'L': show_location= true; break;
86 case 'F': flat_output = true; break;
Enrico Granatace68b022011-08-09 23:50:01 +000087 case 'O': use_objc = true; break;
88 case 'R': be_raw = true; break;
Enrico Granata22c55d12011-08-12 02:00:06 +000089 case 'A': ignore_cap = true; break;
Enrico Granatace68b022011-08-09 23:50:01 +000090
Greg Clayton68ebae62011-04-28 20:55:26 +000091 case 'D':
Vince Harron5275aaa2015-01-15 20:08:35 +000092 max_depth = StringConvert::ToUInt32 (option_arg, UINT32_MAX, 0, &success);
Greg Clayton84c39662011-04-27 22:04:39 +000093 if (!success)
Greg Clayton86edbf42011-10-26 00:56:27 +000094 error.SetErrorStringWithFormat("invalid max depth '%s'", option_arg);
Greg Clayton84c39662011-04-27 22:04:39 +000095 break;
Enrico Granata520a4222016-04-25 00:52:47 +000096
97 case 'Z':
98 elem_count = StringConvert::ToUInt32 (option_arg, UINT32_MAX, 0, &success);
99 if (!success)
100 error.SetErrorStringWithFormat("invalid element count '%s'", option_arg);
101 break;
Greg Clayton84c39662011-04-27 22:04:39 +0000102
Greg Clayton68ebae62011-04-28 20:55:26 +0000103 case 'P':
Vince Harron5275aaa2015-01-15 20:08:35 +0000104 ptr_depth = StringConvert::ToUInt32 (option_arg, 0, 0, &success);
Greg Clayton84c39662011-04-27 22:04:39 +0000105 if (!success)
Greg Clayton86edbf42011-10-26 00:56:27 +0000106 error.SetErrorStringWithFormat("invalid pointer depth '%s'", option_arg);
Greg Clayton84c39662011-04-27 22:04:39 +0000107 break;
108
Enrico Granata0c5ef692011-07-16 01:22:04 +0000109 case 'Y':
110 if (option_arg)
111 {
Vince Harron5275aaa2015-01-15 20:08:35 +0000112 no_summary_depth = StringConvert::ToUInt32 (option_arg, 0, 0, &success);
Enrico Granata0c5ef692011-07-16 01:22:04 +0000113 if (!success)
Greg Clayton86edbf42011-10-26 00:56:27 +0000114 error.SetErrorStringWithFormat("invalid pointer depth '%s'", option_arg);
Enrico Granata0c5ef692011-07-16 01:22:04 +0000115 }
116 else
117 no_summary_depth = 1;
118 break;
Enrico Granatad55546b2011-07-22 00:16:08 +0000119
120 case 'S':
121 use_synth = Args::StringToBoolean(option_arg, true, &success);
122 if (!success)
Greg Clayton86edbf42011-10-26 00:56:27 +0000123 error.SetErrorStringWithFormat("invalid synthetic-type '%s'", option_arg);
Enrico Granatad55546b2011-07-22 00:16:08 +0000124 break;
Enrico Granata0f883ff2014-09-06 02:20:19 +0000125
126 case 'V':
127 run_validator = Args::StringToBoolean(option_arg, true, &success);
128 if (!success)
129 error.SetErrorStringWithFormat("invalid validate '%s'", option_arg);
130 break;
131
Greg Clayton84c39662011-04-27 22:04:39 +0000132 default:
Greg Clayton86edbf42011-10-26 00:56:27 +0000133 error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
Greg Clayton84c39662011-04-27 22:04:39 +0000134 break;
135 }
136
137 return error;
138}
139
140void
141OptionGroupValueObjectDisplay::OptionParsingStarting (CommandInterpreter &interpreter)
142{
Greg Clayton82f4cf42011-10-26 04:32:38 +0000143 // If these defaults change, be sure to modify AnyOptionWasSet().
Enrico Granata0c5ef692011-07-16 01:22:04 +0000144 show_types = false;
145 no_summary_depth = 0;
146 show_location = false;
147 flat_output = false;
148 use_objc = false;
149 max_depth = UINT32_MAX;
150 ptr_depth = 0;
Enrico Granata520a4222016-04-25 00:52:47 +0000151 elem_count = 0;
Enrico Granatad55546b2011-07-22 00:16:08 +0000152 use_synth = true;
Enrico Granatace68b022011-08-09 23:50:01 +0000153 be_raw = false;
Enrico Granata22c55d12011-08-12 02:00:06 +0000154 ignore_cap = false;
Enrico Granata0f883ff2014-09-06 02:20:19 +0000155 run_validator = false;
Jim Ingham2837b762011-05-04 03:43:18 +0000156
Greg Claytonc14ee322011-09-22 04:58:26 +0000157 Target *target = interpreter.GetExecutionContext().GetTargetPtr();
Ed Masted78c9572014-04-20 00:31:37 +0000158 if (target != nullptr)
Jim Ingham2837b762011-05-04 03:43:18 +0000159 use_dynamic = target->GetPreferDynamicValue();
160 else
161 {
162 // If we don't have any targets, then dynamic values won't do us much good.
163 use_dynamic = lldb::eNoDynamicValues;
164 }
Johnny Chen4bee32e2011-05-13 20:21:08 +0000165}
Enrico Granata9fb5ab52013-03-26 18:04:53 +0000166
Enrico Granata4d93b8c2013-09-30 19:11:51 +0000167DumpValueObjectOptions
168OptionGroupValueObjectDisplay::GetAsDumpOptions (LanguageRuntimeDescriptionDisplayVerbosity lang_descr_verbosity,
Enrico Granata9fb5ab52013-03-26 18:04:53 +0000169 lldb::Format format,
170 lldb::TypeSummaryImplSP summary_sp)
171{
Enrico Granata4d93b8c2013-09-30 19:11:51 +0000172 DumpValueObjectOptions options;
Enrico Granatac1b7c092015-07-27 18:34:14 +0000173 options.SetMaximumPointerDepth( {DumpValueObjectOptions::PointerDepth::Mode::Always,ptr_depth} );
Enrico Granata9fb5ab52013-03-26 18:04:53 +0000174 if (use_objc)
175 options.SetShowSummary(false);
176 else
177 options.SetOmitSummaryDepth(no_summary_depth);
178 options.SetMaximumDepth(max_depth)
179 .SetShowTypes(show_types)
180 .SetShowLocation(show_location)
181 .SetUseObjectiveC(use_objc)
182 .SetUseDynamicType(use_dynamic)
183 .SetUseSyntheticValue(use_synth)
184 .SetFlatOutput(flat_output)
185 .SetIgnoreCap(ignore_cap)
186 .SetFormat(format)
187 .SetSummary(summary_sp);
188
Enrico Granata4d93b8c2013-09-30 19:11:51 +0000189 if (lang_descr_verbosity == eLanguageRuntimeDescriptionDisplayVerbosityCompact)
Enrico Granata9fb5ab52013-03-26 18:04:53 +0000190 options.SetHideRootType(use_objc)
191 .SetHideName(use_objc)
192 .SetHideValue(use_objc);
193
194 if (be_raw)
Enrico Granataa126e462014-11-21 18:47:26 +0000195 options.SetRawDisplay();
Enrico Granata0f883ff2014-09-06 02:20:19 +0000196
197 options.SetRunValidator(run_validator);
Enrico Granata520a4222016-04-25 00:52:47 +0000198
199 options.SetElementCount(elem_count);
Enrico Granata9fb5ab52013-03-26 18:04:53 +0000200
201 return options;
202}