180814287SRaphael Isemann //===-- RenderScriptScriptGroup.cpp ---------------------------------------===//
221fed052SAidan Dodds //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler 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:
CommandObjectRenderScriptScriptGroupBreakpointSet(CommandInterpreter & interpreter)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>",
42*c1b07d61SJim Ingham             eCommandRequiresProcess | eCommandProcessMustBeLaunched) {
43*c1b07d61SJim Ingham     CommandArgumentData name_arg{eArgTypeName, eArgRepeatPlus};
44*c1b07d61SJim Ingham     m_arguments.push_back({name_arg});
45*c1b07d61SJim Ingham   }
4621fed052SAidan Dodds 
4721fed052SAidan Dodds   ~CommandObjectRenderScriptScriptGroupBreakpointSet() override = default;
4821fed052SAidan Dodds 
DoExecute(Args & command,CommandReturnObject & result)4921fed052SAidan Dodds   bool DoExecute(Args &command, CommandReturnObject &result) override {
5021fed052SAidan Dodds     Stream &stream = result.GetOutputStream();
5121fed052SAidan Dodds     RenderScriptRuntime *runtime = static_cast<RenderScriptRuntime *>(
5221fed052SAidan Dodds         m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(
5321fed052SAidan Dodds             eLanguageTypeExtRenderScript));
5421fed052SAidan Dodds     assert(runtime);
5521fed052SAidan Dodds     auto &target = m_exe_ctx.GetTargetSP();
5621fed052SAidan Dodds     bool stop_on_all = false;
5721fed052SAidan Dodds     const llvm::StringRef long_stop_all("--stop-on-all"), short_stop_all("-a");
5821fed052SAidan Dodds     std::vector<ConstString> sites;
5921fed052SAidan Dodds     sites.reserve(command.GetArgumentCount());
6021fed052SAidan Dodds     for (size_t i = 0; i < command.GetArgumentCount(); ++i) {
6121fed052SAidan Dodds       const auto arg = command.GetArgumentAtIndex(i);
6221fed052SAidan Dodds       if (long_stop_all == arg || short_stop_all == arg)
6321fed052SAidan Dodds         stop_on_all = true;
6421fed052SAidan Dodds       else
6521fed052SAidan Dodds         sites.push_back(ConstString(arg));
6621fed052SAidan Dodds     }
6721fed052SAidan Dodds     for (const auto &name : sites) {
6821fed052SAidan Dodds       runtime->PlaceBreakpointOnScriptGroup(target, stream, name, stop_on_all);
6921fed052SAidan Dodds     }
7021fed052SAidan Dodds     result.SetStatus(eReturnStatusSuccessFinishResult);
7121fed052SAidan Dodds     return true;
7221fed052SAidan Dodds   }
7321fed052SAidan Dodds };
7421fed052SAidan Dodds 
7521fed052SAidan Dodds class CommandObjectRenderScriptScriptGroupBreakpoint
7621fed052SAidan Dodds     : public CommandObjectMultiword {
7721fed052SAidan Dodds public:
CommandObjectRenderScriptScriptGroupBreakpoint(CommandInterpreter & interpreter)7821fed052SAidan Dodds   CommandObjectRenderScriptScriptGroupBreakpoint(
7921fed052SAidan Dodds       CommandInterpreter &interpreter)
8021fed052SAidan Dodds       : CommandObjectMultiword(
8121fed052SAidan Dodds             interpreter, "renderscript scriptgroup breakpoint",
8221fed052SAidan Dodds             "Renderscript scriptgroup breakpoint interaction.",
8321fed052SAidan Dodds             "renderscript scriptgroup breakpoint set [--stop-on-all/-a]"
8421fed052SAidan Dodds             "<scriptgroup name> ...",
8521fed052SAidan Dodds             eCommandRequiresProcess | eCommandProcessMustBeLaunched) {
8621fed052SAidan Dodds     LoadSubCommand(
8721fed052SAidan Dodds         "set",
8821fed052SAidan Dodds         CommandObjectSP(new CommandObjectRenderScriptScriptGroupBreakpointSet(
8921fed052SAidan Dodds             interpreter)));
9021fed052SAidan Dodds   }
9121fed052SAidan Dodds 
9221fed052SAidan Dodds   ~CommandObjectRenderScriptScriptGroupBreakpoint() override = default;
9321fed052SAidan Dodds };
9421fed052SAidan Dodds 
9521fed052SAidan Dodds class CommandObjectRenderScriptScriptGroupList : public CommandObjectParsed {
9621fed052SAidan Dodds public:
CommandObjectRenderScriptScriptGroupList(CommandInterpreter & interpreter)9721fed052SAidan Dodds   CommandObjectRenderScriptScriptGroupList(CommandInterpreter &interpreter)
9821fed052SAidan Dodds       : CommandObjectParsed(interpreter, "renderscript scriptgroup list",
9921fed052SAidan Dodds                             "List all currently discovered script groups.",
10021fed052SAidan Dodds                             "renderscript scriptgroup list",
10121fed052SAidan Dodds                             eCommandRequiresProcess |
10221fed052SAidan Dodds                                 eCommandProcessMustBeLaunched) {}
10321fed052SAidan Dodds 
10421fed052SAidan Dodds   ~CommandObjectRenderScriptScriptGroupList() override = default;
10521fed052SAidan Dodds 
DoExecute(Args & command,CommandReturnObject & result)10621fed052SAidan Dodds   bool DoExecute(Args &command, CommandReturnObject &result) override {
10721fed052SAidan Dodds     Stream &stream = result.GetOutputStream();
10821fed052SAidan Dodds     RenderScriptRuntime *runtime = static_cast<RenderScriptRuntime *>(
10921fed052SAidan Dodds         m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(
11021fed052SAidan Dodds             eLanguageTypeExtRenderScript));
11121fed052SAidan Dodds     assert(runtime);
11221fed052SAidan Dodds     const RSScriptGroupList &groups = runtime->GetScriptGroups();
11321fed052SAidan Dodds     // print script group count
11421fed052SAidan Dodds     stream.Printf("%" PRIu64 " script %s", uint64_t(groups.size()),
11521fed052SAidan Dodds                   (groups.size() == 1) ? "group" : "groups");
11621fed052SAidan Dodds     stream.EOL();
11721fed052SAidan Dodds     // print script group details
11821fed052SAidan Dodds     stream.IndentMore();
11921fed052SAidan Dodds     for (const RSScriptGroupDescriptorSP &g : groups) {
12021fed052SAidan Dodds       if (g) {
12121fed052SAidan Dodds         stream.Indent();
12221fed052SAidan Dodds         // script group name
12321fed052SAidan Dodds         stream.Printf("%s", g->m_name.AsCString());
12421fed052SAidan Dodds         stream.EOL();
12521fed052SAidan Dodds         // print out the kernels
12621fed052SAidan Dodds         stream.IndentMore();
12721fed052SAidan Dodds         for (const auto &k : g->m_kernels) {
12821fed052SAidan Dodds           stream.Indent();
12921fed052SAidan Dodds           stream.Printf(". %s", k.m_name.AsCString());
13021fed052SAidan Dodds           stream.EOL();
13121fed052SAidan Dodds         }
13221fed052SAidan Dodds         stream.IndentLess();
13321fed052SAidan Dodds       }
13421fed052SAidan Dodds     }
13521fed052SAidan Dodds     stream.IndentLess();
13621fed052SAidan Dodds     result.SetStatus(eReturnStatusSuccessFinishResult);
13721fed052SAidan Dodds     return true;
13821fed052SAidan Dodds   }
13921fed052SAidan Dodds };
14021fed052SAidan Dodds 
14121fed052SAidan Dodds class CommandObjectRenderScriptScriptGroup : public CommandObjectMultiword {
14221fed052SAidan Dodds public:
CommandObjectRenderScriptScriptGroup(CommandInterpreter & interpreter)14321fed052SAidan Dodds   CommandObjectRenderScriptScriptGroup(CommandInterpreter &interpreter)
14421fed052SAidan Dodds       : CommandObjectMultiword(interpreter, "renderscript scriptgroup",
14521fed052SAidan Dodds                                "Command set for interacting with scriptgroups.",
14621fed052SAidan Dodds                                nullptr, eCommandRequiresProcess |
14721fed052SAidan Dodds                                             eCommandProcessMustBeLaunched) {
14821fed052SAidan Dodds     LoadSubCommand(
14921fed052SAidan Dodds         "breakpoint",
15021fed052SAidan Dodds         CommandObjectSP(
15121fed052SAidan Dodds             new CommandObjectRenderScriptScriptGroupBreakpoint(interpreter)));
15221fed052SAidan Dodds     LoadSubCommand(
15321fed052SAidan Dodds         "list", CommandObjectSP(
15421fed052SAidan Dodds                     new CommandObjectRenderScriptScriptGroupList(interpreter)));
15521fed052SAidan Dodds   }
15621fed052SAidan Dodds 
15721fed052SAidan Dodds   ~CommandObjectRenderScriptScriptGroup() override = default;
15821fed052SAidan Dodds };
15921fed052SAidan Dodds 
NewCommandObjectRenderScriptScriptGroup(lldb_private::CommandInterpreter & interpreter)16021fed052SAidan Dodds lldb::CommandObjectSP NewCommandObjectRenderScriptScriptGroup(
16121fed052SAidan Dodds     lldb_private::CommandInterpreter &interpreter) {
16221fed052SAidan Dodds   return CommandObjectSP(new CommandObjectRenderScriptScriptGroup(interpreter));
16321fed052SAidan Dodds }
164