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