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