121fed052SAidan Dodds //===-- RenderScriptScriptGroup.cpp -----------------------------*- C++ -*-===//
221fed052SAidan Dodds //
321fed052SAidan Dodds //                     The LLVM Compiler Infrastructure
421fed052SAidan Dodds //
521fed052SAidan Dodds // This file is distributed under the University of Illinois Open Source
621fed052SAidan Dodds // License. See LICENSE.TXT for details.
721fed052SAidan Dodds //
821fed052SAidan Dodds //===----------------------------------------------------------------------===//
921fed052SAidan Dodds 
1021fed052SAidan Dodds #include "lldb/Breakpoint/StoppointCallbackContext.h"
1121fed052SAidan Dodds #include "lldb/Core/Debugger.h"
1221fed052SAidan Dodds #include "lldb/Core/Log.h"
1321fed052SAidan Dodds #include "lldb/Core/PluginManager.h"
1421fed052SAidan Dodds #include "lldb/Host/StringConvert.h"
1521fed052SAidan Dodds #include "lldb/Interpreter/Args.h"
1621fed052SAidan Dodds #include "lldb/Interpreter/CommandInterpreter.h"
1721fed052SAidan Dodds #include "lldb/Interpreter/CommandObjectMultiword.h"
1821fed052SAidan Dodds #include "lldb/Interpreter/CommandReturnObject.h"
1921fed052SAidan Dodds #include "lldb/Interpreter/Options.h"
2021fed052SAidan Dodds #include "lldb/Symbol/Symbol.h"
2121fed052SAidan Dodds #include "lldb/Symbol/Type.h"
2221fed052SAidan Dodds #include "lldb/Symbol/VariableList.h"
2321fed052SAidan Dodds #include "lldb/Target/Process.h"
2421fed052SAidan Dodds #include "lldb/Target/Target.h"
25*bf9a7730SZachary Turner #include "lldb/Utility/ConstString.h"
26*bf9a7730SZachary Turner #include "lldb/Utility/Error.h"
2721fed052SAidan Dodds 
2821fed052SAidan Dodds #include "RenderScriptRuntime.h"
2921fed052SAidan Dodds #include "RenderScriptScriptGroup.h"
3021fed052SAidan Dodds 
3121fed052SAidan Dodds using namespace lldb;
3221fed052SAidan Dodds using namespace lldb_private;
3321fed052SAidan Dodds using namespace lldb_renderscript;
3421fed052SAidan Dodds 
3521fed052SAidan Dodds class CommandObjectRenderScriptScriptGroupBreakpointSet
3621fed052SAidan Dodds     : public CommandObjectParsed {
3721fed052SAidan Dodds public:
3821fed052SAidan Dodds   CommandObjectRenderScriptScriptGroupBreakpointSet(
3921fed052SAidan Dodds       CommandInterpreter &interpreter)
4021fed052SAidan Dodds       : CommandObjectParsed(
4121fed052SAidan Dodds             interpreter, "renderscript scriptgroup breakpoint set",
4221fed052SAidan Dodds             "Place a breakpoint on all kernels forming a script group.",
4321fed052SAidan Dodds             "renderscript scriptgroup breakpoint set <group_name>",
4421fed052SAidan Dodds             eCommandRequiresProcess | eCommandProcessMustBeLaunched) {}
4521fed052SAidan Dodds 
4621fed052SAidan Dodds   ~CommandObjectRenderScriptScriptGroupBreakpointSet() override = default;
4721fed052SAidan Dodds 
4821fed052SAidan Dodds   bool DoExecute(Args &command, CommandReturnObject &result) override {
4921fed052SAidan Dodds     Stream &stream = result.GetOutputStream();
5021fed052SAidan Dodds     RenderScriptRuntime *runtime = static_cast<RenderScriptRuntime *>(
5121fed052SAidan Dodds         m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(
5221fed052SAidan Dodds             eLanguageTypeExtRenderScript));
5321fed052SAidan Dodds     assert(runtime);
5421fed052SAidan Dodds     auto &target = m_exe_ctx.GetTargetSP();
5521fed052SAidan Dodds     bool stop_on_all = false;
5621fed052SAidan Dodds     const llvm::StringRef long_stop_all("--stop-on-all"), short_stop_all("-a");
5721fed052SAidan Dodds     std::vector<ConstString> sites;
5821fed052SAidan Dodds     sites.reserve(command.GetArgumentCount());
5921fed052SAidan Dodds     for (size_t i = 0; i < command.GetArgumentCount(); ++i) {
6021fed052SAidan Dodds       const auto arg = command.GetArgumentAtIndex(i);
6121fed052SAidan Dodds       if (long_stop_all == arg || short_stop_all == arg)
6221fed052SAidan Dodds         stop_on_all = true;
6321fed052SAidan Dodds       else
6421fed052SAidan Dodds         sites.push_back(ConstString(arg));
6521fed052SAidan Dodds     }
6621fed052SAidan Dodds     for (const auto &name : sites) {
6721fed052SAidan Dodds       runtime->PlaceBreakpointOnScriptGroup(target, stream, name, stop_on_all);
6821fed052SAidan Dodds     }
6921fed052SAidan Dodds     result.SetStatus(eReturnStatusSuccessFinishResult);
7021fed052SAidan Dodds     return true;
7121fed052SAidan Dodds   }
7221fed052SAidan Dodds };
7321fed052SAidan Dodds 
7421fed052SAidan Dodds class CommandObjectRenderScriptScriptGroupBreakpoint
7521fed052SAidan Dodds     : public CommandObjectMultiword {
7621fed052SAidan Dodds public:
7721fed052SAidan Dodds   CommandObjectRenderScriptScriptGroupBreakpoint(
7821fed052SAidan Dodds       CommandInterpreter &interpreter)
7921fed052SAidan Dodds       : CommandObjectMultiword(
8021fed052SAidan Dodds             interpreter, "renderscript scriptgroup breakpoint",
8121fed052SAidan Dodds             "Renderscript scriptgroup breakpoint interaction.",
8221fed052SAidan Dodds             "renderscript scriptgroup breakpoint set [--stop-on-all/-a]"
8321fed052SAidan Dodds             "<scriptgroup name> ...",
8421fed052SAidan Dodds             eCommandRequiresProcess | eCommandProcessMustBeLaunched) {
8521fed052SAidan Dodds     LoadSubCommand(
8621fed052SAidan Dodds         "set",
8721fed052SAidan Dodds         CommandObjectSP(new CommandObjectRenderScriptScriptGroupBreakpointSet(
8821fed052SAidan Dodds             interpreter)));
8921fed052SAidan Dodds   }
9021fed052SAidan Dodds 
9121fed052SAidan Dodds   ~CommandObjectRenderScriptScriptGroupBreakpoint() override = default;
9221fed052SAidan Dodds };
9321fed052SAidan Dodds 
9421fed052SAidan Dodds class CommandObjectRenderScriptScriptGroupList : public CommandObjectParsed {
9521fed052SAidan Dodds public:
9621fed052SAidan Dodds   CommandObjectRenderScriptScriptGroupList(CommandInterpreter &interpreter)
9721fed052SAidan Dodds       : CommandObjectParsed(interpreter, "renderscript scriptgroup list",
9821fed052SAidan Dodds                             "List all currently discovered script groups.",
9921fed052SAidan Dodds                             "renderscript scriptgroup list",
10021fed052SAidan Dodds                             eCommandRequiresProcess |
10121fed052SAidan Dodds                                 eCommandProcessMustBeLaunched) {}
10221fed052SAidan Dodds 
10321fed052SAidan Dodds   ~CommandObjectRenderScriptScriptGroupList() override = default;
10421fed052SAidan Dodds 
10521fed052SAidan Dodds   bool DoExecute(Args &command, CommandReturnObject &result) override {
10621fed052SAidan Dodds     Stream &stream = result.GetOutputStream();
10721fed052SAidan Dodds     RenderScriptRuntime *runtime = static_cast<RenderScriptRuntime *>(
10821fed052SAidan Dodds         m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(
10921fed052SAidan Dodds             eLanguageTypeExtRenderScript));
11021fed052SAidan Dodds     assert(runtime);
11121fed052SAidan Dodds     const RSScriptGroupList &groups = runtime->GetScriptGroups();
11221fed052SAidan Dodds     // print script group count
11321fed052SAidan Dodds     stream.Printf("%" PRIu64 " script %s", uint64_t(groups.size()),
11421fed052SAidan Dodds                   (groups.size() == 1) ? "group" : "groups");
11521fed052SAidan Dodds     stream.EOL();
11621fed052SAidan Dodds     // print script group details
11721fed052SAidan Dodds     stream.IndentMore();
11821fed052SAidan Dodds     for (const RSScriptGroupDescriptorSP &g : groups) {
11921fed052SAidan Dodds       if (g) {
12021fed052SAidan Dodds         stream.Indent();
12121fed052SAidan Dodds         // script group name
12221fed052SAidan Dodds         stream.Printf("%s", g->m_name.AsCString());
12321fed052SAidan Dodds         stream.EOL();
12421fed052SAidan Dodds         // print out the kernels
12521fed052SAidan Dodds         stream.IndentMore();
12621fed052SAidan Dodds         for (const auto &k : g->m_kernels) {
12721fed052SAidan Dodds           stream.Indent();
12821fed052SAidan Dodds           stream.Printf(". %s", k.m_name.AsCString());
12921fed052SAidan Dodds           stream.EOL();
13021fed052SAidan Dodds         }
13121fed052SAidan Dodds         stream.IndentLess();
13221fed052SAidan Dodds       }
13321fed052SAidan Dodds     }
13421fed052SAidan Dodds     stream.IndentLess();
13521fed052SAidan Dodds     result.SetStatus(eReturnStatusSuccessFinishResult);
13621fed052SAidan Dodds     return true;
13721fed052SAidan Dodds   }
13821fed052SAidan Dodds };
13921fed052SAidan Dodds 
14021fed052SAidan Dodds class CommandObjectRenderScriptScriptGroup : public CommandObjectMultiword {
14121fed052SAidan Dodds public:
14221fed052SAidan Dodds   CommandObjectRenderScriptScriptGroup(CommandInterpreter &interpreter)
14321fed052SAidan Dodds       : CommandObjectMultiword(interpreter, "renderscript scriptgroup",
14421fed052SAidan Dodds                                "Command set for interacting with scriptgroups.",
14521fed052SAidan Dodds                                nullptr, eCommandRequiresProcess |
14621fed052SAidan Dodds                                             eCommandProcessMustBeLaunched) {
14721fed052SAidan Dodds     LoadSubCommand(
14821fed052SAidan Dodds         "breakpoint",
14921fed052SAidan Dodds         CommandObjectSP(
15021fed052SAidan Dodds             new CommandObjectRenderScriptScriptGroupBreakpoint(interpreter)));
15121fed052SAidan Dodds     LoadSubCommand(
15221fed052SAidan Dodds         "list", CommandObjectSP(
15321fed052SAidan Dodds                     new CommandObjectRenderScriptScriptGroupList(interpreter)));
15421fed052SAidan Dodds   }
15521fed052SAidan Dodds 
15621fed052SAidan Dodds   ~CommandObjectRenderScriptScriptGroup() override = default;
15721fed052SAidan Dodds };
15821fed052SAidan Dodds 
15921fed052SAidan Dodds lldb::CommandObjectSP NewCommandObjectRenderScriptScriptGroup(
16021fed052SAidan Dodds     lldb_private::CommandInterpreter &interpreter) {
16121fed052SAidan Dodds   return CommandObjectSP(new CommandObjectRenderScriptScriptGroup(interpreter));
16221fed052SAidan Dodds }
163