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