1dda28197Spatrick //===-- CommandObjectStats.cpp --------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick
9061da546Spatrick #include "CommandObjectStats.h"
10*f6aab3d8Srobert #include "lldb/Core/Debugger.h"
11*f6aab3d8Srobert #include "lldb/Host/OptionParser.h"
12*f6aab3d8Srobert #include "lldb/Interpreter/CommandOptionArgumentTable.h"
13061da546Spatrick #include "lldb/Interpreter/CommandReturnObject.h"
14061da546Spatrick #include "lldb/Target/Target.h"
15061da546Spatrick
16061da546Spatrick using namespace lldb;
17061da546Spatrick using namespace lldb_private;
18061da546Spatrick
19061da546Spatrick class CommandObjectStatsEnable : public CommandObjectParsed {
20061da546Spatrick public:
CommandObjectStatsEnable(CommandInterpreter & interpreter)21061da546Spatrick CommandObjectStatsEnable(CommandInterpreter &interpreter)
22061da546Spatrick : CommandObjectParsed(interpreter, "enable",
23061da546Spatrick "Enable statistics collection", nullptr,
24061da546Spatrick eCommandProcessMustBePaused) {}
25061da546Spatrick
26061da546Spatrick ~CommandObjectStatsEnable() override = default;
27061da546Spatrick
28061da546Spatrick protected:
DoExecute(Args & command,CommandReturnObject & result)29061da546Spatrick bool DoExecute(Args &command, CommandReturnObject &result) override {
30*f6aab3d8Srobert if (DebuggerStats::GetCollectingStats()) {
31061da546Spatrick result.AppendError("statistics already enabled");
32061da546Spatrick return false;
33061da546Spatrick }
34061da546Spatrick
35*f6aab3d8Srobert DebuggerStats::SetCollectingStats(true);
36061da546Spatrick result.SetStatus(eReturnStatusSuccessFinishResult);
37061da546Spatrick return true;
38061da546Spatrick }
39061da546Spatrick };
40061da546Spatrick
41061da546Spatrick class CommandObjectStatsDisable : public CommandObjectParsed {
42061da546Spatrick public:
CommandObjectStatsDisable(CommandInterpreter & interpreter)43061da546Spatrick CommandObjectStatsDisable(CommandInterpreter &interpreter)
44061da546Spatrick : CommandObjectParsed(interpreter, "disable",
45061da546Spatrick "Disable statistics collection", nullptr,
46061da546Spatrick eCommandProcessMustBePaused) {}
47061da546Spatrick
48061da546Spatrick ~CommandObjectStatsDisable() override = default;
49061da546Spatrick
50061da546Spatrick protected:
DoExecute(Args & command,CommandReturnObject & result)51061da546Spatrick bool DoExecute(Args &command, CommandReturnObject &result) override {
52*f6aab3d8Srobert if (!DebuggerStats::GetCollectingStats()) {
53061da546Spatrick result.AppendError("need to enable statistics before disabling them");
54061da546Spatrick return false;
55061da546Spatrick }
56061da546Spatrick
57*f6aab3d8Srobert DebuggerStats::SetCollectingStats(false);
58061da546Spatrick result.SetStatus(eReturnStatusSuccessFinishResult);
59061da546Spatrick return true;
60061da546Spatrick }
61061da546Spatrick };
62061da546Spatrick
63*f6aab3d8Srobert #define LLDB_OPTIONS_statistics_dump
64*f6aab3d8Srobert #include "CommandOptions.inc"
65*f6aab3d8Srobert
66061da546Spatrick class CommandObjectStatsDump : public CommandObjectParsed {
67*f6aab3d8Srobert class CommandOptions : public Options {
68*f6aab3d8Srobert public:
CommandOptions()69*f6aab3d8Srobert CommandOptions() { OptionParsingStarting(nullptr); }
70*f6aab3d8Srobert
SetOptionValue(uint32_t option_idx,llvm::StringRef option_arg,ExecutionContext * execution_context)71*f6aab3d8Srobert Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,
72*f6aab3d8Srobert ExecutionContext *execution_context) override {
73*f6aab3d8Srobert Status error;
74*f6aab3d8Srobert const int short_option = m_getopt_table[option_idx].val;
75*f6aab3d8Srobert
76*f6aab3d8Srobert switch (short_option) {
77*f6aab3d8Srobert case 'a':
78*f6aab3d8Srobert m_all_targets = true;
79*f6aab3d8Srobert break;
80*f6aab3d8Srobert default:
81*f6aab3d8Srobert llvm_unreachable("Unimplemented option");
82*f6aab3d8Srobert }
83*f6aab3d8Srobert return error;
84*f6aab3d8Srobert }
85*f6aab3d8Srobert
OptionParsingStarting(ExecutionContext * execution_context)86*f6aab3d8Srobert void OptionParsingStarting(ExecutionContext *execution_context) override {
87*f6aab3d8Srobert m_all_targets = false;
88*f6aab3d8Srobert }
89*f6aab3d8Srobert
GetDefinitions()90*f6aab3d8Srobert llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
91*f6aab3d8Srobert return llvm::ArrayRef(g_statistics_dump_options);
92*f6aab3d8Srobert }
93*f6aab3d8Srobert
94*f6aab3d8Srobert bool m_all_targets = false;
95*f6aab3d8Srobert };
96*f6aab3d8Srobert
97061da546Spatrick public:
CommandObjectStatsDump(CommandInterpreter & interpreter)98061da546Spatrick CommandObjectStatsDump(CommandInterpreter &interpreter)
99*f6aab3d8Srobert : CommandObjectParsed(
100*f6aab3d8Srobert interpreter, "statistics dump", "Dump metrics in JSON format",
101*f6aab3d8Srobert "statistics dump [<options>]", eCommandRequiresTarget) {}
102061da546Spatrick
103061da546Spatrick ~CommandObjectStatsDump() override = default;
104061da546Spatrick
GetOptions()105*f6aab3d8Srobert Options *GetOptions() override { return &m_options; }
106*f6aab3d8Srobert
107061da546Spatrick protected:
DoExecute(Args & command,CommandReturnObject & result)108061da546Spatrick bool DoExecute(Args &command, CommandReturnObject &result) override {
109*f6aab3d8Srobert Target *target = nullptr;
110*f6aab3d8Srobert if (!m_options.m_all_targets)
111*f6aab3d8Srobert target = m_exe_ctx.GetTargetPtr();
112061da546Spatrick
113*f6aab3d8Srobert result.AppendMessageWithFormatv(
114*f6aab3d8Srobert "{0:2}", DebuggerStats::ReportStatistics(GetDebugger(), target));
115061da546Spatrick result.SetStatus(eReturnStatusSuccessFinishResult);
116061da546Spatrick return true;
117061da546Spatrick }
118*f6aab3d8Srobert
119*f6aab3d8Srobert CommandOptions m_options;
120061da546Spatrick };
121061da546Spatrick
CommandObjectStats(CommandInterpreter & interpreter)122061da546Spatrick CommandObjectStats::CommandObjectStats(CommandInterpreter &interpreter)
123061da546Spatrick : CommandObjectMultiword(interpreter, "statistics",
124061da546Spatrick "Print statistics about a debugging session",
125061da546Spatrick "statistics <subcommand> [<subcommand-options>]") {
126061da546Spatrick LoadSubCommand("enable",
127061da546Spatrick CommandObjectSP(new CommandObjectStatsEnable(interpreter)));
128061da546Spatrick LoadSubCommand("disable",
129061da546Spatrick CommandObjectSP(new CommandObjectStatsDisable(interpreter)));
130061da546Spatrick LoadSubCommand("dump",
131061da546Spatrick CommandObjectSP(new CommandObjectStatsDump(interpreter)));
132061da546Spatrick }
133061da546Spatrick
134061da546Spatrick CommandObjectStats::~CommandObjectStats() = default;
135