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