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