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:
CommandObjectRenderScriptScriptGroupBreakpointSet(CommandInterpreter & interpreter)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
DoExecute(Args & command,CommandReturnObject & result)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:
CommandObjectRenderScriptScriptGroupBreakpoint(CommandInterpreter & interpreter)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:
CommandObjectRenderScriptScriptGroupList(CommandInterpreter & interpreter)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
DoExecute(Args & command,CommandReturnObject & result)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:
CommandObjectRenderScriptScriptGroup(CommandInterpreter & interpreter)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
NewCommandObjectRenderScriptScriptGroup(lldb_private::CommandInterpreter & interpreter)160 lldb::CommandObjectSP NewCommandObjectRenderScriptScriptGroup(
161 lldb_private::CommandInterpreter &interpreter) {
162 return CommandObjectSP(new CommandObjectRenderScriptScriptGroup(interpreter));
163 }
164