diff options
Diffstat (limited to 'source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptScriptGroup.cpp')
-rw-r--r-- | source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptScriptGroup.cpp | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptScriptGroup.cpp b/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptScriptGroup.cpp new file mode 100644 index 000000000000..a8202dd08814 --- /dev/null +++ b/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptScriptGroup.cpp @@ -0,0 +1,162 @@ +//===-- RenderScriptScriptGroup.cpp -----------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Breakpoint/StoppointCallbackContext.h" +#include "lldb/Core/ConstString.h" +#include "lldb/Core/Debugger.h" +#include "lldb/Core/Error.h" +#include "lldb/Core/Log.h" +#include "lldb/Core/PluginManager.h" +#include "lldb/Host/StringConvert.h" +#include "lldb/Interpreter/Args.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 "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) {} + + ~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)); +} |