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