1*dda28197Spatrick //===-- 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"
10061da546Spatrick #include "lldb/Interpreter/CommandReturnObject.h"
11061da546Spatrick #include "lldb/Target/Target.h"
12061da546Spatrick 
13061da546Spatrick using namespace lldb;
14061da546Spatrick using namespace lldb_private;
15061da546Spatrick 
16061da546Spatrick class CommandObjectStatsEnable : public CommandObjectParsed {
17061da546Spatrick public:
18061da546Spatrick   CommandObjectStatsEnable(CommandInterpreter &interpreter)
19061da546Spatrick       : CommandObjectParsed(interpreter, "enable",
20061da546Spatrick                             "Enable statistics collection", nullptr,
21061da546Spatrick                             eCommandProcessMustBePaused) {}
22061da546Spatrick 
23061da546Spatrick   ~CommandObjectStatsEnable() override = default;
24061da546Spatrick 
25061da546Spatrick protected:
26061da546Spatrick   bool DoExecute(Args &command, CommandReturnObject &result) override {
27061da546Spatrick     Target &target = GetSelectedOrDummyTarget();
28061da546Spatrick 
29061da546Spatrick     if (target.GetCollectingStats()) {
30061da546Spatrick       result.AppendError("statistics already enabled");
31061da546Spatrick       result.SetStatus(eReturnStatusFailed);
32061da546Spatrick       return false;
33061da546Spatrick     }
34061da546Spatrick 
35061da546Spatrick     target.SetCollectingStats(true);
36061da546Spatrick     result.SetStatus(eReturnStatusSuccessFinishResult);
37061da546Spatrick     return true;
38061da546Spatrick   }
39061da546Spatrick };
40061da546Spatrick 
41061da546Spatrick class CommandObjectStatsDisable : public CommandObjectParsed {
42061da546Spatrick public:
43061da546Spatrick   CommandObjectStatsDisable(CommandInterpreter &interpreter)
44061da546Spatrick       : CommandObjectParsed(interpreter, "disable",
45061da546Spatrick                             "Disable statistics collection", nullptr,
46061da546Spatrick                             eCommandProcessMustBePaused) {}
47061da546Spatrick 
48061da546Spatrick   ~CommandObjectStatsDisable() override = default;
49061da546Spatrick 
50061da546Spatrick protected:
51061da546Spatrick   bool DoExecute(Args &command, CommandReturnObject &result) override {
52061da546Spatrick     Target &target = GetSelectedOrDummyTarget();
53061da546Spatrick 
54061da546Spatrick     if (!target.GetCollectingStats()) {
55061da546Spatrick       result.AppendError("need to enable statistics before disabling them");
56061da546Spatrick       result.SetStatus(eReturnStatusFailed);
57061da546Spatrick       return false;
58061da546Spatrick     }
59061da546Spatrick 
60061da546Spatrick     target.SetCollectingStats(false);
61061da546Spatrick     result.SetStatus(eReturnStatusSuccessFinishResult);
62061da546Spatrick     return true;
63061da546Spatrick   }
64061da546Spatrick };
65061da546Spatrick 
66061da546Spatrick class CommandObjectStatsDump : public CommandObjectParsed {
67061da546Spatrick public:
68061da546Spatrick   CommandObjectStatsDump(CommandInterpreter &interpreter)
69061da546Spatrick       : CommandObjectParsed(interpreter, "dump", "Dump statistics results",
70061da546Spatrick                             nullptr, eCommandProcessMustBePaused) {}
71061da546Spatrick 
72061da546Spatrick   ~CommandObjectStatsDump() override = default;
73061da546Spatrick 
74061da546Spatrick protected:
75061da546Spatrick   bool DoExecute(Args &command, CommandReturnObject &result) override {
76061da546Spatrick     Target &target = GetSelectedOrDummyTarget();
77061da546Spatrick 
78061da546Spatrick     uint32_t i = 0;
79061da546Spatrick     for (auto &stat : target.GetStatistics()) {
80061da546Spatrick       result.AppendMessageWithFormat(
81061da546Spatrick           "%s : %u\n",
82061da546Spatrick           lldb_private::GetStatDescription(
83061da546Spatrick               static_cast<lldb_private::StatisticKind>(i))
84061da546Spatrick               .c_str(),
85061da546Spatrick           stat);
86061da546Spatrick       i += 1;
87061da546Spatrick     }
88061da546Spatrick     result.SetStatus(eReturnStatusSuccessFinishResult);
89061da546Spatrick     return true;
90061da546Spatrick   }
91061da546Spatrick };
92061da546Spatrick 
93061da546Spatrick CommandObjectStats::CommandObjectStats(CommandInterpreter &interpreter)
94061da546Spatrick     : CommandObjectMultiword(interpreter, "statistics",
95061da546Spatrick                              "Print statistics about a debugging session",
96061da546Spatrick                              "statistics <subcommand> [<subcommand-options>]") {
97061da546Spatrick   LoadSubCommand("enable",
98061da546Spatrick                  CommandObjectSP(new CommandObjectStatsEnable(interpreter)));
99061da546Spatrick   LoadSubCommand("disable",
100061da546Spatrick                  CommandObjectSP(new CommandObjectStatsDisable(interpreter)));
101061da546Spatrick   LoadSubCommand("dump",
102061da546Spatrick                  CommandObjectSP(new CommandObjectStatsDump(interpreter)));
103061da546Spatrick }
104061da546Spatrick 
105061da546Spatrick CommandObjectStats::~CommandObjectStats() = default;
106