1*80814287SRaphael Isemann //===-- CommandObjectStats.cpp --------------------------------------------===// 210166c74SDavide Italiano // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 610166c74SDavide Italiano // 710166c74SDavide Italiano //===----------------------------------------------------------------------===// 810166c74SDavide Italiano 910166c74SDavide Italiano #include "CommandObjectStats.h" 1010166c74SDavide Italiano #include "lldb/Interpreter/CommandReturnObject.h" 1124fff242SDavide Italiano #include "lldb/Target/Target.h" 1210166c74SDavide Italiano 1310166c74SDavide Italiano using namespace lldb; 1410166c74SDavide Italiano using namespace lldb_private; 1510166c74SDavide Italiano 1624fff242SDavide Italiano class CommandObjectStatsEnable : public CommandObjectParsed { 1724fff242SDavide Italiano public: 1824fff242SDavide Italiano CommandObjectStatsEnable(CommandInterpreter &interpreter) 1924fff242SDavide Italiano : CommandObjectParsed(interpreter, "enable", 2024fff242SDavide Italiano "Enable statistics collection", nullptr, 2124fff242SDavide Italiano eCommandProcessMustBePaused) {} 2224fff242SDavide Italiano 2324fff242SDavide Italiano ~CommandObjectStatsEnable() override = default; 2424fff242SDavide Italiano 2524fff242SDavide Italiano protected: 2624fff242SDavide Italiano bool DoExecute(Args &command, CommandReturnObject &result) override { 27cb2380c9SRaphael Isemann Target &target = GetSelectedOrDummyTarget(); 2824fff242SDavide Italiano 29cb2380c9SRaphael Isemann if (target.GetCollectingStats()) { 3024fff242SDavide Italiano result.AppendError("statistics already enabled"); 3124fff242SDavide Italiano result.SetStatus(eReturnStatusFailed); 3224fff242SDavide Italiano return false; 3310166c74SDavide Italiano } 3410166c74SDavide Italiano 35cb2380c9SRaphael Isemann target.SetCollectingStats(true); 3624fff242SDavide Italiano result.SetStatus(eReturnStatusSuccessFinishResult); 3710166c74SDavide Italiano return true; 3810166c74SDavide Italiano } 3924fff242SDavide Italiano }; 4010166c74SDavide Italiano 4124fff242SDavide Italiano class CommandObjectStatsDisable : public CommandObjectParsed { 4224fff242SDavide Italiano public: 4324fff242SDavide Italiano CommandObjectStatsDisable(CommandInterpreter &interpreter) 4424fff242SDavide Italiano : CommandObjectParsed(interpreter, "disable", 4524fff242SDavide Italiano "Disable statistics collection", nullptr, 4624fff242SDavide Italiano eCommandProcessMustBePaused) {} 4724fff242SDavide Italiano 4824fff242SDavide Italiano ~CommandObjectStatsDisable() override = default; 4924fff242SDavide Italiano 5024fff242SDavide Italiano protected: 5124fff242SDavide Italiano bool DoExecute(Args &command, CommandReturnObject &result) override { 52cb2380c9SRaphael Isemann Target &target = GetSelectedOrDummyTarget(); 5324fff242SDavide Italiano 54cb2380c9SRaphael Isemann if (!target.GetCollectingStats()) { 5524fff242SDavide Italiano result.AppendError("need to enable statistics before disabling them"); 5624fff242SDavide Italiano result.SetStatus(eReturnStatusFailed); 5724fff242SDavide Italiano return false; 5824fff242SDavide Italiano } 5924fff242SDavide Italiano 60cb2380c9SRaphael Isemann target.SetCollectingStats(false); 6124fff242SDavide Italiano result.SetStatus(eReturnStatusSuccessFinishResult); 6224fff242SDavide Italiano return true; 6324fff242SDavide Italiano } 6424fff242SDavide Italiano }; 6524fff242SDavide Italiano 6624fff242SDavide Italiano class CommandObjectStatsDump : public CommandObjectParsed { 6724fff242SDavide Italiano public: 6824fff242SDavide Italiano CommandObjectStatsDump(CommandInterpreter &interpreter) 6924fff242SDavide Italiano : CommandObjectParsed(interpreter, "dump", "Dump statistics results", 7024fff242SDavide Italiano nullptr, eCommandProcessMustBePaused) {} 7124fff242SDavide Italiano 7224fff242SDavide Italiano ~CommandObjectStatsDump() override = default; 7324fff242SDavide Italiano 7424fff242SDavide Italiano protected: 7524fff242SDavide Italiano bool DoExecute(Args &command, CommandReturnObject &result) override { 76cb2380c9SRaphael Isemann Target &target = GetSelectedOrDummyTarget(); 7724fff242SDavide Italiano 7824fff242SDavide Italiano uint32_t i = 0; 79cb2380c9SRaphael Isemann for (auto &stat : target.GetStatistics()) { 8024fff242SDavide Italiano result.AppendMessageWithFormat( 8124fff242SDavide Italiano "%s : %u\n", 82a925974bSAdrian Prantl lldb_private::GetStatDescription( 83a925974bSAdrian Prantl static_cast<lldb_private::StatisticKind>(i)) 8424fff242SDavide Italiano .c_str(), 8524fff242SDavide Italiano stat); 8624fff242SDavide Italiano i += 1; 8724fff242SDavide Italiano } 8824fff242SDavide Italiano result.SetStatus(eReturnStatusSuccessFinishResult); 8924fff242SDavide Italiano return true; 9024fff242SDavide Italiano } 9124fff242SDavide Italiano }; 9224fff242SDavide Italiano 9324fff242SDavide Italiano CommandObjectStats::CommandObjectStats(CommandInterpreter &interpreter) 9424fff242SDavide Italiano : CommandObjectMultiword(interpreter, "statistics", 9524fff242SDavide Italiano "Print statistics about a debugging session", 9624fff242SDavide Italiano "statistics <subcommand> [<subcommand-options>]") { 9724fff242SDavide Italiano LoadSubCommand("enable", 9824fff242SDavide Italiano CommandObjectSP(new CommandObjectStatsEnable(interpreter))); 9924fff242SDavide Italiano LoadSubCommand("disable", 10024fff242SDavide Italiano CommandObjectSP(new CommandObjectStatsDisable(interpreter))); 10124fff242SDavide Italiano LoadSubCommand("dump", 10224fff242SDavide Italiano CommandObjectSP(new CommandObjectStatsDump(interpreter))); 10324fff242SDavide Italiano } 10424fff242SDavide Italiano 10524fff242SDavide Italiano CommandObjectStats::~CommandObjectStats() = default; 106