1cfca06d7SDimitry Andric //===-- CommandObjectStats.cpp --------------------------------------------===//
2f73363f1SDimitry Andric //
35f29bb8aSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45f29bb8aSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55f29bb8aSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f73363f1SDimitry Andric //
7f73363f1SDimitry Andric //===----------------------------------------------------------------------===//
8f73363f1SDimitry Andric
9f73363f1SDimitry Andric #include "CommandObjectStats.h"
10c0981da4SDimitry Andric #include "lldb/Core/Debugger.h"
11c0981da4SDimitry Andric #include "lldb/Host/OptionParser.h"
124b4fe385SDimitry Andric #include "lldb/Interpreter/CommandOptionArgumentTable.h"
13f73363f1SDimitry Andric #include "lldb/Interpreter/CommandReturnObject.h"
14ac9a064cSDimitry Andric #include "lldb/Interpreter/OptionArgParser.h"
15f73363f1SDimitry Andric #include "lldb/Target/Target.h"
16f73363f1SDimitry Andric
17f73363f1SDimitry Andric using namespace lldb;
18f73363f1SDimitry Andric using namespace lldb_private;
19f73363f1SDimitry Andric
20f73363f1SDimitry Andric class CommandObjectStatsEnable : public CommandObjectParsed {
21f73363f1SDimitry Andric public:
CommandObjectStatsEnable(CommandInterpreter & interpreter)22f73363f1SDimitry Andric CommandObjectStatsEnable(CommandInterpreter &interpreter)
23f73363f1SDimitry Andric : CommandObjectParsed(interpreter, "enable",
24f73363f1SDimitry Andric "Enable statistics collection", nullptr,
25f73363f1SDimitry Andric eCommandProcessMustBePaused) {}
26f73363f1SDimitry Andric
27f73363f1SDimitry Andric ~CommandObjectStatsEnable() override = default;
28f73363f1SDimitry Andric
29f73363f1SDimitry Andric protected:
DoExecute(Args & command,CommandReturnObject & result)30b1c73532SDimitry Andric void DoExecute(Args &command, CommandReturnObject &result) override {
31c0981da4SDimitry Andric if (DebuggerStats::GetCollectingStats()) {
32f73363f1SDimitry Andric result.AppendError("statistics already enabled");
33b1c73532SDimitry Andric return;
34f73363f1SDimitry Andric }
35f73363f1SDimitry Andric
36c0981da4SDimitry Andric DebuggerStats::SetCollectingStats(true);
37f73363f1SDimitry Andric result.SetStatus(eReturnStatusSuccessFinishResult);
38f73363f1SDimitry Andric }
39f73363f1SDimitry Andric };
40f73363f1SDimitry Andric
41f73363f1SDimitry Andric class CommandObjectStatsDisable : public CommandObjectParsed {
42f73363f1SDimitry Andric public:
CommandObjectStatsDisable(CommandInterpreter & interpreter)43f73363f1SDimitry Andric CommandObjectStatsDisable(CommandInterpreter &interpreter)
44f73363f1SDimitry Andric : CommandObjectParsed(interpreter, "disable",
45f73363f1SDimitry Andric "Disable statistics collection", nullptr,
46f73363f1SDimitry Andric eCommandProcessMustBePaused) {}
47f73363f1SDimitry Andric
48f73363f1SDimitry Andric ~CommandObjectStatsDisable() override = default;
49f73363f1SDimitry Andric
50f73363f1SDimitry Andric protected:
DoExecute(Args & command,CommandReturnObject & result)51b1c73532SDimitry Andric void DoExecute(Args &command, CommandReturnObject &result) override {
52c0981da4SDimitry Andric if (!DebuggerStats::GetCollectingStats()) {
53f73363f1SDimitry Andric result.AppendError("need to enable statistics before disabling them");
54b1c73532SDimitry Andric return;
55f73363f1SDimitry Andric }
56f73363f1SDimitry Andric
57c0981da4SDimitry Andric DebuggerStats::SetCollectingStats(false);
58f73363f1SDimitry Andric result.SetStatus(eReturnStatusSuccessFinishResult);
59f73363f1SDimitry Andric }
60f73363f1SDimitry Andric };
61f73363f1SDimitry Andric
62c0981da4SDimitry Andric #define LLDB_OPTIONS_statistics_dump
63c0981da4SDimitry Andric #include "CommandOptions.inc"
64c0981da4SDimitry Andric
65f73363f1SDimitry Andric class CommandObjectStatsDump : public CommandObjectParsed {
66c0981da4SDimitry Andric class CommandOptions : public Options {
67c0981da4SDimitry Andric public:
CommandOptions()686f8fc217SDimitry Andric CommandOptions() { OptionParsingStarting(nullptr); }
69c0981da4SDimitry Andric
SetOptionValue(uint32_t option_idx,llvm::StringRef option_arg,ExecutionContext * execution_context)70c0981da4SDimitry Andric Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,
71c0981da4SDimitry Andric ExecutionContext *execution_context) override {
72c0981da4SDimitry Andric Status error;
73c0981da4SDimitry Andric const int short_option = m_getopt_table[option_idx].val;
74c0981da4SDimitry Andric
75c0981da4SDimitry Andric switch (short_option) {
76c0981da4SDimitry Andric case 'a':
77c0981da4SDimitry Andric m_all_targets = true;
78c0981da4SDimitry Andric break;
79ac9a064cSDimitry Andric case 's':
80ac9a064cSDimitry Andric m_stats_options.SetSummaryOnly(true);
81ac9a064cSDimitry Andric break;
82ac9a064cSDimitry Andric case 'f':
83ac9a064cSDimitry Andric m_stats_options.SetLoadAllDebugInfo(true);
84ac9a064cSDimitry Andric break;
85ac9a064cSDimitry Andric case 'r':
86ac9a064cSDimitry Andric if (llvm::Expected<bool> bool_or_error =
87ac9a064cSDimitry Andric OptionArgParser::ToBoolean("--targets", option_arg))
88ac9a064cSDimitry Andric m_stats_options.SetIncludeTargets(*bool_or_error);
89ac9a064cSDimitry Andric else
90ac9a064cSDimitry Andric error = bool_or_error.takeError();
91ac9a064cSDimitry Andric break;
92ac9a064cSDimitry Andric case 'm':
93ac9a064cSDimitry Andric if (llvm::Expected<bool> bool_or_error =
94ac9a064cSDimitry Andric OptionArgParser::ToBoolean("--modules", option_arg))
95ac9a064cSDimitry Andric m_stats_options.SetIncludeModules(*bool_or_error);
96ac9a064cSDimitry Andric else
97ac9a064cSDimitry Andric error = bool_or_error.takeError();
98ac9a064cSDimitry Andric break;
99ac9a064cSDimitry Andric case 't':
100ac9a064cSDimitry Andric if (llvm::Expected<bool> bool_or_error =
101ac9a064cSDimitry Andric OptionArgParser::ToBoolean("--transcript", option_arg))
102ac9a064cSDimitry Andric m_stats_options.SetIncludeTranscript(*bool_or_error);
103ac9a064cSDimitry Andric else
104ac9a064cSDimitry Andric error = bool_or_error.takeError();
105ac9a064cSDimitry Andric break;
106c0981da4SDimitry Andric default:
107c0981da4SDimitry Andric llvm_unreachable("Unimplemented option");
108c0981da4SDimitry Andric }
109c0981da4SDimitry Andric return error;
110c0981da4SDimitry Andric }
111c0981da4SDimitry Andric
OptionParsingStarting(ExecutionContext * execution_context)112c0981da4SDimitry Andric void OptionParsingStarting(ExecutionContext *execution_context) override {
113c0981da4SDimitry Andric m_all_targets = false;
114ac9a064cSDimitry Andric m_stats_options = StatisticsOptions();
115c0981da4SDimitry Andric }
116c0981da4SDimitry Andric
GetDefinitions()117c0981da4SDimitry Andric llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
118e3b55780SDimitry Andric return llvm::ArrayRef(g_statistics_dump_options);
119c0981da4SDimitry Andric }
120c0981da4SDimitry Andric
GetStatisticsOptions()121ac9a064cSDimitry Andric const StatisticsOptions &GetStatisticsOptions() { return m_stats_options; }
122ac9a064cSDimitry Andric
123c0981da4SDimitry Andric bool m_all_targets = false;
124ac9a064cSDimitry Andric StatisticsOptions m_stats_options = StatisticsOptions();
125c0981da4SDimitry Andric };
126c0981da4SDimitry Andric
127f73363f1SDimitry Andric public:
CommandObjectStatsDump(CommandInterpreter & interpreter)128f73363f1SDimitry Andric CommandObjectStatsDump(CommandInterpreter &interpreter)
129c0981da4SDimitry Andric : CommandObjectParsed(
130c0981da4SDimitry Andric interpreter, "statistics dump", "Dump metrics in JSON format",
131c0981da4SDimitry Andric "statistics dump [<options>]", eCommandRequiresTarget) {}
132f73363f1SDimitry Andric
133f73363f1SDimitry Andric ~CommandObjectStatsDump() override = default;
134f73363f1SDimitry Andric
GetOptions()135c0981da4SDimitry Andric Options *GetOptions() override { return &m_options; }
136c0981da4SDimitry Andric
137f73363f1SDimitry Andric protected:
DoExecute(Args & command,CommandReturnObject & result)138b1c73532SDimitry Andric void DoExecute(Args &command, CommandReturnObject &result) override {
139c0981da4SDimitry Andric Target *target = nullptr;
140c0981da4SDimitry Andric if (!m_options.m_all_targets)
141c0981da4SDimitry Andric target = m_exe_ctx.GetTargetPtr();
142f73363f1SDimitry Andric
143c0981da4SDimitry Andric result.AppendMessageWithFormatv(
144ac9a064cSDimitry Andric "{0:2}", DebuggerStats::ReportStatistics(
145ac9a064cSDimitry Andric GetDebugger(), target, m_options.GetStatisticsOptions()));
146f73363f1SDimitry Andric result.SetStatus(eReturnStatusSuccessFinishResult);
147f73363f1SDimitry Andric }
148c0981da4SDimitry Andric
149c0981da4SDimitry Andric CommandOptions m_options;
150f73363f1SDimitry Andric };
151f73363f1SDimitry Andric
CommandObjectStats(CommandInterpreter & interpreter)152f73363f1SDimitry Andric CommandObjectStats::CommandObjectStats(CommandInterpreter &interpreter)
153f73363f1SDimitry Andric : CommandObjectMultiword(interpreter, "statistics",
154f73363f1SDimitry Andric "Print statistics about a debugging session",
155f73363f1SDimitry Andric "statistics <subcommand> [<subcommand-options>]") {
156f73363f1SDimitry Andric LoadSubCommand("enable",
157f73363f1SDimitry Andric CommandObjectSP(new CommandObjectStatsEnable(interpreter)));
158f73363f1SDimitry Andric LoadSubCommand("disable",
159f73363f1SDimitry Andric CommandObjectSP(new CommandObjectStatsDisable(interpreter)));
160f73363f1SDimitry Andric LoadSubCommand("dump",
161f73363f1SDimitry Andric CommandObjectSP(new CommandObjectStatsDump(interpreter)));
162f73363f1SDimitry Andric }
163f73363f1SDimitry Andric
164f73363f1SDimitry Andric CommandObjectStats::~CommandObjectStats() = default;
165