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