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 
44   ~CommandObjectRenderScriptScriptGroupBreakpointSet() override = default;
45 
DoExecute(Args & command,CommandReturnObject & result)46   bool DoExecute(Args &command, CommandReturnObject &result) override {
47     Stream &stream = result.GetOutputStream();
48     RenderScriptRuntime *runtime = static_cast<RenderScriptRuntime *>(
49         m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(
50             eLanguageTypeExtRenderScript));
51     assert(runtime);
52     auto &target = m_exe_ctx.GetTargetSP();
53     bool stop_on_all = false;
54     const llvm::StringRef long_stop_all("--stop-on-all"), short_stop_all("-a");
55     std::vector<ConstString> sites;
56     sites.reserve(command.GetArgumentCount());
57     for (size_t i = 0; i < command.GetArgumentCount(); ++i) {
58       const auto arg = command.GetArgumentAtIndex(i);
59       if (long_stop_all == arg || short_stop_all == arg)
60         stop_on_all = true;
61       else
62         sites.push_back(ConstString(arg));
63     }
64     for (const auto &name : sites) {
65       runtime->PlaceBreakpointOnScriptGroup(target, stream, name, stop_on_all);
66     }
67     result.SetStatus(eReturnStatusSuccessFinishResult);
68     return true;
69   }
70 };
71 
72 class CommandObjectRenderScriptScriptGroupBreakpoint
73     : public CommandObjectMultiword {
74 public:
CommandObjectRenderScriptScriptGroupBreakpoint(CommandInterpreter & interpreter)75   CommandObjectRenderScriptScriptGroupBreakpoint(
76       CommandInterpreter &interpreter)
77       : CommandObjectMultiword(
78             interpreter, "renderscript scriptgroup breakpoint",
79             "Renderscript scriptgroup breakpoint interaction.",
80             "renderscript scriptgroup breakpoint set [--stop-on-all/-a]"
81             "<scriptgroup name> ...",
82             eCommandRequiresProcess | eCommandProcessMustBeLaunched) {
83     LoadSubCommand(
84         "set",
85         CommandObjectSP(new CommandObjectRenderScriptScriptGroupBreakpointSet(
86             interpreter)));
87   }
88 
89   ~CommandObjectRenderScriptScriptGroupBreakpoint() override = default;
90 };
91 
92 class CommandObjectRenderScriptScriptGroupList : public CommandObjectParsed {
93 public:
CommandObjectRenderScriptScriptGroupList(CommandInterpreter & interpreter)94   CommandObjectRenderScriptScriptGroupList(CommandInterpreter &interpreter)
95       : CommandObjectParsed(interpreter, "renderscript scriptgroup list",
96                             "List all currently discovered script groups.",
97                             "renderscript scriptgroup list",
98                             eCommandRequiresProcess |
99                                 eCommandProcessMustBeLaunched) {}
100 
101   ~CommandObjectRenderScriptScriptGroupList() override = default;
102 
DoExecute(Args & command,CommandReturnObject & result)103   bool DoExecute(Args &command, CommandReturnObject &result) override {
104     Stream &stream = result.GetOutputStream();
105     RenderScriptRuntime *runtime = static_cast<RenderScriptRuntime *>(
106         m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(
107             eLanguageTypeExtRenderScript));
108     assert(runtime);
109     const RSScriptGroupList &groups = runtime->GetScriptGroups();
110     // print script group count
111     stream.Printf("%" PRIu64 " script %s", uint64_t(groups.size()),
112                   (groups.size() == 1) ? "group" : "groups");
113     stream.EOL();
114     // print script group details
115     stream.IndentMore();
116     for (const RSScriptGroupDescriptorSP &g : groups) {
117       if (g) {
118         stream.Indent();
119         // script group name
120         stream.Printf("%s", g->m_name.AsCString());
121         stream.EOL();
122         // print out the kernels
123         stream.IndentMore();
124         for (const auto &k : g->m_kernels) {
125           stream.Indent();
126           stream.Printf(". %s", k.m_name.AsCString());
127           stream.EOL();
128         }
129         stream.IndentLess();
130       }
131     }
132     stream.IndentLess();
133     result.SetStatus(eReturnStatusSuccessFinishResult);
134     return true;
135   }
136 };
137 
138 class CommandObjectRenderScriptScriptGroup : public CommandObjectMultiword {
139 public:
CommandObjectRenderScriptScriptGroup(CommandInterpreter & interpreter)140   CommandObjectRenderScriptScriptGroup(CommandInterpreter &interpreter)
141       : CommandObjectMultiword(interpreter, "renderscript scriptgroup",
142                                "Command set for interacting with scriptgroups.",
143                                nullptr, eCommandRequiresProcess |
144                                             eCommandProcessMustBeLaunched) {
145     LoadSubCommand(
146         "breakpoint",
147         CommandObjectSP(
148             new CommandObjectRenderScriptScriptGroupBreakpoint(interpreter)));
149     LoadSubCommand(
150         "list", CommandObjectSP(
151                     new CommandObjectRenderScriptScriptGroupList(interpreter)));
152   }
153 
154   ~CommandObjectRenderScriptScriptGroup() override = default;
155 };
156 
NewCommandObjectRenderScriptScriptGroup(lldb_private::CommandInterpreter & interpreter)157 lldb::CommandObjectSP NewCommandObjectRenderScriptScriptGroup(
158     lldb_private::CommandInterpreter &interpreter) {
159   return CommandObjectSP(new CommandObjectRenderScriptScriptGroup(interpreter));
160 }
161