1*061da546Spatrick //===-- CommandObjectStats.cpp ----------------------------------*- C++ -*-===//
2*061da546Spatrick //
3*061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5*061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*061da546Spatrick //
7*061da546Spatrick //===----------------------------------------------------------------------===//
8*061da546Spatrick 
9*061da546Spatrick #include "CommandObjectStats.h"
10*061da546Spatrick #include "lldb/Interpreter/CommandReturnObject.h"
11*061da546Spatrick #include "lldb/Target/Target.h"
12*061da546Spatrick 
13*061da546Spatrick using namespace lldb;
14*061da546Spatrick using namespace lldb_private;
15*061da546Spatrick 
16*061da546Spatrick class CommandObjectStatsEnable : public CommandObjectParsed {
17*061da546Spatrick public:
18*061da546Spatrick   CommandObjectStatsEnable(CommandInterpreter &interpreter)
19*061da546Spatrick       : CommandObjectParsed(interpreter, "enable",
20*061da546Spatrick                             "Enable statistics collection", nullptr,
21*061da546Spatrick                             eCommandProcessMustBePaused) {}
22*061da546Spatrick 
23*061da546Spatrick   ~CommandObjectStatsEnable() override = default;
24*061da546Spatrick 
25*061da546Spatrick protected:
26*061da546Spatrick   bool DoExecute(Args &command, CommandReturnObject &result) override {
27*061da546Spatrick     Target &target = GetSelectedOrDummyTarget();
28*061da546Spatrick 
29*061da546Spatrick     if (target.GetCollectingStats()) {
30*061da546Spatrick       result.AppendError("statistics already enabled");
31*061da546Spatrick       result.SetStatus(eReturnStatusFailed);
32*061da546Spatrick       return false;
33*061da546Spatrick     }
34*061da546Spatrick 
35*061da546Spatrick     target.SetCollectingStats(true);
36*061da546Spatrick     result.SetStatus(eReturnStatusSuccessFinishResult);
37*061da546Spatrick     return true;
38*061da546Spatrick   }
39*061da546Spatrick };
40*061da546Spatrick 
41*061da546Spatrick class CommandObjectStatsDisable : public CommandObjectParsed {
42*061da546Spatrick public:
43*061da546Spatrick   CommandObjectStatsDisable(CommandInterpreter &interpreter)
44*061da546Spatrick       : CommandObjectParsed(interpreter, "disable",
45*061da546Spatrick                             "Disable statistics collection", nullptr,
46*061da546Spatrick                             eCommandProcessMustBePaused) {}
47*061da546Spatrick 
48*061da546Spatrick   ~CommandObjectStatsDisable() override = default;
49*061da546Spatrick 
50*061da546Spatrick protected:
51*061da546Spatrick   bool DoExecute(Args &command, CommandReturnObject &result) override {
52*061da546Spatrick     Target &target = GetSelectedOrDummyTarget();
53*061da546Spatrick 
54*061da546Spatrick     if (!target.GetCollectingStats()) {
55*061da546Spatrick       result.AppendError("need to enable statistics before disabling them");
56*061da546Spatrick       result.SetStatus(eReturnStatusFailed);
57*061da546Spatrick       return false;
58*061da546Spatrick     }
59*061da546Spatrick 
60*061da546Spatrick     target.SetCollectingStats(false);
61*061da546Spatrick     result.SetStatus(eReturnStatusSuccessFinishResult);
62*061da546Spatrick     return true;
63*061da546Spatrick   }
64*061da546Spatrick };
65*061da546Spatrick 
66*061da546Spatrick class CommandObjectStatsDump : public CommandObjectParsed {
67*061da546Spatrick public:
68*061da546Spatrick   CommandObjectStatsDump(CommandInterpreter &interpreter)
69*061da546Spatrick       : CommandObjectParsed(interpreter, "dump", "Dump statistics results",
70*061da546Spatrick                             nullptr, eCommandProcessMustBePaused) {}
71*061da546Spatrick 
72*061da546Spatrick   ~CommandObjectStatsDump() override = default;
73*061da546Spatrick 
74*061da546Spatrick protected:
75*061da546Spatrick   bool DoExecute(Args &command, CommandReturnObject &result) override {
76*061da546Spatrick     Target &target = GetSelectedOrDummyTarget();
77*061da546Spatrick 
78*061da546Spatrick     uint32_t i = 0;
79*061da546Spatrick     for (auto &stat : target.GetStatistics()) {
80*061da546Spatrick       result.AppendMessageWithFormat(
81*061da546Spatrick           "%s : %u\n",
82*061da546Spatrick           lldb_private::GetStatDescription(
83*061da546Spatrick               static_cast<lldb_private::StatisticKind>(i))
84*061da546Spatrick               .c_str(),
85*061da546Spatrick           stat);
86*061da546Spatrick       i += 1;
87*061da546Spatrick     }
88*061da546Spatrick     result.SetStatus(eReturnStatusSuccessFinishResult);
89*061da546Spatrick     return true;
90*061da546Spatrick   }
91*061da546Spatrick };
92*061da546Spatrick 
93*061da546Spatrick CommandObjectStats::CommandObjectStats(CommandInterpreter &interpreter)
94*061da546Spatrick     : CommandObjectMultiword(interpreter, "statistics",
95*061da546Spatrick                              "Print statistics about a debugging session",
96*061da546Spatrick                              "statistics <subcommand> [<subcommand-options>]") {
97*061da546Spatrick   LoadSubCommand("enable",
98*061da546Spatrick                  CommandObjectSP(new CommandObjectStatsEnable(interpreter)));
99*061da546Spatrick   LoadSubCommand("disable",
100*061da546Spatrick                  CommandObjectSP(new CommandObjectStatsDisable(interpreter)));
101*061da546Spatrick   LoadSubCommand("dump",
102*061da546Spatrick                  CommandObjectSP(new CommandObjectStatsDump(interpreter)));
103*061da546Spatrick }
104*061da546Spatrick 
105*061da546Spatrick CommandObjectStats::~CommandObjectStats() = default;
106