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" 1424fff242SDavide Italiano #include "lldb/Target/Target.h" 1510166c74SDavide Italiano 1610166c74SDavide Italiano using namespace lldb; 1710166c74SDavide Italiano using namespace lldb_private; 1810166c74SDavide Italiano 1924fff242SDavide Italiano class CommandObjectStatsEnable : public CommandObjectParsed { 2024fff242SDavide Italiano public: 2124fff242SDavide Italiano CommandObjectStatsEnable(CommandInterpreter &interpreter) 2224fff242SDavide Italiano : CommandObjectParsed(interpreter, "enable", 2324fff242SDavide Italiano "Enable statistics collection", nullptr, 2424fff242SDavide Italiano eCommandProcessMustBePaused) {} 2524fff242SDavide Italiano 2624fff242SDavide Italiano ~CommandObjectStatsEnable() override = default; 2724fff242SDavide Italiano 2824fff242SDavide Italiano protected: 2924fff242SDavide Italiano bool DoExecute(Args &command, CommandReturnObject &result) override { 3024fff242SDavide Italiano Target *target = GetSelectedOrDummyTarget(); 3124fff242SDavide Italiano 3224fff242SDavide Italiano if (target->GetCollectingStats()) { 3324fff242SDavide Italiano result.AppendError("statistics already enabled"); 3424fff242SDavide Italiano result.SetStatus(eReturnStatusFailed); 3524fff242SDavide Italiano return false; 3610166c74SDavide Italiano } 3710166c74SDavide Italiano 3824fff242SDavide Italiano target->SetCollectingStats(true); 3924fff242SDavide Italiano result.SetStatus(eReturnStatusSuccessFinishResult); 4010166c74SDavide Italiano return true; 4110166c74SDavide Italiano } 4224fff242SDavide Italiano }; 4310166c74SDavide Italiano 4424fff242SDavide Italiano class CommandObjectStatsDisable : public CommandObjectParsed { 4524fff242SDavide Italiano public: 4624fff242SDavide Italiano CommandObjectStatsDisable(CommandInterpreter &interpreter) 4724fff242SDavide Italiano : CommandObjectParsed(interpreter, "disable", 4824fff242SDavide Italiano "Disable statistics collection", nullptr, 4924fff242SDavide Italiano eCommandProcessMustBePaused) {} 5024fff242SDavide Italiano 5124fff242SDavide Italiano ~CommandObjectStatsDisable() override = default; 5224fff242SDavide Italiano 5324fff242SDavide Italiano protected: 5424fff242SDavide Italiano bool DoExecute(Args &command, CommandReturnObject &result) override { 5524fff242SDavide Italiano Target *target = GetSelectedOrDummyTarget(); 5624fff242SDavide Italiano 5724fff242SDavide Italiano if (!target->GetCollectingStats()) { 5824fff242SDavide Italiano result.AppendError("need to enable statistics before disabling them"); 5924fff242SDavide Italiano result.SetStatus(eReturnStatusFailed); 6024fff242SDavide Italiano return false; 6124fff242SDavide Italiano } 6224fff242SDavide Italiano 6324fff242SDavide Italiano target->SetCollectingStats(false); 6424fff242SDavide Italiano result.SetStatus(eReturnStatusSuccessFinishResult); 6524fff242SDavide Italiano return true; 6624fff242SDavide Italiano } 6724fff242SDavide Italiano }; 6824fff242SDavide Italiano 6924fff242SDavide Italiano class CommandObjectStatsDump : public CommandObjectParsed { 7024fff242SDavide Italiano public: 7124fff242SDavide Italiano CommandObjectStatsDump(CommandInterpreter &interpreter) 7224fff242SDavide Italiano : CommandObjectParsed(interpreter, "dump", "Dump statistics results", 7324fff242SDavide Italiano nullptr, eCommandProcessMustBePaused) {} 7424fff242SDavide Italiano 7524fff242SDavide Italiano ~CommandObjectStatsDump() override = default; 7624fff242SDavide Italiano 7724fff242SDavide Italiano protected: 7824fff242SDavide Italiano bool DoExecute(Args &command, CommandReturnObject &result) override { 7924fff242SDavide Italiano Target *target = GetSelectedOrDummyTarget(); 8024fff242SDavide Italiano 8124fff242SDavide Italiano uint32_t i = 0; 8224fff242SDavide Italiano for (auto &stat : target->GetStatistics()) { 8324fff242SDavide Italiano result.AppendMessageWithFormat( 8424fff242SDavide Italiano "%s : %u\n", 85*70539360SDavide Italiano lldb_private::GetStatDescription(static_cast<lldb_private::StatisticKind>(i)) 8624fff242SDavide Italiano .c_str(), 8724fff242SDavide Italiano stat); 8824fff242SDavide Italiano i += 1; 8924fff242SDavide Italiano } 9024fff242SDavide Italiano result.SetStatus(eReturnStatusSuccessFinishResult); 9124fff242SDavide Italiano return true; 9224fff242SDavide Italiano } 9324fff242SDavide Italiano }; 9424fff242SDavide Italiano 9524fff242SDavide Italiano CommandObjectStats::CommandObjectStats(CommandInterpreter &interpreter) 9624fff242SDavide Italiano : CommandObjectMultiword(interpreter, "statistics", 9724fff242SDavide Italiano "Print statistics about a debugging session", 9824fff242SDavide Italiano "statistics <subcommand> [<subcommand-options>]") { 9924fff242SDavide Italiano LoadSubCommand("enable", 10024fff242SDavide Italiano CommandObjectSP(new CommandObjectStatsEnable(interpreter))); 10124fff242SDavide Italiano LoadSubCommand("disable", 10224fff242SDavide Italiano CommandObjectSP(new CommandObjectStatsDisable(interpreter))); 10324fff242SDavide Italiano LoadSubCommand("dump", 10424fff242SDavide Italiano CommandObjectSP(new CommandObjectStatsDump(interpreter))); 10524fff242SDavide Italiano } 10624fff242SDavide Italiano 10724fff242SDavide Italiano CommandObjectStats::~CommandObjectStats() = default; 108