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