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