180814287SRaphael Isemann //===-- OptionGroupVariable.cpp -------------------------------------------===//
2715c2365SGreg Clayton //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6715c2365SGreg Clayton //
7715c2365SGreg Clayton //===----------------------------------------------------------------------===//
8715c2365SGreg Clayton 
9715c2365SGreg Clayton #include "lldb/Interpreter/OptionGroupVariable.h"
10715c2365SGreg Clayton 
115548cb50SEnrico Granata #include "lldb/DataFormatters/DataVisualization.h"
123eb2b44dSZachary Turner #include "lldb/Host/OptionParser.h"
13715c2365SGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h"
145548cb50SEnrico Granata #include "lldb/Target/Target.h"
1597206d57SZachary Turner #include "lldb/Utility/Status.h"
16715c2365SGreg Clayton 
17715c2365SGreg Clayton using namespace lldb;
18715c2365SGreg Clayton using namespace lldb_private;
19715c2365SGreg Clayton 
20b9c1b51eSKate Stone // if you add any options here, remember to update the counters in
21b9c1b51eSKate Stone // OptionGroupVariable::GetNumDefinitions()
228fe53c49STatyana Krasnukha static constexpr OptionDefinition g_variable_options[] = {
23b9c1b51eSKate Stone     {LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "no-args", 'a',
248fe53c49STatyana Krasnukha      OptionParser::eNoArgument, nullptr, {}, 0, eArgTypeNone,
25b9c1b51eSKate Stone      "Omit function arguments."},
2641ae8e74SKuba Mracek     {LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "no-recognized-args", 't',
2741ae8e74SKuba Mracek      OptionParser::eNoArgument, nullptr, {}, 0, eArgTypeNone,
2841ae8e74SKuba Mracek      "Omit recognized function arguments."},
29b9c1b51eSKate Stone     {LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "no-locals", 'l',
308fe53c49STatyana Krasnukha      OptionParser::eNoArgument, nullptr, {}, 0, eArgTypeNone,
31b9c1b51eSKate Stone      "Omit local variables."},
32b9c1b51eSKate Stone     {LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "show-globals", 'g',
338fe53c49STatyana Krasnukha      OptionParser::eNoArgument, nullptr, {}, 0, eArgTypeNone,
34b9c1b51eSKate Stone      "Show the current frame source file global and static variables."},
35b9c1b51eSKate Stone     {LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "show-declaration", 'c',
368fe53c49STatyana Krasnukha      OptionParser::eNoArgument, nullptr, {}, 0, eArgTypeNone,
37b9c1b51eSKate Stone      "Show variable declaration information (source file and line where the "
38b9c1b51eSKate Stone      "variable was declared)."},
39b9c1b51eSKate Stone     {LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "regex", 'r',
408fe53c49STatyana Krasnukha      OptionParser::eNoArgument, nullptr, {}, 0, eArgTypeRegularExpression,
41b9c1b51eSKate Stone      "The <variable-name> argument for name lookups are regular expressions."},
42b9c1b51eSKate Stone     {LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "scope", 's',
438fe53c49STatyana Krasnukha      OptionParser::eNoArgument, nullptr, {}, 0, eArgTypeNone,
44b9c1b51eSKate Stone      "Show variable scope (argument, local, global, static)."},
45b9c1b51eSKate Stone     {LLDB_OPT_SET_1, false, "summary", 'y', OptionParser::eRequiredArgument,
468fe53c49STatyana Krasnukha      nullptr, {}, 0, eArgTypeName,
47b9c1b51eSKate Stone      "Specify the summary that the variable output should use."},
48b9c1b51eSKate Stone     {LLDB_OPT_SET_2, false, "summary-string", 'z',
498fe53c49STatyana Krasnukha      OptionParser::eRequiredArgument, nullptr, {}, 0, eArgTypeName,
50b9c1b51eSKate Stone      "Specify a summary string to use to format the variable output."},
51715c2365SGreg Clayton };
52715c2365SGreg Clayton 
ValidateNamedSummary(const char * str,void *)5397206d57SZachary Turner static Status ValidateNamedSummary(const char *str, void *) {
549d14084bSEnrico Granata   if (!str || !str[0])
5597206d57SZachary Turner     return Status("must specify a valid named summary");
569d14084bSEnrico Granata   TypeSummaryImplSP summary_sp;
57a6682a41SJonas Devlieghere   if (!DataVisualization::NamedSummaryFormats::GetSummaryFormat(
58a6682a41SJonas Devlieghere           ConstString(str), summary_sp))
5997206d57SZachary Turner     return Status("must specify a valid named summary");
6097206d57SZachary Turner   return Status();
61ef6b06d7SEnrico Granata }
62ef6b06d7SEnrico Granata 
ValidateSummaryString(const char * str,void *)6397206d57SZachary Turner static Status ValidateSummaryString(const char *str, void *) {
649d14084bSEnrico Granata   if (!str || !str[0])
6597206d57SZachary Turner     return Status("must specify a non-empty summary string");
6697206d57SZachary Turner   return Status();
67ef6b06d7SEnrico Granata }
68ef6b06d7SEnrico Granata 
OptionGroupVariable(bool show_frame_options)69b9c1b51eSKate Stone OptionGroupVariable::OptionGroupVariable(bool show_frame_options)
70*8cdcd41eSTatyana Krasnukha     : include_frame_options(show_frame_options), summary(ValidateNamedSummary),
71*8cdcd41eSTatyana Krasnukha       summary_string(ValidateSummaryString) {}
72715c2365SGreg Clayton 
7397206d57SZachary Turner Status
SetOptionValue(uint32_t option_idx,llvm::StringRef option_arg,ExecutionContext * execution_context)7497206d57SZachary Turner OptionGroupVariable::SetOptionValue(uint32_t option_idx,
758cef4b0bSZachary Turner                                     llvm::StringRef option_arg,
76b9c1b51eSKate Stone                                     ExecutionContext *execution_context) {
7797206d57SZachary Turner   Status error;
78715c2365SGreg Clayton   if (!include_frame_options)
79715c2365SGreg Clayton     option_idx += 3;
801f0f5b5bSZachary Turner   const int short_option = g_variable_options[option_idx].short_option;
81b9c1b51eSKate Stone   switch (short_option) {
82b9c1b51eSKate Stone   case 'r':
83b9c1b51eSKate Stone     use_regex = true;
84b9c1b51eSKate Stone     break;
85b9c1b51eSKate Stone   case 'a':
86b9c1b51eSKate Stone     show_args = false;
87b9c1b51eSKate Stone     break;
88b9c1b51eSKate Stone   case 'l':
89b9c1b51eSKate Stone     show_locals = false;
90b9c1b51eSKate Stone     break;
91b9c1b51eSKate Stone   case 'g':
92b9c1b51eSKate Stone     show_globals = true;
93b9c1b51eSKate Stone     break;
94b9c1b51eSKate Stone   case 'c':
95b9c1b51eSKate Stone     show_decl = true;
96b9c1b51eSKate Stone     break;
97715c2365SGreg Clayton   case 's':
98715c2365SGreg Clayton     show_scope = true;
99715c2365SGreg Clayton     break;
10041ae8e74SKuba Mracek   case 't':
10141ae8e74SKuba Mracek     show_recognized_args = false;
10241ae8e74SKuba Mracek     break;
103f9fa6ee5SEnrico Granata   case 'y':
1049d14084bSEnrico Granata     error = summary.SetCurrentValue(option_arg);
10517b11749SEnrico Granata     break;
10617b11749SEnrico Granata   case 'z':
1079d14084bSEnrico Granata     error = summary_string.SetCurrentValue(option_arg);
108f9fa6ee5SEnrico Granata     break;
109715c2365SGreg Clayton   default:
11036162014SRaphael Isemann     llvm_unreachable("Unimplemented option");
111715c2365SGreg Clayton   }
112715c2365SGreg Clayton 
113715c2365SGreg Clayton   return error;
114715c2365SGreg Clayton }
115715c2365SGreg Clayton 
OptionParsingStarting(ExecutionContext * execution_context)116b9c1b51eSKate Stone void OptionGroupVariable::OptionParsingStarting(
117b9c1b51eSKate Stone     ExecutionContext *execution_context) {
118715c2365SGreg Clayton   show_args = true;     // Frame option only
11941ae8e74SKuba Mracek   show_recognized_args = true; // Frame option only
120715c2365SGreg Clayton   show_locals = true;   // Frame option only
121715c2365SGreg Clayton   show_globals = false; // Frame option only
122715c2365SGreg Clayton   show_decl = false;
123715c2365SGreg Clayton   use_regex = false;
124715c2365SGreg Clayton   show_scope = false;
12517b11749SEnrico Granata   summary.Clear();
12617b11749SEnrico Granata   summary_string.Clear();
127715c2365SGreg Clayton }
128715c2365SGreg Clayton 
1290a57b238SJohnny Chen #define NUM_FRAME_OPTS 3
130715c2365SGreg Clayton 
GetDefinitions()1311f0f5b5bSZachary Turner llvm::ArrayRef<OptionDefinition> OptionGroupVariable::GetDefinitions() {
13270602439SZachary Turner   auto result = llvm::makeArrayRef(g_variable_options);
13305097246SAdrian Prantl   // Show the "--no-args", "--no-locals" and "--show-globals" options if we are
13405097246SAdrian Prantl   // showing frame specific options
135715c2365SGreg Clayton   if (include_frame_options)
1361f0f5b5bSZachary Turner     return result;
137715c2365SGreg Clayton 
13805097246SAdrian Prantl   // Skip the "--no-args", "--no-locals" and "--show-globals" options if we are
13905097246SAdrian Prantl   // not showing frame specific options (globals only)
1401f0f5b5bSZachary Turner   return result.drop_front(NUM_FRAME_OPTS);
141715c2365SGreg Clayton }
142