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