157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton//===-- OptionGroupValueObjectDisplay.cpp -----------------------*- C++ -*-===//
257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton//
357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton//                     The LLVM Compiler Infrastructure
457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton//
557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton// This file is distributed under the University of Illinois Open Source
657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton// License. See LICENSE.TXT for details.
757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton//
857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton//===----------------------------------------------------------------------===//
957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
12a0f34698c457091c0d15b8fdfbf638421b1283d4Johnny Chen#include "lldb/Interpreter/OptionGroupValueObjectDisplay.h"
1357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
1457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton// C Includes
1557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton// C++ Includes
1657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton// Other libraries and framework includes
1757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton// Project includes
1810de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham#include "lldb/Target/Target.h"
1910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham#include "lldb/Interpreter/CommandInterpreter.h"
204003f57f86a92411f0563f355a32e8f86ae29d5aJohnny Chen#include "lldb/Utility/Utils.h"
2157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
2257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Claytonusing namespace lldb;
2357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Claytonusing namespace lldb_private;
2457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
2557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg ClaytonOptionGroupValueObjectDisplay::OptionGroupValueObjectDisplay()
2657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton{
2757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton}
2857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
2957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg ClaytonOptionGroupValueObjectDisplay::~OptionGroupValueObjectDisplay ()
3057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton{
3157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton}
3257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
3356bbdaf817cb19a2f133e8501473f499be447c2dGreg Claytonstatic OptionDefinition
3457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Claytong_option_table[] =
3557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton{
36992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata    { LLDB_OPT_SET_1, false, "dynamic-type",       'd', required_argument, g_dynamic_value_types, 0, eArgTypeNone,      "Show the object as its full dynamic type, not its static type, if available."},
37992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata    { LLDB_OPT_SET_1, false, "synthetic-type",     'S', required_argument, NULL, 0, eArgTypeBoolean,   "Show the object obeying its synthetic provider, if available."},
38992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata    { LLDB_OPT_SET_1, false, "depth",              'D', required_argument, NULL, 0, eArgTypeCount,     "Set the max recurse depth when dumping aggregate types (default is infinity)."},
39992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata    { LLDB_OPT_SET_1, false, "flat",               'F', no_argument,       NULL, 0, eArgTypeNone,      "Display results in a flat format that uses expression paths for each variable or member."},
40992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata    { LLDB_OPT_SET_1, false, "location",           'L', no_argument,       NULL, 0, eArgTypeNone,      "Show variable location information."},
41992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata    { LLDB_OPT_SET_1, false, "object-description", 'O', no_argument,       NULL, 0, eArgTypeNone,      "Print as an Objective-C object."},
42992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata    { LLDB_OPT_SET_1, false, "ptr-depth",          'P', required_argument, NULL, 0, eArgTypeCount,     "The number of pointers to be traversed when dumping values (default is zero)."},
43992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata    { LLDB_OPT_SET_1, false, "show-types",         'T', no_argument,       NULL, 0, eArgTypeNone,      "Show variable types when dumping values."},
44992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata    { LLDB_OPT_SET_1, false, "no-summary-depth",   'Y', optional_argument, NULL, 0, eArgTypeCount,     "Set the depth at which omitting summary information stops (default is 1)."},
45992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata    { LLDB_OPT_SET_1, false, "raw-output",         'R', no_argument,       NULL, 0, eArgTypeNone,      "Don't use formatting options."},
46992d227ab9ef1a8ffabc138fd515fb667556ae10Enrico Granata    { LLDB_OPT_SET_1, false, "show-all-children",  'A', no_argument,       NULL, 0, eArgTypeNone,      "Ignore the upper bound on the number of children to show."},
475ebd51f464587ba848698fdf48429adc8bad9068Filipe Cabecinhas    { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
4857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton};
4957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
5057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Claytonuint32_t
5157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg ClaytonOptionGroupValueObjectDisplay::GetNumDefinitions ()
5257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton{
5308af5983cb349e7167f3832d00d36ca611bfa2f1Johnny Chen    return llvm::array_lengthof(g_option_table);
5457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton}
5557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
5657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Claytonconst OptionDefinition *
5757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg ClaytonOptionGroupValueObjectDisplay::GetDefinitions ()
5857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton{
5957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    return g_option_table;
6057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton}
6157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
6257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
6357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg ClaytonError
6457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg ClaytonOptionGroupValueObjectDisplay::SetOptionValue (CommandInterpreter &interpreter,
6557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton                                               uint32_t option_idx,
6657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton                                               const char *option_arg)
6757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton{
6857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    Error error;
696475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton    const int short_option = g_option_table[option_idx].short_option;
7057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    bool success = false;
7157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
7257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    switch (short_option)
7357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    {
7410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        case 'd':
7510de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            {
7610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham                int32_t result;
7773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                result = Args::StringToOptionEnum (option_arg, g_dynamic_value_types, 2, error);
7861aca5dd78f07de66e997d41af521ab9d8c16b89Greg Clayton                if (error.Success())
7910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham                    use_dynamic = (lldb::DynamicValueType) result;
8010de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            }
8110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham            break;
8256bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton        case 'T':   show_types   = true;  break;
8357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        case 'L':   show_location= true;  break;
8457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        case 'F':   flat_output  = true;  break;
85840eb267769b943926bb9fcb527ab91221cf7a07Enrico Granata        case 'O':   use_objc     = true;  break;
86840eb267769b943926bb9fcb527ab91221cf7a07Enrico Granata        case 'R':   be_raw       = true;  break;
87018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata        case 'A':   ignore_cap   = true;  break;
88840eb267769b943926bb9fcb527ab91221cf7a07Enrico Granata
8956bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton        case 'D':
9057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton            max_depth = Args::StringToUInt32 (option_arg, UINT32_MAX, 0, &success);
9157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton            if (!success)
929c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat("invalid max depth '%s'", option_arg);
9357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton            break;
9457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
9556bbdaf817cb19a2f133e8501473f499be447c2dGreg Clayton        case 'P':
9657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton            ptr_depth = Args::StringToUInt32 (option_arg, 0, 0, &success);
9757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton            if (!success)
989c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat("invalid pointer depth '%s'", option_arg);
9957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton            break;
10057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
1017f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata        case 'Y':
1027f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            if (option_arg)
1037f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            {
1047f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                no_summary_depth = Args::StringToUInt32 (option_arg, 0, 0, &success);
1057f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                if (!success)
1069c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                    error.SetErrorStringWithFormat("invalid pointer depth '%s'", option_arg);
1077f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            }
1087f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            else
1097f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata                no_summary_depth = 1;
1107f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata            break;
111e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata
112e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata        case 'S':
113e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            use_synth = Args::StringToBoolean(option_arg, true, &success);
114e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            if (!success)
1159c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                error.SetErrorStringWithFormat("invalid synthetic-type '%s'", option_arg);
116e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata            break;
11757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        default:
1189c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton            error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
11957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton            break;
12057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    }
12157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
12257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton    return error;
12357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton}
12457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
12557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Claytonvoid
12657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg ClaytonOptionGroupValueObjectDisplay::OptionParsingStarting (CommandInterpreter &interpreter)
12757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton{
128902b5beee960a8861867f06588c12ac6eb55eb9dGreg Clayton    // If these defaults change, be sure to modify AnyOptionWasSet().
1297f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    show_types        = false;
1307f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    no_summary_depth  = 0;
1317f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    show_location     = false;
1327f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    flat_output       = false;
1337f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    use_objc          = false;
1347f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    max_depth         = UINT32_MAX;
1357f163b363aeccffeec8eda23bd31e4965abc7226Enrico Granata    ptr_depth         = 0;
136e4e3e2c0448bb0c77f8f8a3bbb47b951a481d3d8Enrico Granata    use_synth         = true;
137840eb267769b943926bb9fcb527ab91221cf7a07Enrico Granata    be_raw            = false;
138018921dd162d818e71cf1ac86d03422e88f0a674Enrico Granata    ignore_cap        = false;
13910de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham
140567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    Target *target = interpreter.GetExecutionContext().GetTargetPtr();
14110de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    if (target != NULL)
14210de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        use_dynamic = target->GetPreferDynamicValue();
14310de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    else
14410de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    {
14510de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        // If we don't have any targets, then dynamic values won't do us much good.
14610de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham        use_dynamic = lldb::eNoDynamicValues;
14710de7d1db3ec782ea2ccda1f39c0a40b9c301594Jim Ingham    }
148a0f34698c457091c0d15b8fdfbf638421b1283d4Johnny Chen}
149c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata
150c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico GranataValueObject::DumpValueObjectOptions
151c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico GranataOptionGroupValueObjectDisplay::GetAsDumpOptions (bool objc_is_compact,
152c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata                                                 lldb::Format format,
153c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata                                                 lldb::TypeSummaryImplSP summary_sp)
154c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata{
155c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    ValueObject::DumpValueObjectOptions options;
156c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    options.SetMaximumPointerDepth(ptr_depth);
157c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    if (use_objc)
158c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata        options.SetShowSummary(false);
159c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    else
160c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata        options.SetOmitSummaryDepth(no_summary_depth);
161c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    options.SetMaximumDepth(max_depth)
162c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    .SetShowTypes(show_types)
163c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    .SetShowLocation(show_location)
164c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    .SetUseObjectiveC(use_objc)
165c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    .SetUseDynamicType(use_dynamic)
166c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    .SetUseSyntheticValue(use_synth)
167c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    .SetFlatOutput(flat_output)
168c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    .SetIgnoreCap(ignore_cap)
169c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    .SetFormat(format)
170c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    .SetSummary(summary_sp);
171c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata
172c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    if (objc_is_compact)
173c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata        options.SetHideRootType(use_objc)
174c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata        .SetHideName(use_objc)
175c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata        .SetHideValue(use_objc);
176c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata
177c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    if (be_raw)
178c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata        options.SetRawDisplay(true);
179c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata
180c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata    return options;
181c3f5cd817ad045cab3a79f37ab5e65f8a659b7abEnrico Granata}
182