110166c74SDavide Italiano //===-- CommandObjectStats.cpp ----------------------------------*- C++ -*-===// 210166c74SDavide Italiano // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler 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/Host/Host.h" 1110166c74SDavide Italiano #include "lldb/Interpreter/CommandInterpreter.h" 1210166c74SDavide Italiano #include "lldb/Interpreter/CommandReturnObject.h" 1324fff242SDavide Italiano #include "lldb/Target/Target.h" 1410166c74SDavide Italiano 1510166c74SDavide Italiano using namespace lldb; 1610166c74SDavide Italiano using namespace lldb_private; 1710166c74SDavide Italiano 1824fff242SDavide Italiano class CommandObjectStatsEnable : public CommandObjectParsed { 1924fff242SDavide Italiano public: 2024fff242SDavide Italiano CommandObjectStatsEnable(CommandInterpreter &interpreter) 2124fff242SDavide Italiano : CommandObjectParsed(interpreter, "enable", 2224fff242SDavide Italiano "Enable statistics collection", nullptr, 2324fff242SDavide Italiano eCommandProcessMustBePaused) {} 2424fff242SDavide Italiano 2524fff242SDavide Italiano ~CommandObjectStatsEnable() override = default; 2624fff242SDavide Italiano 2724fff242SDavide Italiano protected: 2824fff242SDavide Italiano bool DoExecute(Args &command, CommandReturnObject &result) override { 2924fff242SDavide Italiano Target *target = GetSelectedOrDummyTarget(); 3024fff242SDavide Italiano 3124fff242SDavide Italiano if (target->GetCollectingStats()) { 3224fff242SDavide Italiano result.AppendError("statistics already enabled"); 3324fff242SDavide Italiano result.SetStatus(eReturnStatusFailed); 3424fff242SDavide Italiano return false; 3510166c74SDavide Italiano } 3610166c74SDavide Italiano 3724fff242SDavide Italiano target->SetCollectingStats(true); 3824fff242SDavide Italiano result.SetStatus(eReturnStatusSuccessFinishResult); 3910166c74SDavide Italiano return true; 4010166c74SDavide Italiano } 4124fff242SDavide Italiano }; 4210166c74SDavide Italiano 4324fff242SDavide Italiano class CommandObjectStatsDisable : public CommandObjectParsed { 4424fff242SDavide Italiano public: 4524fff242SDavide Italiano CommandObjectStatsDisable(CommandInterpreter &interpreter) 4624fff242SDavide Italiano : CommandObjectParsed(interpreter, "disable", 4724fff242SDavide Italiano "Disable statistics collection", nullptr, 4824fff242SDavide Italiano eCommandProcessMustBePaused) {} 4924fff242SDavide Italiano 5024fff242SDavide Italiano ~CommandObjectStatsDisable() override = default; 5124fff242SDavide Italiano 5224fff242SDavide Italiano protected: 5324fff242SDavide Italiano bool DoExecute(Args &command, CommandReturnObject &result) override { 5424fff242SDavide Italiano Target *target = GetSelectedOrDummyTarget(); 5524fff242SDavide Italiano 5624fff242SDavide Italiano if (!target->GetCollectingStats()) { 5724fff242SDavide Italiano result.AppendError("need to enable statistics before disabling them"); 5824fff242SDavide Italiano result.SetStatus(eReturnStatusFailed); 5924fff242SDavide Italiano return false; 6024fff242SDavide Italiano } 6124fff242SDavide Italiano 6224fff242SDavide Italiano target->SetCollectingStats(false); 6324fff242SDavide Italiano result.SetStatus(eReturnStatusSuccessFinishResult); 6424fff242SDavide Italiano return true; 6524fff242SDavide Italiano } 6624fff242SDavide Italiano }; 6724fff242SDavide Italiano 6824fff242SDavide Italiano class CommandObjectStatsDump : public CommandObjectParsed { 6924fff242SDavide Italiano public: 7024fff242SDavide Italiano CommandObjectStatsDump(CommandInterpreter &interpreter) 7124fff242SDavide Italiano : CommandObjectParsed(interpreter, "dump", "Dump statistics results", 7224fff242SDavide Italiano nullptr, eCommandProcessMustBePaused) {} 7324fff242SDavide Italiano 7424fff242SDavide Italiano ~CommandObjectStatsDump() override = default; 7524fff242SDavide Italiano 7624fff242SDavide Italiano protected: 7724fff242SDavide Italiano bool DoExecute(Args &command, CommandReturnObject &result) override { 7824fff242SDavide Italiano Target *target = GetSelectedOrDummyTarget(); 7924fff242SDavide Italiano 8024fff242SDavide Italiano uint32_t i = 0; 8124fff242SDavide Italiano for (auto &stat : target->GetStatistics()) { 8224fff242SDavide Italiano result.AppendMessageWithFormat( 8324fff242SDavide Italiano "%s : %u\n", 8470539360SDavide Italiano lldb_private::GetStatDescription(static_cast<lldb_private::StatisticKind>(i)) 8524fff242SDavide Italiano .c_str(), 8624fff242SDavide Italiano stat); 8724fff242SDavide Italiano i += 1; 8824fff242SDavide Italiano } 8924fff242SDavide Italiano result.SetStatus(eReturnStatusSuccessFinishResult); 9024fff242SDavide Italiano return true; 9124fff242SDavide Italiano } 9224fff242SDavide Italiano }; 9324fff242SDavide Italiano 9424fff242SDavide Italiano CommandObjectStats::CommandObjectStats(CommandInterpreter &interpreter) 9524fff242SDavide Italiano : CommandObjectMultiword(interpreter, "statistics", 9624fff242SDavide Italiano "Print statistics about a debugging session", 9724fff242SDavide Italiano "statistics <subcommand> [<subcommand-options>]") { 9824fff242SDavide Italiano LoadSubCommand("enable", 9924fff242SDavide Italiano CommandObjectSP(new CommandObjectStatsEnable(interpreter))); 10024fff242SDavide Italiano LoadSubCommand("disable", 10124fff242SDavide Italiano CommandObjectSP(new CommandObjectStatsDisable(interpreter))); 10224fff242SDavide Italiano LoadSubCommand("dump", 10324fff242SDavide Italiano CommandObjectSP(new CommandObjectStatsDump(interpreter))); 10424fff242SDavide Italiano } 10524fff242SDavide Italiano 10624fff242SDavide Italiano CommandObjectStats::~CommandObjectStats() = default; 107