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