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