mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-05-13 17:37:00 +00:00

The new module stats adds the ability to measure the time it takes to parse and index the symbol tables for each module, and reports modules statistics in the output of "statistics dump" along with the path, UUID and triple of the module. The time it takes to parse and index the symbol tables are also aggregated into new top level key/value pairs at the target level. Differential Revision: https://reviews.llvm.org/D112279
134 lines
4.3 KiB
C++
134 lines
4.3 KiB
C++
//===-- CommandObjectStats.cpp --------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "CommandObjectStats.h"
|
|
#include "lldb/Core/Debugger.h"
|
|
#include "lldb/Host/OptionParser.h"
|
|
#include "lldb/Interpreter/CommandReturnObject.h"
|
|
#include "lldb/Target/Target.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
class CommandObjectStatsEnable : public CommandObjectParsed {
|
|
public:
|
|
CommandObjectStatsEnable(CommandInterpreter &interpreter)
|
|
: CommandObjectParsed(interpreter, "enable",
|
|
"Enable statistics collection", nullptr,
|
|
eCommandProcessMustBePaused) {}
|
|
|
|
~CommandObjectStatsEnable() override = default;
|
|
|
|
protected:
|
|
bool DoExecute(Args &command, CommandReturnObject &result) override {
|
|
if (DebuggerStats::GetCollectingStats()) {
|
|
result.AppendError("statistics already enabled");
|
|
return false;
|
|
}
|
|
|
|
DebuggerStats::SetCollectingStats(true);
|
|
result.SetStatus(eReturnStatusSuccessFinishResult);
|
|
return true;
|
|
}
|
|
};
|
|
|
|
class CommandObjectStatsDisable : public CommandObjectParsed {
|
|
public:
|
|
CommandObjectStatsDisable(CommandInterpreter &interpreter)
|
|
: CommandObjectParsed(interpreter, "disable",
|
|
"Disable statistics collection", nullptr,
|
|
eCommandProcessMustBePaused) {}
|
|
|
|
~CommandObjectStatsDisable() override = default;
|
|
|
|
protected:
|
|
bool DoExecute(Args &command, CommandReturnObject &result) override {
|
|
if (!DebuggerStats::GetCollectingStats()) {
|
|
result.AppendError("need to enable statistics before disabling them");
|
|
return false;
|
|
}
|
|
|
|
DebuggerStats::SetCollectingStats(false);
|
|
result.SetStatus(eReturnStatusSuccessFinishResult);
|
|
return true;
|
|
}
|
|
};
|
|
|
|
#define LLDB_OPTIONS_statistics_dump
|
|
#include "CommandOptions.inc"
|
|
|
|
class CommandObjectStatsDump : public CommandObjectParsed {
|
|
class CommandOptions : public Options {
|
|
public:
|
|
CommandOptions() : Options() { OptionParsingStarting(nullptr); }
|
|
|
|
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg,
|
|
ExecutionContext *execution_context) override {
|
|
Status error;
|
|
const int short_option = m_getopt_table[option_idx].val;
|
|
|
|
switch (short_option) {
|
|
case 'a':
|
|
m_all_targets = true;
|
|
break;
|
|
default:
|
|
llvm_unreachable("Unimplemented option");
|
|
}
|
|
return error;
|
|
}
|
|
|
|
void OptionParsingStarting(ExecutionContext *execution_context) override {
|
|
m_all_targets = false;
|
|
}
|
|
|
|
llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
|
|
return llvm::makeArrayRef(g_statistics_dump_options);
|
|
}
|
|
|
|
bool m_all_targets = false;
|
|
};
|
|
|
|
public:
|
|
CommandObjectStatsDump(CommandInterpreter &interpreter)
|
|
: CommandObjectParsed(
|
|
interpreter, "statistics dump", "Dump metrics in JSON format",
|
|
"statistics dump [<options>]", eCommandRequiresTarget) {}
|
|
|
|
~CommandObjectStatsDump() override = default;
|
|
|
|
Options *GetOptions() override { return &m_options; }
|
|
|
|
protected:
|
|
bool DoExecute(Args &command, CommandReturnObject &result) override {
|
|
Target *target = nullptr;
|
|
if (!m_options.m_all_targets)
|
|
target = m_exe_ctx.GetTargetPtr();
|
|
|
|
result.AppendMessageWithFormatv(
|
|
"{0:2}", DebuggerStats::ReportStatistics(GetDebugger(), target));
|
|
result.SetStatus(eReturnStatusSuccessFinishResult);
|
|
return true;
|
|
}
|
|
|
|
CommandOptions m_options;
|
|
};
|
|
|
|
CommandObjectStats::CommandObjectStats(CommandInterpreter &interpreter)
|
|
: CommandObjectMultiword(interpreter, "statistics",
|
|
"Print statistics about a debugging session",
|
|
"statistics <subcommand> [<subcommand-options>]") {
|
|
LoadSubCommand("enable",
|
|
CommandObjectSP(new CommandObjectStatsEnable(interpreter)));
|
|
LoadSubCommand("disable",
|
|
CommandObjectSP(new CommandObjectStatsDisable(interpreter)));
|
|
LoadSubCommand("dump",
|
|
CommandObjectSP(new CommandObjectStatsDump(interpreter)));
|
|
}
|
|
|
|
CommandObjectStats::~CommandObjectStats() = default;
|