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