This is currently being done in an ad hoc way, and so for some commands it isn't being checked. We have the info to make this check, since commands are supposed to add their arguments to the m_arguments field of the CommandObject. This change uses that info to check whether the command received arguments in error. A handful of commands weren't defining their argument types, I also had to fix them. And a bunch of commands were checking for arguments by hand, so I removed those checks in favor of the CommandObject one. That also meant I had to change some tests that were checking for the ad hoc error outputs. Differential Revision: https://reviews.llvm.org/D128453
164 lines
6.2 KiB
C++
164 lines
6.2 KiB
C++
//===-- RenderScriptScriptGroup.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 "lldb/Breakpoint/StoppointCallbackContext.h"
|
|
#include "lldb/Core/Debugger.h"
|
|
#include "lldb/Core/PluginManager.h"
|
|
#include "lldb/Interpreter/CommandInterpreter.h"
|
|
#include "lldb/Interpreter/CommandObjectMultiword.h"
|
|
#include "lldb/Interpreter/CommandReturnObject.h"
|
|
#include "lldb/Interpreter/Options.h"
|
|
#include "lldb/Symbol/Symbol.h"
|
|
#include "lldb/Symbol/Type.h"
|
|
#include "lldb/Symbol/VariableList.h"
|
|
#include "lldb/Target/Process.h"
|
|
#include "lldb/Target/Target.h"
|
|
#include "lldb/Utility/Args.h"
|
|
#include "lldb/Utility/ConstString.h"
|
|
#include "lldb/Utility/Log.h"
|
|
#include "lldb/Utility/Status.h"
|
|
|
|
#include "RenderScriptRuntime.h"
|
|
#include "RenderScriptScriptGroup.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
using namespace lldb_renderscript;
|
|
|
|
class CommandObjectRenderScriptScriptGroupBreakpointSet
|
|
: public CommandObjectParsed {
|
|
public:
|
|
CommandObjectRenderScriptScriptGroupBreakpointSet(
|
|
CommandInterpreter &interpreter)
|
|
: CommandObjectParsed(
|
|
interpreter, "renderscript scriptgroup breakpoint set",
|
|
"Place a breakpoint on all kernels forming a script group.",
|
|
"renderscript scriptgroup breakpoint set <group_name>",
|
|
eCommandRequiresProcess | eCommandProcessMustBeLaunched) {
|
|
CommandArgumentData name_arg{eArgTypeName, eArgRepeatPlus};
|
|
m_arguments.push_back({name_arg});
|
|
}
|
|
|
|
~CommandObjectRenderScriptScriptGroupBreakpointSet() override = default;
|
|
|
|
bool DoExecute(Args &command, CommandReturnObject &result) override {
|
|
Stream &stream = result.GetOutputStream();
|
|
RenderScriptRuntime *runtime = static_cast<RenderScriptRuntime *>(
|
|
m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(
|
|
eLanguageTypeExtRenderScript));
|
|
assert(runtime);
|
|
auto &target = m_exe_ctx.GetTargetSP();
|
|
bool stop_on_all = false;
|
|
const llvm::StringRef long_stop_all("--stop-on-all"), short_stop_all("-a");
|
|
std::vector<ConstString> sites;
|
|
sites.reserve(command.GetArgumentCount());
|
|
for (size_t i = 0; i < command.GetArgumentCount(); ++i) {
|
|
const auto arg = command.GetArgumentAtIndex(i);
|
|
if (long_stop_all == arg || short_stop_all == arg)
|
|
stop_on_all = true;
|
|
else
|
|
sites.push_back(ConstString(arg));
|
|
}
|
|
for (const auto &name : sites) {
|
|
runtime->PlaceBreakpointOnScriptGroup(target, stream, name, stop_on_all);
|
|
}
|
|
result.SetStatus(eReturnStatusSuccessFinishResult);
|
|
return true;
|
|
}
|
|
};
|
|
|
|
class CommandObjectRenderScriptScriptGroupBreakpoint
|
|
: public CommandObjectMultiword {
|
|
public:
|
|
CommandObjectRenderScriptScriptGroupBreakpoint(
|
|
CommandInterpreter &interpreter)
|
|
: CommandObjectMultiword(
|
|
interpreter, "renderscript scriptgroup breakpoint",
|
|
"Renderscript scriptgroup breakpoint interaction.",
|
|
"renderscript scriptgroup breakpoint set [--stop-on-all/-a]"
|
|
"<scriptgroup name> ...",
|
|
eCommandRequiresProcess | eCommandProcessMustBeLaunched) {
|
|
LoadSubCommand(
|
|
"set",
|
|
CommandObjectSP(new CommandObjectRenderScriptScriptGroupBreakpointSet(
|
|
interpreter)));
|
|
}
|
|
|
|
~CommandObjectRenderScriptScriptGroupBreakpoint() override = default;
|
|
};
|
|
|
|
class CommandObjectRenderScriptScriptGroupList : public CommandObjectParsed {
|
|
public:
|
|
CommandObjectRenderScriptScriptGroupList(CommandInterpreter &interpreter)
|
|
: CommandObjectParsed(interpreter, "renderscript scriptgroup list",
|
|
"List all currently discovered script groups.",
|
|
"renderscript scriptgroup list",
|
|
eCommandRequiresProcess |
|
|
eCommandProcessMustBeLaunched) {}
|
|
|
|
~CommandObjectRenderScriptScriptGroupList() override = default;
|
|
|
|
bool DoExecute(Args &command, CommandReturnObject &result) override {
|
|
Stream &stream = result.GetOutputStream();
|
|
RenderScriptRuntime *runtime = static_cast<RenderScriptRuntime *>(
|
|
m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(
|
|
eLanguageTypeExtRenderScript));
|
|
assert(runtime);
|
|
const RSScriptGroupList &groups = runtime->GetScriptGroups();
|
|
// print script group count
|
|
stream.Printf("%" PRIu64 " script %s", uint64_t(groups.size()),
|
|
(groups.size() == 1) ? "group" : "groups");
|
|
stream.EOL();
|
|
// print script group details
|
|
stream.IndentMore();
|
|
for (const RSScriptGroupDescriptorSP &g : groups) {
|
|
if (g) {
|
|
stream.Indent();
|
|
// script group name
|
|
stream.Printf("%s", g->m_name.AsCString());
|
|
stream.EOL();
|
|
// print out the kernels
|
|
stream.IndentMore();
|
|
for (const auto &k : g->m_kernels) {
|
|
stream.Indent();
|
|
stream.Printf(". %s", k.m_name.AsCString());
|
|
stream.EOL();
|
|
}
|
|
stream.IndentLess();
|
|
}
|
|
}
|
|
stream.IndentLess();
|
|
result.SetStatus(eReturnStatusSuccessFinishResult);
|
|
return true;
|
|
}
|
|
};
|
|
|
|
class CommandObjectRenderScriptScriptGroup : public CommandObjectMultiword {
|
|
public:
|
|
CommandObjectRenderScriptScriptGroup(CommandInterpreter &interpreter)
|
|
: CommandObjectMultiword(interpreter, "renderscript scriptgroup",
|
|
"Command set for interacting with scriptgroups.",
|
|
nullptr, eCommandRequiresProcess |
|
|
eCommandProcessMustBeLaunched) {
|
|
LoadSubCommand(
|
|
"breakpoint",
|
|
CommandObjectSP(
|
|
new CommandObjectRenderScriptScriptGroupBreakpoint(interpreter)));
|
|
LoadSubCommand(
|
|
"list", CommandObjectSP(
|
|
new CommandObjectRenderScriptScriptGroupList(interpreter)));
|
|
}
|
|
|
|
~CommandObjectRenderScriptScriptGroup() override = default;
|
|
};
|
|
|
|
lldb::CommandObjectSP NewCommandObjectRenderScriptScriptGroup(
|
|
lldb_private::CommandInterpreter &interpreter) {
|
|
return CommandObjectSP(new CommandObjectRenderScriptScriptGroup(interpreter));
|
|
}
|