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