15ec532a9SColin Riley //===-- RenderScriptRuntime.cpp ---------------------------------*- C++ -*-===//
25ec532a9SColin Riley //
35ec532a9SColin Riley //                     The LLVM Compiler Infrastructure
45ec532a9SColin Riley //
55ec532a9SColin Riley // This file is distributed under the University of Illinois Open Source
65ec532a9SColin Riley // License. See LICENSE.TXT for details.
75ec532a9SColin Riley //
85ec532a9SColin Riley //===----------------------------------------------------------------------===//
95ec532a9SColin Riley 
105ec532a9SColin Riley #include "RenderScriptRuntime.h"
115ec532a9SColin Riley 
125ec532a9SColin Riley #include "lldb/Core/ConstString.h"
135ec532a9SColin Riley #include "lldb/Core/Debugger.h"
145ec532a9SColin Riley #include "lldb/Core/Error.h"
155ec532a9SColin Riley #include "lldb/Core/Log.h"
165ec532a9SColin Riley #include "lldb/Core/PluginManager.h"
175ec532a9SColin Riley #include "lldb/Symbol/Symbol.h"
185ec532a9SColin Riley #include "lldb/Target/Process.h"
195ec532a9SColin Riley #include "lldb/Target/Target.h"
205ec532a9SColin Riley #include "lldb/Interpreter/Args.h"
215ec532a9SColin Riley #include "lldb/Interpreter/Options.h"
225ec532a9SColin Riley #include "lldb/Interpreter/CommandInterpreter.h"
235ec532a9SColin Riley #include "lldb/Interpreter/CommandReturnObject.h"
245ec532a9SColin Riley #include "lldb/Interpreter/CommandObjectMultiword.h"
255ec532a9SColin Riley 
265ec532a9SColin Riley using namespace lldb;
275ec532a9SColin Riley using namespace lldb_private;
285ec532a9SColin Riley 
295ec532a9SColin Riley //------------------------------------------------------------------
305ec532a9SColin Riley // Static Functions
315ec532a9SColin Riley //------------------------------------------------------------------
325ec532a9SColin Riley LanguageRuntime *
335ec532a9SColin Riley RenderScriptRuntime::CreateInstance(Process *process, lldb::LanguageType language)
345ec532a9SColin Riley {
355ec532a9SColin Riley 
365ec532a9SColin Riley     if (language == eLanguageTypeExtRenderScript)
375ec532a9SColin Riley         return new RenderScriptRuntime(process);
385ec532a9SColin Riley     else
395ec532a9SColin Riley         return NULL;
405ec532a9SColin Riley }
415ec532a9SColin Riley 
425ec532a9SColin Riley void
435ec532a9SColin Riley RenderScriptRuntime::Initialize()
445ec532a9SColin Riley {
455ec532a9SColin Riley     PluginManager::RegisterPlugin(GetPluginNameStatic(), "RenderScript language support", CreateInstance);
465ec532a9SColin Riley }
475ec532a9SColin Riley 
485ec532a9SColin Riley void
495ec532a9SColin Riley RenderScriptRuntime::Terminate()
505ec532a9SColin Riley {
515ec532a9SColin Riley     PluginManager::UnregisterPlugin(CreateInstance);
525ec532a9SColin Riley }
535ec532a9SColin Riley 
545ec532a9SColin Riley lldb_private::ConstString
555ec532a9SColin Riley RenderScriptRuntime::GetPluginNameStatic()
565ec532a9SColin Riley {
575ec532a9SColin Riley     static ConstString g_name("renderscript");
585ec532a9SColin Riley     return g_name;
595ec532a9SColin Riley }
605ec532a9SColin Riley 
61*ef20b08fSColin Riley RenderScriptRuntime::ModuleKind
62*ef20b08fSColin Riley RenderScriptRuntime::GetModuleKind(const lldb::ModuleSP &module_sp)
63*ef20b08fSColin Riley {
64*ef20b08fSColin Riley     if (module_sp)
65*ef20b08fSColin Riley     {
66*ef20b08fSColin Riley         // Is this a module containing renderscript kernels?
67*ef20b08fSColin Riley         const Symbol *info_sym = module_sp->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), eSymbolTypeData);
68*ef20b08fSColin Riley         if (info_sym)
69*ef20b08fSColin Riley         {
70*ef20b08fSColin Riley             return eModuleKindKernelObj;
71*ef20b08fSColin Riley         }
72*ef20b08fSColin Riley     }
73*ef20b08fSColin Riley     return eModuleKindIgnored;
74*ef20b08fSColin Riley }
75*ef20b08fSColin Riley 
76*ef20b08fSColin Riley bool
77*ef20b08fSColin Riley RenderScriptRuntime::IsRenderScriptModule(const lldb::ModuleSP &module_sp)
78*ef20b08fSColin Riley {
79*ef20b08fSColin Riley     return GetModuleKind(module_sp) != eModuleKindIgnored;
80*ef20b08fSColin Riley }
81*ef20b08fSColin Riley 
82*ef20b08fSColin Riley 
83*ef20b08fSColin Riley void
84*ef20b08fSColin Riley RenderScriptRuntime::ModulesDidLoad(const ModuleList &module_list )
85*ef20b08fSColin Riley {
86*ef20b08fSColin Riley     Mutex::Locker locker (module_list.GetMutex ());
87*ef20b08fSColin Riley 
88*ef20b08fSColin Riley     size_t num_modules = module_list.GetSize();
89*ef20b08fSColin Riley     for (size_t i = 0; i < num_modules; i++)
90*ef20b08fSColin Riley     {
91*ef20b08fSColin Riley         auto mod = module_list.GetModuleAtIndex (i);
92*ef20b08fSColin Riley         if (IsRenderScriptModule (mod))
93*ef20b08fSColin Riley         {
94*ef20b08fSColin Riley             LoadModule(mod);
95*ef20b08fSColin Riley         }
96*ef20b08fSColin Riley     }
97*ef20b08fSColin Riley }
98*ef20b08fSColin Riley 
99*ef20b08fSColin Riley 
1005ec532a9SColin Riley //------------------------------------------------------------------
1015ec532a9SColin Riley // PluginInterface protocol
1025ec532a9SColin Riley //------------------------------------------------------------------
1035ec532a9SColin Riley lldb_private::ConstString
1045ec532a9SColin Riley RenderScriptRuntime::GetPluginName()
1055ec532a9SColin Riley {
1065ec532a9SColin Riley     return GetPluginNameStatic();
1075ec532a9SColin Riley }
1085ec532a9SColin Riley 
1095ec532a9SColin Riley uint32_t
1105ec532a9SColin Riley RenderScriptRuntime::GetPluginVersion()
1115ec532a9SColin Riley {
1125ec532a9SColin Riley     return 1;
1135ec532a9SColin Riley }
1145ec532a9SColin Riley 
1155ec532a9SColin Riley bool
1165ec532a9SColin Riley RenderScriptRuntime::IsVTableName(const char *name)
1175ec532a9SColin Riley {
1185ec532a9SColin Riley     return false;
1195ec532a9SColin Riley }
1205ec532a9SColin Riley 
1215ec532a9SColin Riley bool
1225ec532a9SColin Riley RenderScriptRuntime::GetDynamicTypeAndAddress(ValueObject &in_value, lldb::DynamicValueType use_dynamic,
1235ec532a9SColin Riley                                               TypeAndOrName &class_type_or_name, Address &address)
1245ec532a9SColin Riley {
1255ec532a9SColin Riley     return false;
1265ec532a9SColin Riley }
1275ec532a9SColin Riley 
1285ec532a9SColin Riley bool
1295ec532a9SColin Riley RenderScriptRuntime::CouldHaveDynamicValue(ValueObject &in_value)
1305ec532a9SColin Riley {
1315ec532a9SColin Riley     return false;
1325ec532a9SColin Riley }
1335ec532a9SColin Riley 
1345ec532a9SColin Riley lldb::BreakpointResolverSP
1355ec532a9SColin Riley RenderScriptRuntime::CreateExceptionResolver(Breakpoint *bkpt, bool catch_bp, bool throw_bp)
1365ec532a9SColin Riley {
1375ec532a9SColin Riley     BreakpointResolverSP resolver_sp;
1385ec532a9SColin Riley     return resolver_sp;
1395ec532a9SColin Riley }
1405ec532a9SColin Riley 
1415ec532a9SColin Riley bool
1425ec532a9SColin Riley RenderScriptRuntime::LoadModule(const lldb::ModuleSP &module_sp)
1435ec532a9SColin Riley {
1445ec532a9SColin Riley     if (module_sp)
1455ec532a9SColin Riley     {
1465ec532a9SColin Riley         for (const auto &rs_module : m_rsmodules)
1475ec532a9SColin Riley         {
1485ec532a9SColin Riley             if (rs_module.m_module == module_sp)
1495ec532a9SColin Riley                 return false;
1505ec532a9SColin Riley         }
151*ef20b08fSColin Riley         bool module_loaded = false;
152*ef20b08fSColin Riley         switch (GetModuleKind(module_sp))
153*ef20b08fSColin Riley         {
154*ef20b08fSColin Riley             case eModuleKindKernelObj:
155*ef20b08fSColin Riley             {
1565ec532a9SColin Riley                 RSModuleDescriptor module_desc(module_sp);
1575ec532a9SColin Riley                 if (module_desc.ParseRSInfo())
1585ec532a9SColin Riley                 {
1595ec532a9SColin Riley                     m_rsmodules.push_back(module_desc);
160*ef20b08fSColin Riley                     module_loaded = true;
1615ec532a9SColin Riley                 }
162*ef20b08fSColin Riley                 break;
163*ef20b08fSColin Riley             }
164*ef20b08fSColin Riley             case eModuleKindDriver:
165*ef20b08fSColin Riley             case eModuleKindImpl:
166*ef20b08fSColin Riley             case eModuleKindLibRS:
167*ef20b08fSColin Riley             default:
168*ef20b08fSColin Riley                 break;
169*ef20b08fSColin Riley         }
170*ef20b08fSColin Riley         if (module_loaded)
171*ef20b08fSColin Riley             Update();
172*ef20b08fSColin Riley         return module_loaded;
1735ec532a9SColin Riley     }
1745ec532a9SColin Riley     return false;
1755ec532a9SColin Riley }
1765ec532a9SColin Riley 
177*ef20b08fSColin Riley void
178*ef20b08fSColin Riley RenderScriptRuntime::Update()
179*ef20b08fSColin Riley {
180*ef20b08fSColin Riley     if (m_rsmodules.size() > 0)
181*ef20b08fSColin Riley     {
182*ef20b08fSColin Riley         if (!m_initiated)
183*ef20b08fSColin Riley         {
184*ef20b08fSColin Riley             Initiate();
185*ef20b08fSColin Riley         }
186*ef20b08fSColin Riley     }
187*ef20b08fSColin Riley }
188*ef20b08fSColin Riley 
189*ef20b08fSColin Riley 
1905ec532a9SColin Riley // The maximum line length of an .rs.info packet
1915ec532a9SColin Riley #define MAXLINE 500
1925ec532a9SColin Riley 
1935ec532a9SColin Riley // The .rs.info symbol in renderscript modules contains a string which needs to be parsed.
1945ec532a9SColin Riley // The string is basic and is parsed on a line by line basis.
1955ec532a9SColin Riley bool
1965ec532a9SColin Riley RSModuleDescriptor::ParseRSInfo()
1975ec532a9SColin Riley {
1985ec532a9SColin Riley     const Symbol *info_sym = m_module->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), eSymbolTypeData);
1995ec532a9SColin Riley     if (info_sym)
2005ec532a9SColin Riley     {
2015ec532a9SColin Riley         const addr_t addr = info_sym->GetAddress().GetFileAddress();
2025ec532a9SColin Riley         const addr_t size = info_sym->GetByteSize();
2035ec532a9SColin Riley         const FileSpec fs = m_module->GetFileSpec();
2045ec532a9SColin Riley 
2055ec532a9SColin Riley         DataBufferSP buffer = fs.ReadFileContents(addr, size);
2065ec532a9SColin Riley 
2075ec532a9SColin Riley         if (!buffer)
2085ec532a9SColin Riley             return false;
2095ec532a9SColin Riley 
2105ec532a9SColin Riley         std::string info((const char *)buffer->GetBytes());
2115ec532a9SColin Riley 
2125ec532a9SColin Riley         std::vector<std::string> info_lines;
2135ec532a9SColin Riley         size_t lpos = info.find_first_of("\n");
2145ec532a9SColin Riley         while (lpos != std::string::npos)
2155ec532a9SColin Riley         {
2165ec532a9SColin Riley             info_lines.push_back(info.substr(0, lpos));
2175ec532a9SColin Riley             info = info.substr(lpos + 1);
2185ec532a9SColin Riley             lpos = info.find_first_of("\n");
2195ec532a9SColin Riley         }
2205ec532a9SColin Riley         size_t offset = 0;
2215ec532a9SColin Riley         while (offset < info_lines.size())
2225ec532a9SColin Riley         {
2235ec532a9SColin Riley             std::string line = info_lines[offset];
2245ec532a9SColin Riley             // Parse directives
2255ec532a9SColin Riley             uint32_t numDefns = 0;
2265ec532a9SColin Riley             if (sscanf(line.c_str(), "exportVarCount: %u", &numDefns) == 1)
2275ec532a9SColin Riley             {
2285ec532a9SColin Riley                 while (numDefns--)
2295ec532a9SColin Riley                     m_globals.push_back(RSGlobalDescriptor(*this, info_lines[++offset].c_str()));
2305ec532a9SColin Riley             }
2315ec532a9SColin Riley             else if (sscanf(line.c_str(), "exportFuncCount: %u", &numDefns) == 1)
2325ec532a9SColin Riley             {
2335ec532a9SColin Riley             }
2345ec532a9SColin Riley             else if (sscanf(line.c_str(), "exportForEachCount: %u", &numDefns) == 1)
2355ec532a9SColin Riley             {
2365ec532a9SColin Riley                 char name[MAXLINE];
2375ec532a9SColin Riley                 while (numDefns--)
2385ec532a9SColin Riley                 {
2395ec532a9SColin Riley                     uint32_t slot = 0;
2405ec532a9SColin Riley                     name[0] = '\0';
2415ec532a9SColin Riley                     if (sscanf(info_lines[++offset].c_str(), "%u - %s", &slot, &name[0]) == 2)
2425ec532a9SColin Riley                     {
2435ec532a9SColin Riley                         m_kernels.push_back(RSKernelDescriptor(*this, name, slot));
2445ec532a9SColin Riley                     }
2455ec532a9SColin Riley                 }
2465ec532a9SColin Riley             }
2475ec532a9SColin Riley             else if (sscanf(line.c_str(), "objectSlotCount: %u", &numDefns) == 1)
2485ec532a9SColin Riley             {
2495ec532a9SColin Riley             }
2505ec532a9SColin Riley 
2515ec532a9SColin Riley             offset++;
2525ec532a9SColin Riley         }
2535ec532a9SColin Riley         return m_kernels.size() > 0;
2545ec532a9SColin Riley     }
2555ec532a9SColin Riley     return false;
2565ec532a9SColin Riley }
2575ec532a9SColin Riley 
2585ec532a9SColin Riley bool
2595ec532a9SColin Riley RenderScriptRuntime::ProbeModules(const ModuleList module_list)
2605ec532a9SColin Riley {
2615ec532a9SColin Riley     bool rs_found = false;
2625ec532a9SColin Riley     size_t num_modules = module_list.GetSize();
2635ec532a9SColin Riley     for (size_t i = 0; i < num_modules; i++)
2645ec532a9SColin Riley     {
2655ec532a9SColin Riley         auto module = module_list.GetModuleAtIndex(i);
2665ec532a9SColin Riley         rs_found |= LoadModule(module);
2675ec532a9SColin Riley     }
2685ec532a9SColin Riley     return rs_found;
2695ec532a9SColin Riley }
2705ec532a9SColin Riley 
2715ec532a9SColin Riley void
2725ec532a9SColin Riley RenderScriptRuntime::DumpModules(Stream &strm) const
2735ec532a9SColin Riley {
2745ec532a9SColin Riley     strm.Printf("RenderScript Modules:");
2755ec532a9SColin Riley     strm.EOL();
2765ec532a9SColin Riley     strm.IndentMore();
2775ec532a9SColin Riley     for (const auto &module : m_rsmodules)
2785ec532a9SColin Riley     {
2795ec532a9SColin Riley         module.Dump(strm);
2805ec532a9SColin Riley     }
2815ec532a9SColin Riley     strm.IndentLess();
2825ec532a9SColin Riley }
2835ec532a9SColin Riley 
2845ec532a9SColin Riley void
2855ec532a9SColin Riley RSModuleDescriptor::Dump(Stream &strm) const
2865ec532a9SColin Riley {
2875ec532a9SColin Riley     strm.Indent();
2885ec532a9SColin Riley     m_module->GetFileSpec().Dump(&strm);
2895ec532a9SColin Riley     strm.EOL();
2905ec532a9SColin Riley     strm.IndentMore();
2915ec532a9SColin Riley     strm.Indent();
292189598edSColin Riley     strm.Printf("Globals: %" PRIu64, static_cast<uint64_t>(m_globals.size()));
2935ec532a9SColin Riley     strm.EOL();
2945ec532a9SColin Riley     strm.IndentMore();
2955ec532a9SColin Riley     for (const auto &global : m_globals)
2965ec532a9SColin Riley     {
2975ec532a9SColin Riley         global.Dump(strm);
2985ec532a9SColin Riley     }
2995ec532a9SColin Riley     strm.IndentLess();
3005ec532a9SColin Riley     strm.Indent();
301189598edSColin Riley     strm.Printf("Kernels: %" PRIu64, static_cast<uint64_t>(m_kernels.size()));
3025ec532a9SColin Riley     strm.EOL();
3035ec532a9SColin Riley     strm.IndentMore();
3045ec532a9SColin Riley     for (const auto &kernel : m_kernels)
3055ec532a9SColin Riley     {
3065ec532a9SColin Riley         kernel.Dump(strm);
3075ec532a9SColin Riley     }
3085ec532a9SColin Riley     strm.IndentLess(4);
3095ec532a9SColin Riley }
3105ec532a9SColin Riley 
3115ec532a9SColin Riley void
3125ec532a9SColin Riley RSGlobalDescriptor::Dump(Stream &strm) const
3135ec532a9SColin Riley {
3145ec532a9SColin Riley     strm.Indent(m_name.AsCString());
3155ec532a9SColin Riley     strm.EOL();
3165ec532a9SColin Riley }
3175ec532a9SColin Riley 
3185ec532a9SColin Riley void
3195ec532a9SColin Riley RSKernelDescriptor::Dump(Stream &strm) const
3205ec532a9SColin Riley {
3215ec532a9SColin Riley     strm.Indent(m_name.AsCString());
3225ec532a9SColin Riley     strm.EOL();
3235ec532a9SColin Riley }
3245ec532a9SColin Riley 
3255ec532a9SColin Riley class CommandObjectRenderScriptRuntimeModuleProbe : public CommandObjectParsed
3265ec532a9SColin Riley {
3275ec532a9SColin Riley   private:
3285ec532a9SColin Riley   public:
3295ec532a9SColin Riley     CommandObjectRenderScriptRuntimeModuleProbe(CommandInterpreter &interpreter)
3305ec532a9SColin Riley         : CommandObjectParsed(interpreter, "renderscript module probe",
3315ec532a9SColin Riley                               "Initiates a Probe of all loaded modules for kernels and other renderscript objects.",
3325ec532a9SColin Riley                               "renderscript module probe",
3335ec532a9SColin Riley                               eFlagRequiresTarget | eFlagRequiresProcess | eFlagProcessMustBeLaunched)
3345ec532a9SColin Riley     {
3355ec532a9SColin Riley     }
3365ec532a9SColin Riley 
3375ec532a9SColin Riley     ~CommandObjectRenderScriptRuntimeModuleProbe() {}
3385ec532a9SColin Riley 
3395ec532a9SColin Riley     bool
3405ec532a9SColin Riley     DoExecute(Args &command, CommandReturnObject &result)
3415ec532a9SColin Riley     {
3425ec532a9SColin Riley         const size_t argc = command.GetArgumentCount();
3435ec532a9SColin Riley         if (argc == 0)
3445ec532a9SColin Riley         {
3455ec532a9SColin Riley             Target *target = m_exe_ctx.GetTargetPtr();
3465ec532a9SColin Riley             RenderScriptRuntime *runtime =
3475ec532a9SColin Riley                 (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
3485ec532a9SColin Riley             auto module_list = target->GetImages();
3495ec532a9SColin Riley             bool new_rs_details = runtime->ProbeModules(module_list);
3505ec532a9SColin Riley             if (new_rs_details)
3515ec532a9SColin Riley             {
3525ec532a9SColin Riley                 result.AppendMessage("New renderscript modules added to runtime model.");
3535ec532a9SColin Riley             }
3545ec532a9SColin Riley             result.SetStatus(eReturnStatusSuccessFinishResult);
3555ec532a9SColin Riley             return true;
3565ec532a9SColin Riley         }
3575ec532a9SColin Riley 
3585ec532a9SColin Riley         result.AppendErrorWithFormat("'%s' takes no arguments", m_cmd_name.c_str());
3595ec532a9SColin Riley         result.SetStatus(eReturnStatusFailed);
3605ec532a9SColin Riley         return false;
3615ec532a9SColin Riley     }
3625ec532a9SColin Riley };
3635ec532a9SColin Riley 
3645ec532a9SColin Riley class CommandObjectRenderScriptRuntimeModuleDump : public CommandObjectParsed
3655ec532a9SColin Riley {
3665ec532a9SColin Riley   private:
3675ec532a9SColin Riley   public:
3685ec532a9SColin Riley     CommandObjectRenderScriptRuntimeModuleDump(CommandInterpreter &interpreter)
3695ec532a9SColin Riley         : CommandObjectParsed(interpreter, "renderscript module dump",
3705ec532a9SColin Riley                               "Dumps renderscript specific information for all modules.", "renderscript module dump",
3715ec532a9SColin Riley                               eFlagRequiresProcess | eFlagProcessMustBeLaunched)
3725ec532a9SColin Riley     {
3735ec532a9SColin Riley     }
3745ec532a9SColin Riley 
3755ec532a9SColin Riley     ~CommandObjectRenderScriptRuntimeModuleDump() {}
3765ec532a9SColin Riley 
3775ec532a9SColin Riley     bool
3785ec532a9SColin Riley     DoExecute(Args &command, CommandReturnObject &result)
3795ec532a9SColin Riley     {
3805ec532a9SColin Riley         RenderScriptRuntime *runtime =
3815ec532a9SColin Riley             (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
3825ec532a9SColin Riley         runtime->DumpModules(result.GetOutputStream());
3835ec532a9SColin Riley         result.SetStatus(eReturnStatusSuccessFinishResult);
3845ec532a9SColin Riley         return true;
3855ec532a9SColin Riley     }
3865ec532a9SColin Riley };
3875ec532a9SColin Riley 
3885ec532a9SColin Riley class CommandObjectRenderScriptRuntimeModule : public CommandObjectMultiword
3895ec532a9SColin Riley {
3905ec532a9SColin Riley   private:
3915ec532a9SColin Riley   public:
3925ec532a9SColin Riley     CommandObjectRenderScriptRuntimeModule(CommandInterpreter &interpreter)
3935ec532a9SColin Riley         : CommandObjectMultiword(interpreter, "renderscript module", "Commands that deal with renderscript modules.",
3945ec532a9SColin Riley                                  NULL)
3955ec532a9SColin Riley     {
3965ec532a9SColin Riley         LoadSubCommand("probe", CommandObjectSP(new CommandObjectRenderScriptRuntimeModuleProbe(interpreter)));
3975ec532a9SColin Riley         LoadSubCommand("dump", CommandObjectSP(new CommandObjectRenderScriptRuntimeModuleDump(interpreter)));
3985ec532a9SColin Riley     }
3995ec532a9SColin Riley 
4005ec532a9SColin Riley     ~CommandObjectRenderScriptRuntimeModule() {}
4015ec532a9SColin Riley };
4025ec532a9SColin Riley 
4035ec532a9SColin Riley class CommandObjectRenderScriptRuntime : public CommandObjectMultiword
4045ec532a9SColin Riley {
4055ec532a9SColin Riley   public:
4065ec532a9SColin Riley     CommandObjectRenderScriptRuntime(CommandInterpreter &interpreter)
4075ec532a9SColin Riley         : CommandObjectMultiword(interpreter, "renderscript", "A set of commands for operating on renderscript.",
4085ec532a9SColin Riley                                  "renderscript <subcommand> [<subcommand-options>]")
4095ec532a9SColin Riley     {
4105ec532a9SColin Riley         LoadSubCommand("module", CommandObjectSP(new CommandObjectRenderScriptRuntimeModule(interpreter)));
4115ec532a9SColin Riley     }
4125ec532a9SColin Riley 
4135ec532a9SColin Riley     ~CommandObjectRenderScriptRuntime() {}
4145ec532a9SColin Riley };
415*ef20b08fSColin Riley 
416*ef20b08fSColin Riley void
417*ef20b08fSColin Riley RenderScriptRuntime::Initiate()
4185ec532a9SColin Riley {
419*ef20b08fSColin Riley     assert(!m_initiated);
420*ef20b08fSColin Riley     Process* process = GetProcess();
4215ec532a9SColin Riley     if (process)
4225ec532a9SColin Riley     {
4235ec532a9SColin Riley         CommandInterpreter &interpreter = process->GetTarget().GetDebugger().GetCommandInterpreter();
424*ef20b08fSColin Riley         m_initiated = interpreter.AddCommand("renderscript", CommandObjectSP(
425*ef20b08fSColin Riley                                            new CommandObjectRenderScriptRuntime(interpreter)), true);
4265ec532a9SColin Riley     }
4275ec532a9SColin Riley }
428*ef20b08fSColin Riley 
429*ef20b08fSColin Riley RenderScriptRuntime::RenderScriptRuntime(Process *process)
430*ef20b08fSColin Riley     : lldb_private::CPPLanguageRuntime(process), m_initiated(false)
431*ef20b08fSColin Riley {
432*ef20b08fSColin Riley 
433*ef20b08fSColin Riley }
434