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