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