110166c74SDavide Italiano //===-- CommandObjectStats.cpp ----------------------------------*- C++ -*-===//
210166c74SDavide Italiano //
310166c74SDavide Italiano //                     The LLVM Compiler Infrastructure
410166c74SDavide Italiano //
510166c74SDavide Italiano // This file is distributed under the University of Illinois Open Source
610166c74SDavide Italiano // License. See LICENSE.TXT for details.
710166c74SDavide Italiano //
810166c74SDavide Italiano //===----------------------------------------------------------------------===//
910166c74SDavide Italiano 
1010166c74SDavide Italiano #include "CommandObjectStats.h"
1110166c74SDavide Italiano #include "lldb/Host/Host.h"
1210166c74SDavide Italiano #include "lldb/Interpreter/CommandInterpreter.h"
1310166c74SDavide Italiano #include "lldb/Interpreter/CommandReturnObject.h"
14*24fff242SDavide Italiano #include "lldb/Target/Target.h"
1510166c74SDavide Italiano 
1610166c74SDavide Italiano using namespace lldb;
1710166c74SDavide Italiano using namespace lldb_private;
1810166c74SDavide Italiano 
19*24fff242SDavide Italiano class CommandObjectStatsEnable : public CommandObjectParsed {
20*24fff242SDavide Italiano public:
21*24fff242SDavide Italiano   CommandObjectStatsEnable(CommandInterpreter &interpreter)
22*24fff242SDavide Italiano       : CommandObjectParsed(interpreter, "enable",
23*24fff242SDavide Italiano                             "Enable statistics collection", nullptr,
24*24fff242SDavide Italiano                             eCommandProcessMustBePaused) {}
25*24fff242SDavide Italiano 
26*24fff242SDavide Italiano   ~CommandObjectStatsEnable() override = default;
27*24fff242SDavide Italiano 
28*24fff242SDavide Italiano protected:
29*24fff242SDavide Italiano   bool DoExecute(Args &command, CommandReturnObject &result) override {
30*24fff242SDavide Italiano     Target *target = GetSelectedOrDummyTarget();
31*24fff242SDavide Italiano 
32*24fff242SDavide Italiano     if (target->GetCollectingStats()) {
33*24fff242SDavide Italiano       result.AppendError("statistics already enabled");
34*24fff242SDavide Italiano       result.SetStatus(eReturnStatusFailed);
35*24fff242SDavide Italiano       return false;
3610166c74SDavide Italiano     }
3710166c74SDavide Italiano 
38*24fff242SDavide Italiano     target->SetCollectingStats(true);
39*24fff242SDavide Italiano     result.SetStatus(eReturnStatusSuccessFinishResult);
4010166c74SDavide Italiano     return true;
4110166c74SDavide Italiano   }
42*24fff242SDavide Italiano };
4310166c74SDavide Italiano 
44*24fff242SDavide Italiano class CommandObjectStatsDisable : public CommandObjectParsed {
45*24fff242SDavide Italiano public:
46*24fff242SDavide Italiano   CommandObjectStatsDisable(CommandInterpreter &interpreter)
47*24fff242SDavide Italiano       : CommandObjectParsed(interpreter, "disable",
48*24fff242SDavide Italiano                             "Disable statistics collection", nullptr,
49*24fff242SDavide Italiano                             eCommandProcessMustBePaused) {}
50*24fff242SDavide Italiano 
51*24fff242SDavide Italiano   ~CommandObjectStatsDisable() override = default;
52*24fff242SDavide Italiano 
53*24fff242SDavide Italiano protected:
54*24fff242SDavide Italiano   bool DoExecute(Args &command, CommandReturnObject &result) override {
55*24fff242SDavide Italiano     Target *target = GetSelectedOrDummyTarget();
56*24fff242SDavide Italiano 
57*24fff242SDavide Italiano     if (!target->GetCollectingStats()) {
58*24fff242SDavide Italiano       result.AppendError("need to enable statistics before disabling them");
59*24fff242SDavide Italiano       result.SetStatus(eReturnStatusFailed);
60*24fff242SDavide Italiano       return false;
61*24fff242SDavide Italiano     }
62*24fff242SDavide Italiano 
63*24fff242SDavide Italiano     target->SetCollectingStats(false);
64*24fff242SDavide Italiano     result.SetStatus(eReturnStatusSuccessFinishResult);
65*24fff242SDavide Italiano     return true;
66*24fff242SDavide Italiano   }
67*24fff242SDavide Italiano };
68*24fff242SDavide Italiano 
69*24fff242SDavide Italiano class CommandObjectStatsDump : public CommandObjectParsed {
70*24fff242SDavide Italiano private:
71*24fff242SDavide Italiano   std::string GetStatDescription(lldb_private::StatisticKind K) {
72*24fff242SDavide Italiano     switch (K) {
73*24fff242SDavide Italiano     case StatisticKind::ExpressionSuccessful:
74*24fff242SDavide Italiano       return "Number of expr evaluation successes";
75*24fff242SDavide Italiano     case StatisticKind::ExpressionFailure:
76*24fff242SDavide Italiano       return "Number of expr evaluation failures";
77*24fff242SDavide Italiano     case StatisticKind::FrameVarSuccess:
78*24fff242SDavide Italiano       return "Number of frame var successes";
79*24fff242SDavide Italiano     case StatisticKind::FrameVarFailure:
80*24fff242SDavide Italiano       return "Number of frame var failures";
81*24fff242SDavide Italiano     case StatisticKind::StatisticMax:
82*24fff242SDavide Italiano       return "";
83*24fff242SDavide Italiano     }
84*24fff242SDavide Italiano     llvm_unreachable("Statistic not registered!");
85*24fff242SDavide Italiano   }
86*24fff242SDavide Italiano 
87*24fff242SDavide Italiano public:
88*24fff242SDavide Italiano   CommandObjectStatsDump(CommandInterpreter &interpreter)
89*24fff242SDavide Italiano       : CommandObjectParsed(interpreter, "dump", "Dump statistics results",
90*24fff242SDavide Italiano                             nullptr, eCommandProcessMustBePaused) {}
91*24fff242SDavide Italiano 
92*24fff242SDavide Italiano   ~CommandObjectStatsDump() override = default;
93*24fff242SDavide Italiano 
94*24fff242SDavide Italiano protected:
95*24fff242SDavide Italiano   bool DoExecute(Args &command, CommandReturnObject &result) override {
96*24fff242SDavide Italiano     Target *target = GetSelectedOrDummyTarget();
97*24fff242SDavide Italiano 
98*24fff242SDavide Italiano     uint32_t i = 0;
99*24fff242SDavide Italiano     for (auto &stat : target->GetStatistics()) {
100*24fff242SDavide Italiano       result.AppendMessageWithFormat(
101*24fff242SDavide Italiano           "%s : %u\n",
102*24fff242SDavide Italiano           GetStatDescription(static_cast<lldb_private::StatisticKind>(i))
103*24fff242SDavide Italiano               .c_str(),
104*24fff242SDavide Italiano           stat);
105*24fff242SDavide Italiano       i += 1;
106*24fff242SDavide Italiano     }
107*24fff242SDavide Italiano     result.SetStatus(eReturnStatusSuccessFinishResult);
108*24fff242SDavide Italiano     return true;
109*24fff242SDavide Italiano   }
110*24fff242SDavide Italiano };
111*24fff242SDavide Italiano 
112*24fff242SDavide Italiano CommandObjectStats::CommandObjectStats(CommandInterpreter &interpreter)
113*24fff242SDavide Italiano     : CommandObjectMultiword(interpreter, "statistics",
114*24fff242SDavide Italiano                              "Print statistics about a debugging session",
115*24fff242SDavide Italiano                              "statistics <subcommand> [<subcommand-options>]") {
116*24fff242SDavide Italiano   LoadSubCommand("enable",
117*24fff242SDavide Italiano                  CommandObjectSP(new CommandObjectStatsEnable(interpreter)));
118*24fff242SDavide Italiano   LoadSubCommand("disable",
119*24fff242SDavide Italiano                  CommandObjectSP(new CommandObjectStatsDisable(interpreter)));
120*24fff242SDavide Italiano   LoadSubCommand("dump",
121*24fff242SDavide Italiano                  CommandObjectSP(new CommandObjectStatsDump(interpreter)));
122*24fff242SDavide Italiano }
123*24fff242SDavide Italiano 
124*24fff242SDavide Italiano CommandObjectStats::~CommandObjectStats() = default;
125