180814287SRaphael 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"
10d7b33853SGreg Clayton #include "lldb/Core/Debugger.h"
11d7b33853SGreg Clayton #include "lldb/Host/OptionParser.h"
12*7ced9fffSJonas Devlieghere #include "lldb/Interpreter/CommandOptionArgumentTable.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:
CommandObjectStatsEnable(CommandInterpreter & interpreter)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:
DoExecute(Args & command,CommandReturnObject & result)2924fff242SDavide Italiano bool DoExecute(Args &command, CommandReturnObject &result) override {
30d7b33853SGreg Clayton if (DebuggerStats::GetCollectingStats()) {
3124fff242SDavide Italiano result.AppendError("statistics already enabled");
3224fff242SDavide Italiano return false;
3310166c74SDavide Italiano }
3410166c74SDavide Italiano
35d7b33853SGreg Clayton DebuggerStats::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:
CommandObjectStatsDisable(CommandInterpreter & interpreter)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:
DoExecute(Args & command,CommandReturnObject & result)5124fff242SDavide Italiano bool DoExecute(Args &command, CommandReturnObject &result) override {
52d7b33853SGreg Clayton if (!DebuggerStats::GetCollectingStats()) {
5324fff242SDavide Italiano result.AppendError("need to enable statistics before disabling them");
5424fff242SDavide Italiano return false;
5524fff242SDavide Italiano }
5624fff242SDavide Italiano
57d7b33853SGreg Clayton DebuggerStats::SetCollectingStats(false);
5824fff242SDavide Italiano result.SetStatus(eReturnStatusSuccessFinishResult);
5924fff242SDavide Italiano return true;
6024fff242SDavide Italiano }
6124fff242SDavide Italiano };
6224fff242SDavide Italiano
63d7b33853SGreg Clayton #define LLDB_OPTIONS_statistics_dump
64d7b33853SGreg Clayton #include "CommandOptions.inc"
65d7b33853SGreg Clayton
6624fff242SDavide Italiano class CommandObjectStatsDump : public CommandObjectParsed {
67d7b33853SGreg Clayton class CommandOptions : public Options {
68d7b33853SGreg Clayton public:
CommandOptions()69abb0ed44SKazu Hirata CommandOptions() { OptionParsingStarting(nullptr); }
70d7b33853SGreg Clayton
SetOptionValue(uint32_t option_idx,llvm::StringRef option_arg,ExecutionContext * execution_context)71d7b33853SGreg Clayton Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,
72d7b33853SGreg Clayton ExecutionContext *execution_context) override {
73d7b33853SGreg Clayton Status error;
74d7b33853SGreg Clayton const int short_option = m_getopt_table[option_idx].val;
75d7b33853SGreg Clayton
76d7b33853SGreg Clayton switch (short_option) {
77d7b33853SGreg Clayton case 'a':
78d7b33853SGreg Clayton m_all_targets = true;
79d7b33853SGreg Clayton break;
80d7b33853SGreg Clayton default:
81d7b33853SGreg Clayton llvm_unreachable("Unimplemented option");
82d7b33853SGreg Clayton }
83d7b33853SGreg Clayton return error;
84d7b33853SGreg Clayton }
85d7b33853SGreg Clayton
OptionParsingStarting(ExecutionContext * execution_context)86d7b33853SGreg Clayton void OptionParsingStarting(ExecutionContext *execution_context) override {
87d7b33853SGreg Clayton m_all_targets = false;
88d7b33853SGreg Clayton }
89d7b33853SGreg Clayton
GetDefinitions()90d7b33853SGreg Clayton llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
91d7b33853SGreg Clayton return llvm::makeArrayRef(g_statistics_dump_options);
92d7b33853SGreg Clayton }
93d7b33853SGreg Clayton
94d7b33853SGreg Clayton bool m_all_targets = false;
95d7b33853SGreg Clayton };
96d7b33853SGreg Clayton
9724fff242SDavide Italiano public:
CommandObjectStatsDump(CommandInterpreter & interpreter)9824fff242SDavide Italiano CommandObjectStatsDump(CommandInterpreter &interpreter)
99d7b33853SGreg Clayton : CommandObjectParsed(
100d7b33853SGreg Clayton interpreter, "statistics dump", "Dump metrics in JSON format",
101d7b33853SGreg Clayton "statistics dump [<options>]", eCommandRequiresTarget) {}
10224fff242SDavide Italiano
10324fff242SDavide Italiano ~CommandObjectStatsDump() override = default;
10424fff242SDavide Italiano
GetOptions()105d7b33853SGreg Clayton Options *GetOptions() override { return &m_options; }
106d7b33853SGreg Clayton
10724fff242SDavide Italiano protected:
DoExecute(Args & command,CommandReturnObject & result)10824fff242SDavide Italiano bool DoExecute(Args &command, CommandReturnObject &result) override {
109c571988eSGreg Clayton Target *target = nullptr;
110c571988eSGreg Clayton if (!m_options.m_all_targets)
111c571988eSGreg Clayton target = m_exe_ctx.GetTargetPtr();
112c571988eSGreg Clayton
113d7b33853SGreg Clayton result.AppendMessageWithFormatv(
114c571988eSGreg Clayton "{0:2}", DebuggerStats::ReportStatistics(GetDebugger(), target));
11524fff242SDavide Italiano result.SetStatus(eReturnStatusSuccessFinishResult);
11624fff242SDavide Italiano return true;
11724fff242SDavide Italiano }
118d7b33853SGreg Clayton
119d7b33853SGreg Clayton CommandOptions m_options;
12024fff242SDavide Italiano };
12124fff242SDavide Italiano
CommandObjectStats(CommandInterpreter & interpreter)12224fff242SDavide Italiano CommandObjectStats::CommandObjectStats(CommandInterpreter &interpreter)
12324fff242SDavide Italiano : CommandObjectMultiword(interpreter, "statistics",
12424fff242SDavide Italiano "Print statistics about a debugging session",
12524fff242SDavide Italiano "statistics <subcommand> [<subcommand-options>]") {
12624fff242SDavide Italiano LoadSubCommand("enable",
12724fff242SDavide Italiano CommandObjectSP(new CommandObjectStatsEnable(interpreter)));
12824fff242SDavide Italiano LoadSubCommand("disable",
12924fff242SDavide Italiano CommandObjectSP(new CommandObjectStatsDisable(interpreter)));
13024fff242SDavide Italiano LoadSubCommand("dump",
13124fff242SDavide Italiano CommandObjectSP(new CommandObjectStatsDump(interpreter)));
13224fff242SDavide Italiano }
13324fff242SDavide Italiano
13424fff242SDavide Italiano CommandObjectStats::~CommandObjectStats() = default;
135