121fed052SAidan Dodds //===-- RenderScriptScriptGroup.cpp -----------------------------*- C++ -*-===// 221fed052SAidan Dodds // 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 621fed052SAidan Dodds // 721fed052SAidan Dodds //===----------------------------------------------------------------------===// 821fed052SAidan Dodds 921fed052SAidan Dodds #include "lldb/Breakpoint/StoppointCallbackContext.h" 1021fed052SAidan Dodds #include "lldb/Core/Debugger.h" 1121fed052SAidan Dodds #include "lldb/Core/PluginManager.h" 1221fed052SAidan Dodds #include "lldb/Interpreter/CommandInterpreter.h" 1321fed052SAidan Dodds #include "lldb/Interpreter/CommandObjectMultiword.h" 1421fed052SAidan Dodds #include "lldb/Interpreter/CommandReturnObject.h" 1521fed052SAidan Dodds #include "lldb/Interpreter/Options.h" 1621fed052SAidan Dodds #include "lldb/Symbol/Symbol.h" 1721fed052SAidan Dodds #include "lldb/Symbol/Type.h" 1821fed052SAidan Dodds #include "lldb/Symbol/VariableList.h" 1921fed052SAidan Dodds #include "lldb/Target/Process.h" 2021fed052SAidan Dodds #include "lldb/Target/Target.h" 21145d95c9SPavel Labath #include "lldb/Utility/Args.h" 22bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h" 236f9e6901SZachary Turner #include "lldb/Utility/Log.h" 2497206d57SZachary Turner #include "lldb/Utility/Status.h" 2521fed052SAidan Dodds 2621fed052SAidan Dodds #include "RenderScriptRuntime.h" 2721fed052SAidan Dodds #include "RenderScriptScriptGroup.h" 2821fed052SAidan Dodds 2921fed052SAidan Dodds using namespace lldb; 3021fed052SAidan Dodds using namespace lldb_private; 3121fed052SAidan Dodds using namespace lldb_renderscript; 3221fed052SAidan Dodds 3321fed052SAidan Dodds class CommandObjectRenderScriptScriptGroupBreakpointSet 3421fed052SAidan Dodds : public CommandObjectParsed { 3521fed052SAidan Dodds public: 3621fed052SAidan Dodds CommandObjectRenderScriptScriptGroupBreakpointSet( 3721fed052SAidan Dodds CommandInterpreter &interpreter) 3821fed052SAidan Dodds : CommandObjectParsed( 3921fed052SAidan Dodds interpreter, "renderscript scriptgroup breakpoint set", 4021fed052SAidan Dodds "Place a breakpoint on all kernels forming a script group.", 4121fed052SAidan Dodds "renderscript scriptgroup breakpoint set <group_name>", 4221fed052SAidan Dodds eCommandRequiresProcess | eCommandProcessMustBeLaunched) {} 4321fed052SAidan Dodds 4421fed052SAidan Dodds ~CommandObjectRenderScriptScriptGroupBreakpointSet() override = default; 4521fed052SAidan Dodds 4621fed052SAidan Dodds bool DoExecute(Args &command, CommandReturnObject &result) override { 4721fed052SAidan Dodds Stream &stream = result.GetOutputStream(); 4821fed052SAidan Dodds RenderScriptRuntime *runtime = static_cast<RenderScriptRuntime *>( 4921fed052SAidan Dodds m_exe_ctx.GetProcessPtr()->GetLanguageRuntime( 5021fed052SAidan Dodds eLanguageTypeExtRenderScript)); 5121fed052SAidan Dodds assert(runtime); 5221fed052SAidan Dodds auto &target = m_exe_ctx.GetTargetSP(); 5321fed052SAidan Dodds bool stop_on_all = false; 5421fed052SAidan Dodds const llvm::StringRef long_stop_all("--stop-on-all"), short_stop_all("-a"); 5521fed052SAidan Dodds std::vector<ConstString> sites; 5621fed052SAidan Dodds sites.reserve(command.GetArgumentCount()); 5721fed052SAidan Dodds for (size_t i = 0; i < command.GetArgumentCount(); ++i) { 5821fed052SAidan Dodds const auto arg = command.GetArgumentAtIndex(i); 5921fed052SAidan Dodds if (long_stop_all == arg || short_stop_all == arg) 6021fed052SAidan Dodds stop_on_all = true; 6121fed052SAidan Dodds else 6221fed052SAidan Dodds sites.push_back(ConstString(arg)); 6321fed052SAidan Dodds } 6421fed052SAidan Dodds for (const auto &name : sites) { 6521fed052SAidan Dodds runtime->PlaceBreakpointOnScriptGroup(target, stream, name, stop_on_all); 6621fed052SAidan Dodds } 6721fed052SAidan Dodds result.SetStatus(eReturnStatusSuccessFinishResult); 6821fed052SAidan Dodds return true; 6921fed052SAidan Dodds } 7021fed052SAidan Dodds }; 7121fed052SAidan Dodds 7221fed052SAidan Dodds class CommandObjectRenderScriptScriptGroupBreakpoint 7321fed052SAidan Dodds : public CommandObjectMultiword { 7421fed052SAidan Dodds public: 7521fed052SAidan Dodds CommandObjectRenderScriptScriptGroupBreakpoint( 7621fed052SAidan Dodds CommandInterpreter &interpreter) 7721fed052SAidan Dodds : CommandObjectMultiword( 7821fed052SAidan Dodds interpreter, "renderscript scriptgroup breakpoint", 7921fed052SAidan Dodds "Renderscript scriptgroup breakpoint interaction.", 8021fed052SAidan Dodds "renderscript scriptgroup breakpoint set [--stop-on-all/-a]" 8121fed052SAidan Dodds "<scriptgroup name> ...", 8221fed052SAidan Dodds eCommandRequiresProcess | eCommandProcessMustBeLaunched) { 8321fed052SAidan Dodds LoadSubCommand( 8421fed052SAidan Dodds "set", 8521fed052SAidan Dodds CommandObjectSP(new CommandObjectRenderScriptScriptGroupBreakpointSet( 8621fed052SAidan Dodds interpreter))); 8721fed052SAidan Dodds } 8821fed052SAidan Dodds 8921fed052SAidan Dodds ~CommandObjectRenderScriptScriptGroupBreakpoint() override = default; 9021fed052SAidan Dodds }; 9121fed052SAidan Dodds 9221fed052SAidan Dodds class CommandObjectRenderScriptScriptGroupList : public CommandObjectParsed { 9321fed052SAidan Dodds public: 9421fed052SAidan Dodds CommandObjectRenderScriptScriptGroupList(CommandInterpreter &interpreter) 9521fed052SAidan Dodds : CommandObjectParsed(interpreter, "renderscript scriptgroup list", 9621fed052SAidan Dodds "List all currently discovered script groups.", 9721fed052SAidan Dodds "renderscript scriptgroup list", 9821fed052SAidan Dodds eCommandRequiresProcess | 9921fed052SAidan Dodds eCommandProcessMustBeLaunched) {} 10021fed052SAidan Dodds 10121fed052SAidan Dodds ~CommandObjectRenderScriptScriptGroupList() override = default; 10221fed052SAidan Dodds 10321fed052SAidan Dodds bool DoExecute(Args &command, CommandReturnObject &result) override { 10421fed052SAidan Dodds Stream &stream = result.GetOutputStream(); 10521fed052SAidan Dodds RenderScriptRuntime *runtime = static_cast<RenderScriptRuntime *>( 10621fed052SAidan Dodds m_exe_ctx.GetProcessPtr()->GetLanguageRuntime( 10721fed052SAidan Dodds eLanguageTypeExtRenderScript)); 10821fed052SAidan Dodds assert(runtime); 10921fed052SAidan Dodds const RSScriptGroupList &groups = runtime->GetScriptGroups(); 11021fed052SAidan Dodds // print script group count 11121fed052SAidan Dodds stream.Printf("%" PRIu64 " script %s", uint64_t(groups.size()), 11221fed052SAidan Dodds (groups.size() == 1) ? "group" : "groups"); 11321fed052SAidan Dodds stream.EOL(); 11421fed052SAidan Dodds // print script group details 11521fed052SAidan Dodds stream.IndentMore(); 11621fed052SAidan Dodds for (const RSScriptGroupDescriptorSP &g : groups) { 11721fed052SAidan Dodds if (g) { 11821fed052SAidan Dodds stream.Indent(); 11921fed052SAidan Dodds // script group name 12021fed052SAidan Dodds stream.Printf("%s", g->m_name.AsCString()); 12121fed052SAidan Dodds stream.EOL(); 12221fed052SAidan Dodds // print out the kernels 12321fed052SAidan Dodds stream.IndentMore(); 12421fed052SAidan Dodds for (const auto &k : g->m_kernels) { 12521fed052SAidan Dodds stream.Indent(); 12621fed052SAidan Dodds stream.Printf(". %s", k.m_name.AsCString()); 12721fed052SAidan Dodds stream.EOL(); 12821fed052SAidan Dodds } 12921fed052SAidan Dodds stream.IndentLess(); 13021fed052SAidan Dodds } 13121fed052SAidan Dodds } 13221fed052SAidan Dodds stream.IndentLess(); 13321fed052SAidan Dodds result.SetStatus(eReturnStatusSuccessFinishResult); 13421fed052SAidan Dodds return true; 13521fed052SAidan Dodds } 13621fed052SAidan Dodds }; 13721fed052SAidan Dodds 13821fed052SAidan Dodds class CommandObjectRenderScriptScriptGroup : public CommandObjectMultiword { 13921fed052SAidan Dodds public: 14021fed052SAidan Dodds CommandObjectRenderScriptScriptGroup(CommandInterpreter &interpreter) 14121fed052SAidan Dodds : CommandObjectMultiword(interpreter, "renderscript scriptgroup", 14221fed052SAidan Dodds "Command set for interacting with scriptgroups.", 14321fed052SAidan Dodds nullptr, eCommandRequiresProcess | 14421fed052SAidan Dodds eCommandProcessMustBeLaunched) { 14521fed052SAidan Dodds LoadSubCommand( 14621fed052SAidan Dodds "breakpoint", 14721fed052SAidan Dodds CommandObjectSP( 14821fed052SAidan Dodds new CommandObjectRenderScriptScriptGroupBreakpoint(interpreter))); 14921fed052SAidan Dodds LoadSubCommand( 15021fed052SAidan Dodds "list", CommandObjectSP( 15121fed052SAidan Dodds new CommandObjectRenderScriptScriptGroupList(interpreter))); 15221fed052SAidan Dodds } 15321fed052SAidan Dodds 15421fed052SAidan Dodds ~CommandObjectRenderScriptScriptGroup() override = default; 15521fed052SAidan Dodds }; 15621fed052SAidan Dodds 15721fed052SAidan Dodds lldb::CommandObjectSP NewCommandObjectRenderScriptScriptGroup( 15821fed052SAidan Dodds lldb_private::CommandInterpreter &interpreter) { 15921fed052SAidan Dodds return CommandObjectSP(new CommandObjectRenderScriptScriptGroup(interpreter)); 16021fed052SAidan Dodds } 161