1*21fed052SAidan Dodds //===-- RenderScriptScriptGroup.cpp -----------------------------*- C++ -*-===// 2*21fed052SAidan Dodds // 3*21fed052SAidan Dodds // The LLVM Compiler Infrastructure 4*21fed052SAidan Dodds // 5*21fed052SAidan Dodds // This file is distributed under the University of Illinois Open Source 6*21fed052SAidan Dodds // License. See LICENSE.TXT for details. 7*21fed052SAidan Dodds // 8*21fed052SAidan Dodds //===----------------------------------------------------------------------===// 9*21fed052SAidan Dodds 10*21fed052SAidan Dodds #include "lldb/Breakpoint/StoppointCallbackContext.h" 11*21fed052SAidan Dodds #include "lldb/Core/ConstString.h" 12*21fed052SAidan Dodds #include "lldb/Core/Debugger.h" 13*21fed052SAidan Dodds #include "lldb/Core/Error.h" 14*21fed052SAidan Dodds #include "lldb/Core/Log.h" 15*21fed052SAidan Dodds #include "lldb/Core/PluginManager.h" 16*21fed052SAidan Dodds #include "lldb/Host/StringConvert.h" 17*21fed052SAidan Dodds #include "lldb/Interpreter/Args.h" 18*21fed052SAidan Dodds #include "lldb/Interpreter/CommandInterpreter.h" 19*21fed052SAidan Dodds #include "lldb/Interpreter/CommandObjectMultiword.h" 20*21fed052SAidan Dodds #include "lldb/Interpreter/CommandReturnObject.h" 21*21fed052SAidan Dodds #include "lldb/Interpreter/Options.h" 22*21fed052SAidan Dodds #include "lldb/Symbol/Symbol.h" 23*21fed052SAidan Dodds #include "lldb/Symbol/Type.h" 24*21fed052SAidan Dodds #include "lldb/Symbol/VariableList.h" 25*21fed052SAidan Dodds #include "lldb/Target/Process.h" 26*21fed052SAidan Dodds #include "lldb/Target/Target.h" 27*21fed052SAidan Dodds 28*21fed052SAidan Dodds #include "RenderScriptRuntime.h" 29*21fed052SAidan Dodds #include "RenderScriptScriptGroup.h" 30*21fed052SAidan Dodds 31*21fed052SAidan Dodds using namespace lldb; 32*21fed052SAidan Dodds using namespace lldb_private; 33*21fed052SAidan Dodds using namespace lldb_renderscript; 34*21fed052SAidan Dodds 35*21fed052SAidan Dodds class CommandObjectRenderScriptScriptGroupBreakpointSet 36*21fed052SAidan Dodds : public CommandObjectParsed { 37*21fed052SAidan Dodds public: 38*21fed052SAidan Dodds CommandObjectRenderScriptScriptGroupBreakpointSet( 39*21fed052SAidan Dodds CommandInterpreter &interpreter) 40*21fed052SAidan Dodds : CommandObjectParsed( 41*21fed052SAidan Dodds interpreter, "renderscript scriptgroup breakpoint set", 42*21fed052SAidan Dodds "Place a breakpoint on all kernels forming a script group.", 43*21fed052SAidan Dodds "renderscript scriptgroup breakpoint set <group_name>", 44*21fed052SAidan Dodds eCommandRequiresProcess | eCommandProcessMustBeLaunched) {} 45*21fed052SAidan Dodds 46*21fed052SAidan Dodds ~CommandObjectRenderScriptScriptGroupBreakpointSet() override = default; 47*21fed052SAidan Dodds 48*21fed052SAidan Dodds bool DoExecute(Args &command, CommandReturnObject &result) override { 49*21fed052SAidan Dodds Stream &stream = result.GetOutputStream(); 50*21fed052SAidan Dodds RenderScriptRuntime *runtime = static_cast<RenderScriptRuntime *>( 51*21fed052SAidan Dodds m_exe_ctx.GetProcessPtr()->GetLanguageRuntime( 52*21fed052SAidan Dodds eLanguageTypeExtRenderScript)); 53*21fed052SAidan Dodds assert(runtime); 54*21fed052SAidan Dodds auto &target = m_exe_ctx.GetTargetSP(); 55*21fed052SAidan Dodds bool stop_on_all = false; 56*21fed052SAidan Dodds const llvm::StringRef long_stop_all("--stop-on-all"), short_stop_all("-a"); 57*21fed052SAidan Dodds std::vector<ConstString> sites; 58*21fed052SAidan Dodds sites.reserve(command.GetArgumentCount()); 59*21fed052SAidan Dodds for (size_t i = 0; i < command.GetArgumentCount(); ++i) { 60*21fed052SAidan Dodds const auto arg = command.GetArgumentAtIndex(i); 61*21fed052SAidan Dodds if (long_stop_all == arg || short_stop_all == arg) 62*21fed052SAidan Dodds stop_on_all = true; 63*21fed052SAidan Dodds else 64*21fed052SAidan Dodds sites.push_back(ConstString(arg)); 65*21fed052SAidan Dodds } 66*21fed052SAidan Dodds for (const auto &name : sites) { 67*21fed052SAidan Dodds runtime->PlaceBreakpointOnScriptGroup(target, stream, name, stop_on_all); 68*21fed052SAidan Dodds } 69*21fed052SAidan Dodds result.SetStatus(eReturnStatusSuccessFinishResult); 70*21fed052SAidan Dodds return true; 71*21fed052SAidan Dodds } 72*21fed052SAidan Dodds }; 73*21fed052SAidan Dodds 74*21fed052SAidan Dodds class CommandObjectRenderScriptScriptGroupBreakpoint 75*21fed052SAidan Dodds : public CommandObjectMultiword { 76*21fed052SAidan Dodds public: 77*21fed052SAidan Dodds CommandObjectRenderScriptScriptGroupBreakpoint( 78*21fed052SAidan Dodds CommandInterpreter &interpreter) 79*21fed052SAidan Dodds : CommandObjectMultiword( 80*21fed052SAidan Dodds interpreter, "renderscript scriptgroup breakpoint", 81*21fed052SAidan Dodds "Renderscript scriptgroup breakpoint interaction.", 82*21fed052SAidan Dodds "renderscript scriptgroup breakpoint set [--stop-on-all/-a]" 83*21fed052SAidan Dodds "<scriptgroup name> ...", 84*21fed052SAidan Dodds eCommandRequiresProcess | eCommandProcessMustBeLaunched) { 85*21fed052SAidan Dodds LoadSubCommand( 86*21fed052SAidan Dodds "set", 87*21fed052SAidan Dodds CommandObjectSP(new CommandObjectRenderScriptScriptGroupBreakpointSet( 88*21fed052SAidan Dodds interpreter))); 89*21fed052SAidan Dodds } 90*21fed052SAidan Dodds 91*21fed052SAidan Dodds ~CommandObjectRenderScriptScriptGroupBreakpoint() override = default; 92*21fed052SAidan Dodds }; 93*21fed052SAidan Dodds 94*21fed052SAidan Dodds class CommandObjectRenderScriptScriptGroupList : public CommandObjectParsed { 95*21fed052SAidan Dodds public: 96*21fed052SAidan Dodds CommandObjectRenderScriptScriptGroupList(CommandInterpreter &interpreter) 97*21fed052SAidan Dodds : CommandObjectParsed(interpreter, "renderscript scriptgroup list", 98*21fed052SAidan Dodds "List all currently discovered script groups.", 99*21fed052SAidan Dodds "renderscript scriptgroup list", 100*21fed052SAidan Dodds eCommandRequiresProcess | 101*21fed052SAidan Dodds eCommandProcessMustBeLaunched) {} 102*21fed052SAidan Dodds 103*21fed052SAidan Dodds ~CommandObjectRenderScriptScriptGroupList() override = default; 104*21fed052SAidan Dodds 105*21fed052SAidan Dodds bool DoExecute(Args &command, CommandReturnObject &result) override { 106*21fed052SAidan Dodds Stream &stream = result.GetOutputStream(); 107*21fed052SAidan Dodds RenderScriptRuntime *runtime = static_cast<RenderScriptRuntime *>( 108*21fed052SAidan Dodds m_exe_ctx.GetProcessPtr()->GetLanguageRuntime( 109*21fed052SAidan Dodds eLanguageTypeExtRenderScript)); 110*21fed052SAidan Dodds assert(runtime); 111*21fed052SAidan Dodds const RSScriptGroupList &groups = runtime->GetScriptGroups(); 112*21fed052SAidan Dodds // print script group count 113*21fed052SAidan Dodds stream.Printf("%" PRIu64 " script %s", uint64_t(groups.size()), 114*21fed052SAidan Dodds (groups.size() == 1) ? "group" : "groups"); 115*21fed052SAidan Dodds stream.EOL(); 116*21fed052SAidan Dodds // print script group details 117*21fed052SAidan Dodds stream.IndentMore(); 118*21fed052SAidan Dodds for (const RSScriptGroupDescriptorSP &g : groups) { 119*21fed052SAidan Dodds if (g) { 120*21fed052SAidan Dodds stream.Indent(); 121*21fed052SAidan Dodds // script group name 122*21fed052SAidan Dodds stream.Printf("%s", g->m_name.AsCString()); 123*21fed052SAidan Dodds stream.EOL(); 124*21fed052SAidan Dodds // print out the kernels 125*21fed052SAidan Dodds stream.IndentMore(); 126*21fed052SAidan Dodds for (const auto &k : g->m_kernels) { 127*21fed052SAidan Dodds stream.Indent(); 128*21fed052SAidan Dodds stream.Printf(". %s", k.m_name.AsCString()); 129*21fed052SAidan Dodds stream.EOL(); 130*21fed052SAidan Dodds } 131*21fed052SAidan Dodds stream.IndentLess(); 132*21fed052SAidan Dodds } 133*21fed052SAidan Dodds } 134*21fed052SAidan Dodds stream.IndentLess(); 135*21fed052SAidan Dodds result.SetStatus(eReturnStatusSuccessFinishResult); 136*21fed052SAidan Dodds return true; 137*21fed052SAidan Dodds } 138*21fed052SAidan Dodds }; 139*21fed052SAidan Dodds 140*21fed052SAidan Dodds class CommandObjectRenderScriptScriptGroup : public CommandObjectMultiword { 141*21fed052SAidan Dodds public: 142*21fed052SAidan Dodds CommandObjectRenderScriptScriptGroup(CommandInterpreter &interpreter) 143*21fed052SAidan Dodds : CommandObjectMultiword(interpreter, "renderscript scriptgroup", 144*21fed052SAidan Dodds "Command set for interacting with scriptgroups.", 145*21fed052SAidan Dodds nullptr, eCommandRequiresProcess | 146*21fed052SAidan Dodds eCommandProcessMustBeLaunched) { 147*21fed052SAidan Dodds LoadSubCommand( 148*21fed052SAidan Dodds "breakpoint", 149*21fed052SAidan Dodds CommandObjectSP( 150*21fed052SAidan Dodds new CommandObjectRenderScriptScriptGroupBreakpoint(interpreter))); 151*21fed052SAidan Dodds LoadSubCommand( 152*21fed052SAidan Dodds "list", CommandObjectSP( 153*21fed052SAidan Dodds new CommandObjectRenderScriptScriptGroupList(interpreter))); 154*21fed052SAidan Dodds } 155*21fed052SAidan Dodds 156*21fed052SAidan Dodds ~CommandObjectRenderScriptScriptGroup() override = default; 157*21fed052SAidan Dodds }; 158*21fed052SAidan Dodds 159*21fed052SAidan Dodds lldb::CommandObjectSP NewCommandObjectRenderScriptScriptGroup( 160*21fed052SAidan Dodds lldb_private::CommandInterpreter &interpreter) { 161*21fed052SAidan Dodds return CommandObjectSP(new CommandObjectRenderScriptScriptGroup(interpreter)); 162*21fed052SAidan Dodds } 163