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