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