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