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"
18*4640cde1SColin Riley #include "lldb/Symbol/Type.h"
195ec532a9SColin Riley #include "lldb/Target/Process.h"
205ec532a9SColin Riley #include "lldb/Target/Target.h"
215ec532a9SColin Riley #include "lldb/Interpreter/Args.h"
225ec532a9SColin Riley #include "lldb/Interpreter/Options.h"
235ec532a9SColin Riley #include "lldb/Interpreter/CommandInterpreter.h"
245ec532a9SColin Riley #include "lldb/Interpreter/CommandReturnObject.h"
255ec532a9SColin Riley #include "lldb/Interpreter/CommandObjectMultiword.h"
26*4640cde1SColin Riley #include "lldb/Breakpoint/StoppointCallbackContext.h"
27*4640cde1SColin Riley #include "lldb/Target/RegisterContext.h"
28*4640cde1SColin Riley 
29*4640cde1SColin Riley #include "lldb/Symbol/VariableList.h"
305ec532a9SColin Riley 
315ec532a9SColin Riley using namespace lldb;
325ec532a9SColin Riley using namespace lldb_private;
335ec532a9SColin Riley 
345ec532a9SColin Riley //------------------------------------------------------------------
355ec532a9SColin Riley // Static Functions
365ec532a9SColin Riley //------------------------------------------------------------------
375ec532a9SColin Riley LanguageRuntime *
385ec532a9SColin Riley RenderScriptRuntime::CreateInstance(Process *process, lldb::LanguageType language)
395ec532a9SColin Riley {
405ec532a9SColin Riley 
415ec532a9SColin Riley     if (language == eLanguageTypeExtRenderScript)
425ec532a9SColin Riley         return new RenderScriptRuntime(process);
435ec532a9SColin Riley     else
445ec532a9SColin Riley         return NULL;
455ec532a9SColin Riley }
465ec532a9SColin Riley 
475ec532a9SColin Riley void
485ec532a9SColin Riley RenderScriptRuntime::Initialize()
495ec532a9SColin Riley {
50*4640cde1SColin Riley     PluginManager::RegisterPlugin(GetPluginNameStatic(), "RenderScript language support", CreateInstance, GetCommandObject);
515ec532a9SColin Riley }
525ec532a9SColin Riley 
535ec532a9SColin Riley void
545ec532a9SColin Riley RenderScriptRuntime::Terminate()
555ec532a9SColin Riley {
565ec532a9SColin Riley     PluginManager::UnregisterPlugin(CreateInstance);
575ec532a9SColin Riley }
585ec532a9SColin Riley 
595ec532a9SColin Riley lldb_private::ConstString
605ec532a9SColin Riley RenderScriptRuntime::GetPluginNameStatic()
615ec532a9SColin Riley {
625ec532a9SColin Riley     static ConstString g_name("renderscript");
635ec532a9SColin Riley     return g_name;
645ec532a9SColin Riley }
655ec532a9SColin Riley 
66ef20b08fSColin Riley RenderScriptRuntime::ModuleKind
67ef20b08fSColin Riley RenderScriptRuntime::GetModuleKind(const lldb::ModuleSP &module_sp)
68ef20b08fSColin Riley {
69ef20b08fSColin Riley     if (module_sp)
70ef20b08fSColin Riley     {
71ef20b08fSColin Riley         // Is this a module containing renderscript kernels?
72ef20b08fSColin Riley         const Symbol *info_sym = module_sp->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), eSymbolTypeData);
73ef20b08fSColin Riley         if (info_sym)
74ef20b08fSColin Riley         {
75ef20b08fSColin Riley             return eModuleKindKernelObj;
76ef20b08fSColin Riley         }
77*4640cde1SColin Riley 
78*4640cde1SColin Riley         // Is this the main RS runtime library
79*4640cde1SColin Riley         const ConstString rs_lib("libRS.so");
80*4640cde1SColin Riley         if (module_sp->GetFileSpec().GetFilename() == rs_lib)
81*4640cde1SColin Riley         {
82*4640cde1SColin Riley             return eModuleKindLibRS;
83*4640cde1SColin Riley         }
84*4640cde1SColin Riley 
85*4640cde1SColin Riley         const ConstString rs_driverlib("libRSDriver.so");
86*4640cde1SColin Riley         if (module_sp->GetFileSpec().GetFilename() == rs_driverlib)
87*4640cde1SColin Riley         {
88*4640cde1SColin Riley             return eModuleKindDriver;
89*4640cde1SColin Riley         }
90*4640cde1SColin Riley 
91*4640cde1SColin Riley         const ConstString rs_cpureflib("libRSCPURef.so");
92*4640cde1SColin Riley         if (module_sp->GetFileSpec().GetFilename() == rs_cpureflib)
93*4640cde1SColin Riley         {
94*4640cde1SColin Riley             return eModuleKindImpl;
95*4640cde1SColin Riley         }
96*4640cde1SColin Riley 
97ef20b08fSColin Riley     }
98ef20b08fSColin Riley     return eModuleKindIgnored;
99ef20b08fSColin Riley }
100ef20b08fSColin Riley 
101ef20b08fSColin Riley bool
102ef20b08fSColin Riley RenderScriptRuntime::IsRenderScriptModule(const lldb::ModuleSP &module_sp)
103ef20b08fSColin Riley {
104ef20b08fSColin Riley     return GetModuleKind(module_sp) != eModuleKindIgnored;
105ef20b08fSColin Riley }
106ef20b08fSColin Riley 
107ef20b08fSColin Riley 
108ef20b08fSColin Riley void
109ef20b08fSColin Riley RenderScriptRuntime::ModulesDidLoad(const ModuleList &module_list )
110ef20b08fSColin Riley {
111ef20b08fSColin Riley     Mutex::Locker locker (module_list.GetMutex ());
112ef20b08fSColin Riley 
113ef20b08fSColin Riley     size_t num_modules = module_list.GetSize();
114ef20b08fSColin Riley     for (size_t i = 0; i < num_modules; i++)
115ef20b08fSColin Riley     {
116ef20b08fSColin Riley         auto mod = module_list.GetModuleAtIndex (i);
117ef20b08fSColin Riley         if (IsRenderScriptModule (mod))
118ef20b08fSColin Riley         {
119ef20b08fSColin Riley             LoadModule(mod);
120ef20b08fSColin Riley         }
121ef20b08fSColin Riley     }
122ef20b08fSColin Riley }
123ef20b08fSColin Riley 
124ef20b08fSColin Riley 
1255ec532a9SColin Riley //------------------------------------------------------------------
1265ec532a9SColin Riley // PluginInterface protocol
1275ec532a9SColin Riley //------------------------------------------------------------------
1285ec532a9SColin Riley lldb_private::ConstString
1295ec532a9SColin Riley RenderScriptRuntime::GetPluginName()
1305ec532a9SColin Riley {
1315ec532a9SColin Riley     return GetPluginNameStatic();
1325ec532a9SColin Riley }
1335ec532a9SColin Riley 
1345ec532a9SColin Riley uint32_t
1355ec532a9SColin Riley RenderScriptRuntime::GetPluginVersion()
1365ec532a9SColin Riley {
1375ec532a9SColin Riley     return 1;
1385ec532a9SColin Riley }
1395ec532a9SColin Riley 
1405ec532a9SColin Riley bool
1415ec532a9SColin Riley RenderScriptRuntime::IsVTableName(const char *name)
1425ec532a9SColin Riley {
1435ec532a9SColin Riley     return false;
1445ec532a9SColin Riley }
1455ec532a9SColin Riley 
1465ec532a9SColin Riley bool
1475ec532a9SColin Riley RenderScriptRuntime::GetDynamicTypeAndAddress(ValueObject &in_value, lldb::DynamicValueType use_dynamic,
1485ec532a9SColin Riley                                               TypeAndOrName &class_type_or_name, Address &address)
1495ec532a9SColin Riley {
1505ec532a9SColin Riley     return false;
1515ec532a9SColin Riley }
1525ec532a9SColin Riley 
1535ec532a9SColin Riley bool
1545ec532a9SColin Riley RenderScriptRuntime::CouldHaveDynamicValue(ValueObject &in_value)
1555ec532a9SColin Riley {
1565ec532a9SColin Riley     return false;
1575ec532a9SColin Riley }
1585ec532a9SColin Riley 
1595ec532a9SColin Riley lldb::BreakpointResolverSP
1605ec532a9SColin Riley RenderScriptRuntime::CreateExceptionResolver(Breakpoint *bkpt, bool catch_bp, bool throw_bp)
1615ec532a9SColin Riley {
1625ec532a9SColin Riley     BreakpointResolverSP resolver_sp;
1635ec532a9SColin Riley     return resolver_sp;
1645ec532a9SColin Riley }
1655ec532a9SColin Riley 
166*4640cde1SColin Riley 
167*4640cde1SColin Riley const RenderScriptRuntime::HookDefn RenderScriptRuntime::s_runtimeHookDefns[] =
168*4640cde1SColin Riley {
169*4640cde1SColin Riley     //rsdScript
170*4640cde1SColin Riley     {"rsdScriptInit", "_Z13rsdScriptInitPKN7android12renderscript7ContextEPNS0_7ScriptCEPKcS7_PKhjj", 0, RenderScriptRuntime::eModuleKindDriver, &lldb_private::RenderScriptRuntime::CaptureScriptInit1},
171*4640cde1SColin Riley     {"rsdScriptInvokeForEach", "_Z22rsdScriptInvokeForEachPKN7android12renderscript7ContextEPNS0_6ScriptEjPKNS0_10AllocationEPS6_PKvjPK12RsScriptCall", 0, RenderScriptRuntime::eModuleKindDriver, nullptr},
172*4640cde1SColin Riley     {"rsdScriptInvokeForEachMulti", "_Z27rsdScriptInvokeForEachMultiPKN7android12renderscript7ContextEPNS0_6ScriptEjPPKNS0_10AllocationEjPS6_PKvjPK12RsScriptCall", 0, RenderScriptRuntime::eModuleKindDriver, nullptr},
173*4640cde1SColin Riley     {"rsdScriptInvokeFunction", "_Z23rsdScriptInvokeFunctionPKN7android12renderscript7ContextEPNS0_6ScriptEjPKvj", 0, RenderScriptRuntime::eModuleKindDriver, nullptr},
174*4640cde1SColin Riley     {"rsdScriptSetGlobalVar", "_Z21rsdScriptSetGlobalVarPKN7android12renderscript7ContextEPKNS0_6ScriptEjPvj", 0, RenderScriptRuntime::eModuleKindDriver, &lldb_private::RenderScriptRuntime::CaptureSetGlobalVar1},
175*4640cde1SColin Riley 
176*4640cde1SColin Riley     //rsdAllocation
177*4640cde1SColin Riley     {"rsdAllocationInit", "_Z17rsdAllocationInitPKN7android12renderscript7ContextEPNS0_10AllocationEb", 0, RenderScriptRuntime::eModuleKindDriver, &lldb_private::RenderScriptRuntime::CaptureAllocationInit1},
178*4640cde1SColin Riley     {"rsdAllocationRead2D", "_Z19rsdAllocationRead2DPKN7android12renderscript7ContextEPKNS0_10AllocationEjjj23RsAllocationCubemapFacejjPvjj", 0, RenderScriptRuntime::eModuleKindDriver, nullptr},
179*4640cde1SColin Riley };
180*4640cde1SColin Riley const size_t RenderScriptRuntime::s_runtimeHookCount = sizeof(s_runtimeHookDefns)/sizeof(s_runtimeHookDefns[0]);
181*4640cde1SColin Riley 
182*4640cde1SColin Riley 
183*4640cde1SColin Riley bool
184*4640cde1SColin Riley RenderScriptRuntime::HookCallback(void *baton, StoppointCallbackContext *ctx, lldb::user_id_t break_id, lldb::user_id_t break_loc_id)
185*4640cde1SColin Riley {
186*4640cde1SColin Riley     RuntimeHook* hook_info = (RuntimeHook*)baton;
187*4640cde1SColin Riley     ExecutionContext context(ctx->exe_ctx_ref);
188*4640cde1SColin Riley 
189*4640cde1SColin Riley     RenderScriptRuntime *lang_rt = (RenderScriptRuntime *)context.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
190*4640cde1SColin Riley 
191*4640cde1SColin Riley     lang_rt->HookCallback(hook_info, context);
192*4640cde1SColin Riley 
193*4640cde1SColin Riley     return false;
194*4640cde1SColin Riley }
195*4640cde1SColin Riley 
196*4640cde1SColin Riley 
197*4640cde1SColin Riley void
198*4640cde1SColin Riley RenderScriptRuntime::HookCallback(RuntimeHook* hook_info, ExecutionContext& context)
199*4640cde1SColin Riley {
200*4640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
201*4640cde1SColin Riley 
202*4640cde1SColin Riley     if(log)
203*4640cde1SColin Riley         log->Printf ("RenderScriptRuntime::HookCallback - '%s' .", hook_info->defn->name);
204*4640cde1SColin Riley 
205*4640cde1SColin Riley     if (hook_info->defn->grabber)
206*4640cde1SColin Riley     {
207*4640cde1SColin Riley         (this->*(hook_info->defn->grabber))(hook_info, context);
208*4640cde1SColin Riley     }
209*4640cde1SColin Riley }
210*4640cde1SColin Riley 
211*4640cde1SColin Riley 
212*4640cde1SColin Riley bool
213*4640cde1SColin Riley RenderScriptRuntime::GetArg32Simple(ExecutionContext& context, uint32_t arg, uint32_t *data)
214*4640cde1SColin Riley {
215*4640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
216*4640cde1SColin Riley 
217*4640cde1SColin Riley     if (!data)
218*4640cde1SColin Riley         return false;
219*4640cde1SColin Riley 
220*4640cde1SColin Riley     Error error;
221*4640cde1SColin Riley     RegisterContext* reg_ctx = context.GetRegisterContext();
222*4640cde1SColin Riley     Process* process = context.GetProcessPtr();
223*4640cde1SColin Riley 
224*4640cde1SColin Riley     if (context.GetTargetPtr()->GetArchitecture().GetMachine() == llvm::Triple::ArchType::x86)
225*4640cde1SColin Riley     {
226*4640cde1SColin Riley         uint64_t sp = reg_ctx->GetSP();
227*4640cde1SColin Riley         {
228*4640cde1SColin Riley             uint32_t offset = (1 + arg) * sizeof(uint32_t);
229*4640cde1SColin Riley             process->ReadMemory(sp + offset, data, sizeof(uint32_t), error);
230*4640cde1SColin Riley             if(error.Fail())
231*4640cde1SColin Riley             {
232*4640cde1SColin Riley                 if(log)
233*4640cde1SColin Riley                     log->Printf ("RenderScriptRuntime:: GetArg32Simple - error reading X86 stack: %s.", error.AsCString());
234*4640cde1SColin Riley             }
235*4640cde1SColin Riley         }
236*4640cde1SColin Riley     }
237*4640cde1SColin Riley     else if (context.GetTargetPtr()->GetArchitecture().GetMachine() == llvm::Triple::ArchType::arm)
238*4640cde1SColin Riley     {
239*4640cde1SColin Riley         if (arg < 4)
240*4640cde1SColin Riley         {
241*4640cde1SColin Riley             const RegisterInfo* rArg = reg_ctx->GetRegisterInfoAtIndex(arg);
242*4640cde1SColin Riley             RegisterValue rVal;
243*4640cde1SColin Riley             reg_ctx->ReadRegister(rArg, rVal);
244*4640cde1SColin Riley             (*data) = rVal.GetAsUInt32();
245*4640cde1SColin Riley         }
246*4640cde1SColin Riley         else
247*4640cde1SColin Riley         {
248*4640cde1SColin Riley             uint64_t sp = reg_ctx->GetSP();
249*4640cde1SColin Riley             {
250*4640cde1SColin Riley                 uint32_t offset = (arg-4) * sizeof(uint32_t);
251*4640cde1SColin Riley                 process->ReadMemory(sp + offset, &data, sizeof(uint32_t), error);
252*4640cde1SColin Riley                 if(error.Fail())
253*4640cde1SColin Riley                 {
254*4640cde1SColin Riley                     if(log)
255*4640cde1SColin Riley                         log->Printf ("RenderScriptRuntime:: GetArg32Simple - error reading ARM stack: %s.", error.AsCString());
256*4640cde1SColin Riley                 }
257*4640cde1SColin Riley             }
258*4640cde1SColin Riley         }
259*4640cde1SColin Riley     }
260*4640cde1SColin Riley     return true;
261*4640cde1SColin Riley }
262*4640cde1SColin Riley 
263*4640cde1SColin Riley void
264*4640cde1SColin Riley RenderScriptRuntime::CaptureSetGlobalVar1(RuntimeHook* hook_info, ExecutionContext& context)
265*4640cde1SColin Riley {
266*4640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
267*4640cde1SColin Riley 
268*4640cde1SColin Riley     //Context, Script, int, data, length
269*4640cde1SColin Riley 
270*4640cde1SColin Riley     Error error;
271*4640cde1SColin Riley 
272*4640cde1SColin Riley     uint32_t rs_context_u32 = 0U;
273*4640cde1SColin Riley     uint32_t rs_script_u32 = 0U;
274*4640cde1SColin Riley     uint32_t rs_id_u32 = 0U;
275*4640cde1SColin Riley     uint32_t rs_data_u32 = 0U;
276*4640cde1SColin Riley     uint32_t rs_length_u32 = 0U;
277*4640cde1SColin Riley 
278*4640cde1SColin Riley     std::string resname;
279*4640cde1SColin Riley     std::string cachedir;
280*4640cde1SColin Riley 
281*4640cde1SColin Riley     GetArg32Simple(context, 0, &rs_context_u32);
282*4640cde1SColin Riley     GetArg32Simple(context, 1, &rs_script_u32);
283*4640cde1SColin Riley     GetArg32Simple(context, 2, &rs_id_u32);
284*4640cde1SColin Riley     GetArg32Simple(context, 3, &rs_data_u32);
285*4640cde1SColin Riley     GetArg32Simple(context, 4, &rs_length_u32);
286*4640cde1SColin Riley 
287*4640cde1SColin Riley     if(log)
288*4640cde1SColin Riley     {
289*4640cde1SColin Riley         log->Printf ("RenderScriptRuntime::CaptureSetGlobalVar1 - 0x%" PRIx64 ",0x%" PRIx64 " slot %" PRIu64 " = 0x%" PRIx64 ":%" PRIu64 "bytes.",
290*4640cde1SColin Riley                         (uint64_t)rs_context_u32, (uint64_t)rs_script_u32, (uint64_t)rs_id_u32, (uint64_t)rs_data_u32, (uint64_t)rs_length_u32);
291*4640cde1SColin Riley 
292*4640cde1SColin Riley         addr_t script_addr =  (addr_t)rs_script_u32;
293*4640cde1SColin Riley         if (m_scriptMappings.find( script_addr ) != m_scriptMappings.end())
294*4640cde1SColin Riley         {
295*4640cde1SColin Riley             auto rsm = m_scriptMappings[script_addr];
296*4640cde1SColin Riley             if (rs_id_u32 < rsm->m_globals.size())
297*4640cde1SColin Riley             {
298*4640cde1SColin Riley                 auto rsg = rsm->m_globals[rs_id_u32];
299*4640cde1SColin Riley                 log->Printf ("RenderScriptRuntime::CaptureSetGlobalVar1 - Setting of '%s' within '%s' inferred", rsg.m_name.AsCString(),
300*4640cde1SColin Riley                                 rsm->m_module->GetFileSpec().GetFilename().AsCString());
301*4640cde1SColin Riley             }
302*4640cde1SColin Riley         }
303*4640cde1SColin Riley     }
304*4640cde1SColin Riley }
305*4640cde1SColin Riley 
306*4640cde1SColin Riley void
307*4640cde1SColin Riley RenderScriptRuntime::CaptureAllocationInit1(RuntimeHook* hook_info, ExecutionContext& context)
308*4640cde1SColin Riley {
309*4640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
310*4640cde1SColin Riley 
311*4640cde1SColin Riley     //Context, Alloc, bool
312*4640cde1SColin Riley 
313*4640cde1SColin Riley     Error error;
314*4640cde1SColin Riley 
315*4640cde1SColin Riley     uint32_t rs_context_u32 = 0U;
316*4640cde1SColin Riley     uint32_t rs_alloc_u32 = 0U;
317*4640cde1SColin Riley     uint32_t rs_forceZero_u32 = 0U;
318*4640cde1SColin Riley 
319*4640cde1SColin Riley     GetArg32Simple(context, 0, &rs_context_u32);
320*4640cde1SColin Riley     GetArg32Simple(context, 1, &rs_alloc_u32);
321*4640cde1SColin Riley     GetArg32Simple(context, 2, &rs_forceZero_u32);
322*4640cde1SColin Riley 
323*4640cde1SColin Riley     if(log)
324*4640cde1SColin Riley         log->Printf ("RenderScriptRuntime::CaptureAllocationInit1 - 0x%" PRIx64 ",0x%" PRIx64 ",0x%" PRIx64 " .",
325*4640cde1SColin Riley                         (uint64_t)rs_context_u32, (uint64_t)rs_alloc_u32, (uint64_t)rs_forceZero_u32);
326*4640cde1SColin Riley }
327*4640cde1SColin Riley 
328*4640cde1SColin Riley void
329*4640cde1SColin Riley RenderScriptRuntime::CaptureScriptInit1(RuntimeHook* hook_info, ExecutionContext& context)
330*4640cde1SColin Riley {
331*4640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
332*4640cde1SColin Riley 
333*4640cde1SColin Riley     //Context, Script, resname Str, cachedir Str
334*4640cde1SColin Riley     Error error;
335*4640cde1SColin Riley     Process* process = context.GetProcessPtr();
336*4640cde1SColin Riley 
337*4640cde1SColin Riley     uint32_t rs_context_u32 = 0U;
338*4640cde1SColin Riley     uint32_t rs_script_u32 = 0U;
339*4640cde1SColin Riley     uint32_t rs_resnameptr_u32 = 0U;
340*4640cde1SColin Riley     uint32_t rs_cachedirptr_u32 = 0U;
341*4640cde1SColin Riley 
342*4640cde1SColin Riley     std::string resname;
343*4640cde1SColin Riley     std::string cachedir;
344*4640cde1SColin Riley 
345*4640cde1SColin Riley     GetArg32Simple(context, 0, &rs_context_u32);
346*4640cde1SColin Riley     GetArg32Simple(context, 1, &rs_script_u32);
347*4640cde1SColin Riley     GetArg32Simple(context, 2, &rs_resnameptr_u32);
348*4640cde1SColin Riley     GetArg32Simple(context, 3, &rs_cachedirptr_u32);
349*4640cde1SColin Riley 
350*4640cde1SColin Riley     process->ReadCStringFromMemory((lldb::addr_t)rs_resnameptr_u32, resname, error);
351*4640cde1SColin Riley     if (error.Fail())
352*4640cde1SColin Riley     {
353*4640cde1SColin Riley         if(log)
354*4640cde1SColin Riley             log->Printf ("RenderScriptRuntime::CaptureScriptInit1 - error reading resname: %s.", error.AsCString());
355*4640cde1SColin Riley 
356*4640cde1SColin Riley     }
357*4640cde1SColin Riley 
358*4640cde1SColin Riley     process->ReadCStringFromMemory((lldb::addr_t)rs_cachedirptr_u32, cachedir, error);
359*4640cde1SColin Riley     if (error.Fail())
360*4640cde1SColin Riley     {
361*4640cde1SColin Riley         if(log)
362*4640cde1SColin Riley             log->Printf ("RenderScriptRuntime::CaptureScriptInit1 - error reading cachedir: %s.", error.AsCString());
363*4640cde1SColin Riley     }
364*4640cde1SColin Riley 
365*4640cde1SColin Riley     if (log)
366*4640cde1SColin Riley         log->Printf ("RenderScriptRuntime::CaptureScriptInit1 - 0x%" PRIx64 ",0x%" PRIx64 " => '%s' at '%s' .",
367*4640cde1SColin Riley                      (uint64_t)rs_context_u32, (uint64_t)rs_script_u32, resname.c_str(), cachedir.c_str());
368*4640cde1SColin Riley 
369*4640cde1SColin Riley     if (resname.size() > 0)
370*4640cde1SColin Riley     {
371*4640cde1SColin Riley         StreamString strm;
372*4640cde1SColin Riley         strm.Printf("librs.%s.so", resname.c_str());
373*4640cde1SColin Riley 
374*4640cde1SColin Riley         ScriptDetails script;
375*4640cde1SColin Riley         script.cachedir = cachedir;
376*4640cde1SColin Riley         script.resname = resname;
377*4640cde1SColin Riley         script.scriptDyLib.assign(strm.GetData());
378*4640cde1SColin Riley         script.script = rs_script_u32;
379*4640cde1SColin Riley         script.context = rs_context_u32;
380*4640cde1SColin Riley 
381*4640cde1SColin Riley         m_scripts.push_back(script);
382*4640cde1SColin Riley 
383*4640cde1SColin Riley         if (log)
384*4640cde1SColin Riley             log->Printf ("RenderScriptRuntime::CaptureScriptInit1 - '%s' tagged with context 0x%" PRIx64 " and script 0x%" PRIx64 ".",
385*4640cde1SColin Riley                          strm.GetData(), (uint64_t)rs_context_u32, (uint64_t)rs_script_u32);
386*4640cde1SColin Riley     }
387*4640cde1SColin Riley     else if (log)
388*4640cde1SColin Riley     {
389*4640cde1SColin Riley         log->Printf ("RenderScriptRuntime::CaptureScriptInit1 - resource name invalid, Script not tagged");
390*4640cde1SColin Riley     }
391*4640cde1SColin Riley 
392*4640cde1SColin Riley }
393*4640cde1SColin Riley 
394*4640cde1SColin Riley 
395*4640cde1SColin Riley void
396*4640cde1SColin Riley RenderScriptRuntime::LoadRuntimeHooks(lldb::ModuleSP module, ModuleKind kind)
397*4640cde1SColin Riley {
398*4640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
399*4640cde1SColin Riley 
400*4640cde1SColin Riley     if (!module)
401*4640cde1SColin Riley     {
402*4640cde1SColin Riley         return;
403*4640cde1SColin Riley     }
404*4640cde1SColin Riley 
405*4640cde1SColin Riley     if ((GetProcess()->GetTarget().GetArchitecture().GetMachine() != llvm::Triple::ArchType::x86)
406*4640cde1SColin Riley         && (GetProcess()->GetTarget().GetArchitecture().GetMachine() != llvm::Triple::ArchType::arm))
407*4640cde1SColin Riley     {
408*4640cde1SColin Riley         if (log)
409*4640cde1SColin Riley             log->Printf ("RenderScriptRuntime::LoadRuntimeHooks - Unable to hook runtime. Only X86, ARM supported currently.");
410*4640cde1SColin Riley 
411*4640cde1SColin Riley         return;
412*4640cde1SColin Riley     }
413*4640cde1SColin Riley 
414*4640cde1SColin Riley     Target &target = GetProcess()->GetTarget();
415*4640cde1SColin Riley 
416*4640cde1SColin Riley     for (size_t idx = 0; idx < s_runtimeHookCount; idx++)
417*4640cde1SColin Riley     {
418*4640cde1SColin Riley         const HookDefn* hook_defn = &s_runtimeHookDefns[idx];
419*4640cde1SColin Riley         if (hook_defn->kind != kind) {
420*4640cde1SColin Riley             continue;
421*4640cde1SColin Riley         }
422*4640cde1SColin Riley 
423*4640cde1SColin Riley         const Symbol *sym = module->FindFirstSymbolWithNameAndType(ConstString(hook_defn->symbol_name), eSymbolTypeCode);
424*4640cde1SColin Riley 
425*4640cde1SColin Riley         addr_t addr = sym->GetAddress().GetLoadAddress(&target);
426*4640cde1SColin Riley         if (addr == LLDB_INVALID_ADDRESS)
427*4640cde1SColin Riley         {
428*4640cde1SColin Riley             if(log)
429*4640cde1SColin Riley                 log->Printf ("RenderScriptRuntime::LoadRuntimeHooks - Unable to resolve the address of hook function '%s' with symbol '%s'.",
430*4640cde1SColin Riley                              hook_defn->name, hook_defn->symbol_name);
431*4640cde1SColin Riley             continue;
432*4640cde1SColin Riley         }
433*4640cde1SColin Riley 
434*4640cde1SColin Riley         RuntimeHookSP hook(new RuntimeHook());
435*4640cde1SColin Riley         hook->address = addr;
436*4640cde1SColin Riley         hook->defn = hook_defn;
437*4640cde1SColin Riley         hook->bp_sp = target.CreateBreakpoint(addr, true, false);
438*4640cde1SColin Riley         hook->bp_sp->SetCallback(HookCallback, hook.get(), true);
439*4640cde1SColin Riley         m_runtimeHooks[addr] = hook;
440*4640cde1SColin Riley         if (log)
441*4640cde1SColin Riley         {
442*4640cde1SColin Riley             log->Printf ("RenderScriptRuntime::LoadRuntimeHooks - Successfully hooked '%s' in '%s' version %" PRIu64 " at 0x%" PRIx64 ".",
443*4640cde1SColin Riley                 hook_defn->name, module->GetFileSpec().GetFilename().AsCString(), (uint64_t)hook_defn->version, (uint64_t)addr);
444*4640cde1SColin Riley         }
445*4640cde1SColin Riley     }
446*4640cde1SColin Riley }
447*4640cde1SColin Riley 
448*4640cde1SColin Riley void
449*4640cde1SColin Riley RenderScriptRuntime::FixupScriptDetails(RSModuleDescriptorSP rsmodule_sp)
450*4640cde1SColin Riley {
451*4640cde1SColin Riley     if (!rsmodule_sp)
452*4640cde1SColin Riley         return;
453*4640cde1SColin Riley 
454*4640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
455*4640cde1SColin Riley 
456*4640cde1SColin Riley     const ModuleSP module = rsmodule_sp->m_module;
457*4640cde1SColin Riley     const FileSpec& file = module->GetPlatformFileSpec();
458*4640cde1SColin Riley 
459*4640cde1SColin Riley     for (const auto &rs_script : m_scripts)
460*4640cde1SColin Riley     {
461*4640cde1SColin Riley         if (file.GetFilename() == ConstString(rs_script.scriptDyLib.c_str()))
462*4640cde1SColin Riley         {
463*4640cde1SColin Riley             if (m_scriptMappings.find( rs_script.script ) != m_scriptMappings.end())
464*4640cde1SColin Riley             {
465*4640cde1SColin Riley                 if (m_scriptMappings[rs_script.script] != rsmodule_sp)
466*4640cde1SColin Riley                 {
467*4640cde1SColin Riley                     if (log)
468*4640cde1SColin Riley                     {
469*4640cde1SColin Riley                         log->Printf ("RenderScriptRuntime::FixupScriptDetails - Error: script %" PRIx64 " wants reassigned to new rsmodule '%s'.",
470*4640cde1SColin Riley                                      (uint64_t)rs_script.script, rsmodule_sp->m_module->GetFileSpec().GetFilename().AsCString());
471*4640cde1SColin Riley                     }
472*4640cde1SColin Riley                 }
473*4640cde1SColin Riley             }
474*4640cde1SColin Riley             else
475*4640cde1SColin Riley             {
476*4640cde1SColin Riley                 m_scriptMappings[rs_script.script] = rsmodule_sp;
477*4640cde1SColin Riley                 rsmodule_sp->m_resname = rs_script.resname;
478*4640cde1SColin Riley                 if (log)
479*4640cde1SColin Riley                 {
480*4640cde1SColin Riley                     log->Printf ("RenderScriptRuntime::FixupScriptDetails - script %" PRIx64 " associated with rsmodule '%s'.",
481*4640cde1SColin Riley                                     (uint64_t)rs_script.script, rsmodule_sp->m_module->GetFileSpec().GetFilename().AsCString());
482*4640cde1SColin Riley                 }
483*4640cde1SColin Riley             }
484*4640cde1SColin Riley         }
485*4640cde1SColin Riley     }
486*4640cde1SColin Riley 
487*4640cde1SColin Riley }
488*4640cde1SColin Riley 
4895ec532a9SColin Riley bool
4905ec532a9SColin Riley RenderScriptRuntime::LoadModule(const lldb::ModuleSP &module_sp)
4915ec532a9SColin Riley {
492*4640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
493*4640cde1SColin Riley 
4945ec532a9SColin Riley     if (module_sp)
4955ec532a9SColin Riley     {
4965ec532a9SColin Riley         for (const auto &rs_module : m_rsmodules)
4975ec532a9SColin Riley         {
498*4640cde1SColin Riley             if (rs_module->m_module == module_sp)
4995ec532a9SColin Riley                 return false;
5005ec532a9SColin Riley         }
501ef20b08fSColin Riley         bool module_loaded = false;
502ef20b08fSColin Riley         switch (GetModuleKind(module_sp))
503ef20b08fSColin Riley         {
504ef20b08fSColin Riley             case eModuleKindKernelObj:
505ef20b08fSColin Riley             {
506*4640cde1SColin Riley                 RSModuleDescriptorSP module_desc;
507*4640cde1SColin Riley                 module_desc.reset(new RSModuleDescriptor(module_sp));
508*4640cde1SColin Riley                 if (module_desc->ParseRSInfo())
5095ec532a9SColin Riley                 {
5105ec532a9SColin Riley                     m_rsmodules.push_back(module_desc);
511ef20b08fSColin Riley                     module_loaded = true;
5125ec532a9SColin Riley                 }
513*4640cde1SColin Riley                 if (module_loaded)
514*4640cde1SColin Riley                 {
515*4640cde1SColin Riley                     FixupScriptDetails(module_desc);
516*4640cde1SColin Riley                 }
517ef20b08fSColin Riley                 break;
518ef20b08fSColin Riley             }
519ef20b08fSColin Riley             case eModuleKindDriver:
520*4640cde1SColin Riley             {
521*4640cde1SColin Riley                 if (!m_libRSDriver)
522*4640cde1SColin Riley                 {
523*4640cde1SColin Riley                     m_libRSDriver = module_sp;
524*4640cde1SColin Riley                     LoadRuntimeHooks(m_libRSDriver, RenderScriptRuntime::eModuleKindDriver);
525*4640cde1SColin Riley                 }
526*4640cde1SColin Riley                 break;
527*4640cde1SColin Riley             }
528ef20b08fSColin Riley             case eModuleKindImpl:
529*4640cde1SColin Riley             {
530*4640cde1SColin Riley                 m_libRSCpuRef = module_sp;
531*4640cde1SColin Riley                 break;
532*4640cde1SColin Riley             }
533ef20b08fSColin Riley             case eModuleKindLibRS:
534*4640cde1SColin Riley             {
535*4640cde1SColin Riley                 if (!m_libRS)
536*4640cde1SColin Riley                 {
537*4640cde1SColin Riley                     m_libRS = module_sp;
538*4640cde1SColin Riley                     static ConstString gDbgPresentStr("gDebuggerPresent");
539*4640cde1SColin Riley                     const Symbol* debug_present = m_libRS->FindFirstSymbolWithNameAndType(gDbgPresentStr, eSymbolTypeData);
540*4640cde1SColin Riley                     if (debug_present)
541*4640cde1SColin Riley                     {
542*4640cde1SColin Riley                         Error error;
543*4640cde1SColin Riley                         uint32_t flag = 0x00000001U;
544*4640cde1SColin Riley                         Target &target = GetProcess()->GetTarget();
545*4640cde1SColin Riley                         addr_t addr = debug_present->GetAddress().GetLoadAddress(&target);
546*4640cde1SColin Riley                         GetProcess()->WriteMemory(addr, &flag, sizeof(flag), error);
547*4640cde1SColin Riley                         if(error.Success())
548*4640cde1SColin Riley                         {
549*4640cde1SColin Riley                             if (log)
550*4640cde1SColin Riley                                 log->Printf ("RenderScriptRuntime::LoadModule - Debugger present flag set on debugee");
551*4640cde1SColin Riley 
552*4640cde1SColin Riley                             m_debuggerPresentFlagged = true;
553*4640cde1SColin Riley                         }
554*4640cde1SColin Riley                         else if (log)
555*4640cde1SColin Riley                         {
556*4640cde1SColin Riley                             log->Printf ("RenderScriptRuntime::LoadModule - Error writing debugger present flags '%s' ", error.AsCString());
557*4640cde1SColin Riley                         }
558*4640cde1SColin Riley                     }
559*4640cde1SColin Riley                     else if (log)
560*4640cde1SColin Riley                     {
561*4640cde1SColin Riley                         log->Printf ("RenderScriptRuntime::LoadModule - Error writing debugger present flags - symbol not found");
562*4640cde1SColin Riley                     }
563*4640cde1SColin Riley                 }
564*4640cde1SColin Riley                 break;
565*4640cde1SColin Riley             }
566ef20b08fSColin Riley             default:
567ef20b08fSColin Riley                 break;
568ef20b08fSColin Riley         }
569ef20b08fSColin Riley         if (module_loaded)
570ef20b08fSColin Riley             Update();
571ef20b08fSColin Riley         return module_loaded;
5725ec532a9SColin Riley     }
5735ec532a9SColin Riley     return false;
5745ec532a9SColin Riley }
5755ec532a9SColin Riley 
576ef20b08fSColin Riley void
577ef20b08fSColin Riley RenderScriptRuntime::Update()
578ef20b08fSColin Riley {
579ef20b08fSColin Riley     if (m_rsmodules.size() > 0)
580ef20b08fSColin Riley     {
581ef20b08fSColin Riley         if (!m_initiated)
582ef20b08fSColin Riley         {
583ef20b08fSColin Riley             Initiate();
584ef20b08fSColin Riley         }
585ef20b08fSColin Riley     }
586ef20b08fSColin Riley }
587ef20b08fSColin Riley 
588ef20b08fSColin Riley 
5895ec532a9SColin Riley // The maximum line length of an .rs.info packet
5905ec532a9SColin Riley #define MAXLINE 500
5915ec532a9SColin Riley 
5925ec532a9SColin Riley // The .rs.info symbol in renderscript modules contains a string which needs to be parsed.
5935ec532a9SColin Riley // The string is basic and is parsed on a line by line basis.
5945ec532a9SColin Riley bool
5955ec532a9SColin Riley RSModuleDescriptor::ParseRSInfo()
5965ec532a9SColin Riley {
5975ec532a9SColin Riley     const Symbol *info_sym = m_module->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), eSymbolTypeData);
5985ec532a9SColin Riley     if (info_sym)
5995ec532a9SColin Riley     {
6005ec532a9SColin Riley         const addr_t addr = info_sym->GetAddress().GetFileAddress();
6015ec532a9SColin Riley         const addr_t size = info_sym->GetByteSize();
6025ec532a9SColin Riley         const FileSpec fs = m_module->GetFileSpec();
6035ec532a9SColin Riley 
6045ec532a9SColin Riley         DataBufferSP buffer = fs.ReadFileContents(addr, size);
6055ec532a9SColin Riley 
6065ec532a9SColin Riley         if (!buffer)
6075ec532a9SColin Riley             return false;
6085ec532a9SColin Riley 
6095ec532a9SColin Riley         std::string info((const char *)buffer->GetBytes());
6105ec532a9SColin Riley 
6115ec532a9SColin Riley         std::vector<std::string> info_lines;
6125ec532a9SColin Riley         size_t lpos = info.find_first_of("\n");
6135ec532a9SColin Riley         while (lpos != std::string::npos)
6145ec532a9SColin Riley         {
6155ec532a9SColin Riley             info_lines.push_back(info.substr(0, lpos));
6165ec532a9SColin Riley             info = info.substr(lpos + 1);
6175ec532a9SColin Riley             lpos = info.find_first_of("\n");
6185ec532a9SColin Riley         }
6195ec532a9SColin Riley         size_t offset = 0;
6205ec532a9SColin Riley         while (offset < info_lines.size())
6215ec532a9SColin Riley         {
6225ec532a9SColin Riley             std::string line = info_lines[offset];
6235ec532a9SColin Riley             // Parse directives
6245ec532a9SColin Riley             uint32_t numDefns = 0;
6255ec532a9SColin Riley             if (sscanf(line.c_str(), "exportVarCount: %u", &numDefns) == 1)
6265ec532a9SColin Riley             {
6275ec532a9SColin Riley                 while (numDefns--)
628*4640cde1SColin Riley                     m_globals.push_back(RSGlobalDescriptor(this, info_lines[++offset].c_str()));
6295ec532a9SColin Riley             }
6305ec532a9SColin Riley             else if (sscanf(line.c_str(), "exportFuncCount: %u", &numDefns) == 1)
6315ec532a9SColin Riley             {
6325ec532a9SColin Riley             }
6335ec532a9SColin Riley             else if (sscanf(line.c_str(), "exportForEachCount: %u", &numDefns) == 1)
6345ec532a9SColin Riley             {
6355ec532a9SColin Riley                 char name[MAXLINE];
6365ec532a9SColin Riley                 while (numDefns--)
6375ec532a9SColin Riley                 {
6385ec532a9SColin Riley                     uint32_t slot = 0;
6395ec532a9SColin Riley                     name[0] = '\0';
6405ec532a9SColin Riley                     if (sscanf(info_lines[++offset].c_str(), "%u - %s", &slot, &name[0]) == 2)
6415ec532a9SColin Riley                     {
642*4640cde1SColin Riley                         m_kernels.push_back(RSKernelDescriptor(this, name, slot));
643*4640cde1SColin Riley                     }
644*4640cde1SColin Riley                 }
645*4640cde1SColin Riley             }
646*4640cde1SColin Riley             else if (sscanf(line.c_str(), "pragmaCount: %u", &numDefns) == 1)
647*4640cde1SColin Riley             {
648*4640cde1SColin Riley                 char name[MAXLINE];
649*4640cde1SColin Riley                 char value[MAXLINE];
650*4640cde1SColin Riley                 while (numDefns--)
651*4640cde1SColin Riley                 {
652*4640cde1SColin Riley                     name[0] = '\0';
653*4640cde1SColin Riley                     value[0] = '\0';
654*4640cde1SColin Riley                     if (sscanf(info_lines[++offset].c_str(), "%s - %s", &name[0], &value[0]) != 0
655*4640cde1SColin Riley                         && (name[0] != '\0'))
656*4640cde1SColin Riley                     {
657*4640cde1SColin Riley                         m_pragmas[std::string(name)] = value;
6585ec532a9SColin Riley                     }
6595ec532a9SColin Riley                 }
6605ec532a9SColin Riley             }
6615ec532a9SColin Riley             else if (sscanf(line.c_str(), "objectSlotCount: %u", &numDefns) == 1)
6625ec532a9SColin Riley             {
6635ec532a9SColin Riley             }
6645ec532a9SColin Riley 
6655ec532a9SColin Riley             offset++;
6665ec532a9SColin Riley         }
6675ec532a9SColin Riley         return m_kernels.size() > 0;
6685ec532a9SColin Riley     }
6695ec532a9SColin Riley     return false;
6705ec532a9SColin Riley }
6715ec532a9SColin Riley 
6725ec532a9SColin Riley bool
6735ec532a9SColin Riley RenderScriptRuntime::ProbeModules(const ModuleList module_list)
6745ec532a9SColin Riley {
6755ec532a9SColin Riley     bool rs_found = false;
6765ec532a9SColin Riley     size_t num_modules = module_list.GetSize();
6775ec532a9SColin Riley     for (size_t i = 0; i < num_modules; i++)
6785ec532a9SColin Riley     {
6795ec532a9SColin Riley         auto module = module_list.GetModuleAtIndex(i);
6805ec532a9SColin Riley         rs_found |= LoadModule(module);
6815ec532a9SColin Riley     }
6825ec532a9SColin Riley     return rs_found;
6835ec532a9SColin Riley }
6845ec532a9SColin Riley 
6855ec532a9SColin Riley void
686*4640cde1SColin Riley RenderScriptRuntime::Status(Stream &strm) const
687*4640cde1SColin Riley {
688*4640cde1SColin Riley     if (m_libRS)
689*4640cde1SColin Riley     {
690*4640cde1SColin Riley         strm.Printf("Runtime Library discovered.");
691*4640cde1SColin Riley         strm.EOL();
692*4640cde1SColin Riley     }
693*4640cde1SColin Riley     if (m_libRSDriver)
694*4640cde1SColin Riley     {
695*4640cde1SColin Riley         strm.Printf("Runtime Driver discovered.");
696*4640cde1SColin Riley         strm.EOL();
697*4640cde1SColin Riley     }
698*4640cde1SColin Riley     if (m_libRSCpuRef)
699*4640cde1SColin Riley     {
700*4640cde1SColin Riley         strm.Printf("CPU Reference Implementation discovered.");
701*4640cde1SColin Riley         strm.EOL();
702*4640cde1SColin Riley     }
703*4640cde1SColin Riley 
704*4640cde1SColin Riley     if (m_runtimeHooks.size())
705*4640cde1SColin Riley     {
706*4640cde1SColin Riley         strm.Printf("Runtime functions hooked:");
707*4640cde1SColin Riley         strm.EOL();
708*4640cde1SColin Riley         for (auto b : m_runtimeHooks)
709*4640cde1SColin Riley         {
710*4640cde1SColin Riley             strm.Indent(b.second->defn->name);
711*4640cde1SColin Riley             strm.EOL();
712*4640cde1SColin Riley         }
713*4640cde1SColin Riley         strm.EOL();
714*4640cde1SColin Riley     }
715*4640cde1SColin Riley     else
716*4640cde1SColin Riley     {
717*4640cde1SColin Riley         strm.Printf("Runtime is not hooked.");
718*4640cde1SColin Riley         strm.EOL();
719*4640cde1SColin Riley     }
720*4640cde1SColin Riley }
721*4640cde1SColin Riley 
722*4640cde1SColin Riley void
723*4640cde1SColin Riley RenderScriptRuntime::DumpContexts(Stream &strm) const
724*4640cde1SColin Riley {
725*4640cde1SColin Riley     strm.Printf("Inferred RenderScript Contexts:");
726*4640cde1SColin Riley     strm.EOL();
727*4640cde1SColin Riley     strm.IndentMore();
728*4640cde1SColin Riley 
729*4640cde1SColin Riley     std::map<addr_t, uint64_t> contextReferences;
730*4640cde1SColin Riley 
731*4640cde1SColin Riley     for (const auto &script : m_scripts)
732*4640cde1SColin Riley     {
733*4640cde1SColin Riley         if (contextReferences.find(script.context) != contextReferences.end())
734*4640cde1SColin Riley         {
735*4640cde1SColin Riley             contextReferences[script.context]++;
736*4640cde1SColin Riley         }
737*4640cde1SColin Riley         else
738*4640cde1SColin Riley         {
739*4640cde1SColin Riley             contextReferences[script.context] = 1;
740*4640cde1SColin Riley         }
741*4640cde1SColin Riley     }
742*4640cde1SColin Riley 
743*4640cde1SColin Riley     for (const auto& cRef : contextReferences)
744*4640cde1SColin Riley     {
745*4640cde1SColin Riley         strm.Printf("Context 0x%" PRIx64 ": %" PRIu64 " script instances", cRef.first, cRef.second);
746*4640cde1SColin Riley         strm.EOL();
747*4640cde1SColin Riley     }
748*4640cde1SColin Riley     strm.IndentLess();
749*4640cde1SColin Riley }
750*4640cde1SColin Riley 
751*4640cde1SColin Riley void
752*4640cde1SColin Riley RenderScriptRuntime::DumpKernels(Stream &strm) const
753*4640cde1SColin Riley {
754*4640cde1SColin Riley     strm.Printf("RenderScript Kernels:");
755*4640cde1SColin Riley     strm.EOL();
756*4640cde1SColin Riley     strm.IndentMore();
757*4640cde1SColin Riley     for (const auto &module : m_rsmodules)
758*4640cde1SColin Riley     {
759*4640cde1SColin Riley         strm.Printf("Resource '%s':",module->m_resname.c_str());
760*4640cde1SColin Riley         strm.EOL();
761*4640cde1SColin Riley         for (const auto &kernel : module->m_kernels)
762*4640cde1SColin Riley         {
763*4640cde1SColin Riley             strm.Indent(kernel.m_name.AsCString());
764*4640cde1SColin Riley             strm.EOL();
765*4640cde1SColin Riley         }
766*4640cde1SColin Riley     }
767*4640cde1SColin Riley     strm.IndentLess();
768*4640cde1SColin Riley }
769*4640cde1SColin Riley 
770*4640cde1SColin Riley void
771*4640cde1SColin Riley RenderScriptRuntime::AttemptBreakpointAtKernelName(Stream &strm, const char* name, Error& error)
772*4640cde1SColin Riley {
773*4640cde1SColin Riley     if (!name)
774*4640cde1SColin Riley     {
775*4640cde1SColin Riley         error.SetErrorString("invalid kernel name");
776*4640cde1SColin Riley         return;
777*4640cde1SColin Riley     }
778*4640cde1SColin Riley 
779*4640cde1SColin Riley     bool kernels_found;
780*4640cde1SColin Riley     ConstString kernel_name(name);
781*4640cde1SColin Riley     for (const auto &module : m_rsmodules)
782*4640cde1SColin Riley     {
783*4640cde1SColin Riley         for (const auto &kernel : module->m_kernels)
784*4640cde1SColin Riley         {
785*4640cde1SColin Riley             if (kernel.m_name == kernel_name)
786*4640cde1SColin Riley             {
787*4640cde1SColin Riley                 //Attempt to set a breakpoint on this symbol, within the module library
788*4640cde1SColin Riley                 //If it's not found, it's likely debug info is unavailable - set a
789*4640cde1SColin Riley                 //breakpoint on <name>.expand and emit a warning.
790*4640cde1SColin Riley 
791*4640cde1SColin Riley                 const Symbol* kernel_sym = module->m_module->FindFirstSymbolWithNameAndType(kernel_name, eSymbolTypeCode);
792*4640cde1SColin Riley 
793*4640cde1SColin Riley                 if (!kernel_sym)
794*4640cde1SColin Riley                 {
795*4640cde1SColin Riley                     std::string kernel_name_expanded(name);
796*4640cde1SColin Riley                     kernel_name_expanded.append(".expand");
797*4640cde1SColin Riley                     kernel_sym = module->m_module->FindFirstSymbolWithNameAndType(ConstString(kernel_name_expanded.c_str()), eSymbolTypeCode);
798*4640cde1SColin Riley 
799*4640cde1SColin Riley                     if (kernel_sym)
800*4640cde1SColin Riley                     {
801*4640cde1SColin Riley                         strm.Printf("Kernel '%s' could not be found, but expansion exists. ", name);
802*4640cde1SColin Riley                         strm.Printf("Breakpoint placed on expanded kernel. Have you compiled in debug mode?");
803*4640cde1SColin Riley                         strm.EOL();
804*4640cde1SColin Riley                     }
805*4640cde1SColin Riley                     else
806*4640cde1SColin Riley                     {
807*4640cde1SColin Riley                         error.SetErrorStringWithFormat("Could not locate symbols for loaded kernel '%s'.", name);
808*4640cde1SColin Riley                         return;
809*4640cde1SColin Riley                     }
810*4640cde1SColin Riley                 }
811*4640cde1SColin Riley 
812*4640cde1SColin Riley                 addr_t bp_addr = kernel_sym->GetAddress().GetLoadAddress(&GetProcess()->GetTarget());
813*4640cde1SColin Riley                 if (bp_addr == LLDB_INVALID_ADDRESS)
814*4640cde1SColin Riley                 {
815*4640cde1SColin Riley                     error.SetErrorStringWithFormat("Could not locate load address for symbols of kernel '%s'.", name);
816*4640cde1SColin Riley                     return;
817*4640cde1SColin Riley                 }
818*4640cde1SColin Riley 
819*4640cde1SColin Riley                 BreakpointSP bp = GetProcess()->GetTarget().CreateBreakpoint(bp_addr, false, false);
820*4640cde1SColin Riley                 strm.Printf("Breakpoint %" PRIu64 ": kernel '%s' within script '%s'", (uint64_t)bp->GetID(), name, module->m_resname.c_str());
821*4640cde1SColin Riley                 strm.EOL();
822*4640cde1SColin Riley 
823*4640cde1SColin Riley                 kernels_found = true;
824*4640cde1SColin Riley             }
825*4640cde1SColin Riley         }
826*4640cde1SColin Riley     }
827*4640cde1SColin Riley 
828*4640cde1SColin Riley     if (!kernels_found)
829*4640cde1SColin Riley     {
830*4640cde1SColin Riley         error.SetErrorString("kernel name not found");
831*4640cde1SColin Riley     }
832*4640cde1SColin Riley     return;
833*4640cde1SColin Riley }
834*4640cde1SColin Riley 
835*4640cde1SColin Riley void
8365ec532a9SColin Riley RenderScriptRuntime::DumpModules(Stream &strm) const
8375ec532a9SColin Riley {
8385ec532a9SColin Riley     strm.Printf("RenderScript Modules:");
8395ec532a9SColin Riley     strm.EOL();
8405ec532a9SColin Riley     strm.IndentMore();
8415ec532a9SColin Riley     for (const auto &module : m_rsmodules)
8425ec532a9SColin Riley     {
843*4640cde1SColin Riley         module->Dump(strm);
8445ec532a9SColin Riley     }
8455ec532a9SColin Riley     strm.IndentLess();
8465ec532a9SColin Riley }
8475ec532a9SColin Riley 
8485ec532a9SColin Riley void
8495ec532a9SColin Riley RSModuleDescriptor::Dump(Stream &strm) const
8505ec532a9SColin Riley {
8515ec532a9SColin Riley     strm.Indent();
8525ec532a9SColin Riley     m_module->GetFileSpec().Dump(&strm);
853*4640cde1SColin Riley     m_module->ParseAllDebugSymbols();
854*4640cde1SColin Riley     if(m_module->GetNumCompileUnits())
855*4640cde1SColin Riley     {
856*4640cde1SColin Riley         strm.Indent("Debug info loaded.");
857*4640cde1SColin Riley     }
858*4640cde1SColin Riley     else
859*4640cde1SColin Riley     {
860*4640cde1SColin Riley         strm.Indent("Debug info does not exist.");
861*4640cde1SColin Riley     }
8625ec532a9SColin Riley     strm.EOL();
8635ec532a9SColin Riley     strm.IndentMore();
8645ec532a9SColin Riley     strm.Indent();
865189598edSColin Riley     strm.Printf("Globals: %" PRIu64, static_cast<uint64_t>(m_globals.size()));
8665ec532a9SColin Riley     strm.EOL();
8675ec532a9SColin Riley     strm.IndentMore();
8685ec532a9SColin Riley     for (const auto &global : m_globals)
8695ec532a9SColin Riley     {
8705ec532a9SColin Riley         global.Dump(strm);
8715ec532a9SColin Riley     }
8725ec532a9SColin Riley     strm.IndentLess();
8735ec532a9SColin Riley     strm.Indent();
874189598edSColin Riley     strm.Printf("Kernels: %" PRIu64, static_cast<uint64_t>(m_kernels.size()));
8755ec532a9SColin Riley     strm.EOL();
8765ec532a9SColin Riley     strm.IndentMore();
8775ec532a9SColin Riley     for (const auto &kernel : m_kernels)
8785ec532a9SColin Riley     {
8795ec532a9SColin Riley         kernel.Dump(strm);
8805ec532a9SColin Riley     }
881*4640cde1SColin Riley     strm.Printf("Pragmas: %"  PRIu64 , static_cast<uint64_t>(m_pragmas.size()));
882*4640cde1SColin Riley     strm.EOL();
883*4640cde1SColin Riley     strm.IndentMore();
884*4640cde1SColin Riley     for (const auto &key_val : m_pragmas)
885*4640cde1SColin Riley     {
886*4640cde1SColin Riley         strm.Printf("%s: %s", key_val.first.c_str(), key_val.second.c_str());
887*4640cde1SColin Riley         strm.EOL();
888*4640cde1SColin Riley     }
8895ec532a9SColin Riley     strm.IndentLess(4);
8905ec532a9SColin Riley }
8915ec532a9SColin Riley 
8925ec532a9SColin Riley void
8935ec532a9SColin Riley RSGlobalDescriptor::Dump(Stream &strm) const
8945ec532a9SColin Riley {
8955ec532a9SColin Riley     strm.Indent(m_name.AsCString());
896*4640cde1SColin Riley     VariableList var_list;
897*4640cde1SColin Riley     m_module->m_module->FindGlobalVariables(m_name, nullptr, true, 1U, var_list);
898*4640cde1SColin Riley     if (var_list.GetSize() == 1)
899*4640cde1SColin Riley     {
900*4640cde1SColin Riley         auto var = var_list.GetVariableAtIndex(0);
901*4640cde1SColin Riley         auto type = var->GetType();
902*4640cde1SColin Riley         if(type)
903*4640cde1SColin Riley         {
904*4640cde1SColin Riley             strm.Printf(" - ");
905*4640cde1SColin Riley             type->DumpTypeName(&strm);
906*4640cde1SColin Riley         }
907*4640cde1SColin Riley         else
908*4640cde1SColin Riley         {
909*4640cde1SColin Riley             strm.Printf(" - Unknown Type");
910*4640cde1SColin Riley         }
911*4640cde1SColin Riley     }
912*4640cde1SColin Riley     else
913*4640cde1SColin Riley     {
914*4640cde1SColin Riley         strm.Printf(" - variable identified, but not found in binary");
915*4640cde1SColin Riley         const Symbol* s = m_module->m_module->FindFirstSymbolWithNameAndType(m_name, eSymbolTypeData);
916*4640cde1SColin Riley         if (s)
917*4640cde1SColin Riley         {
918*4640cde1SColin Riley             strm.Printf(" (symbol exists) ");
919*4640cde1SColin Riley         }
920*4640cde1SColin Riley     }
921*4640cde1SColin Riley 
9225ec532a9SColin Riley     strm.EOL();
9235ec532a9SColin Riley }
9245ec532a9SColin Riley 
9255ec532a9SColin Riley void
9265ec532a9SColin Riley RSKernelDescriptor::Dump(Stream &strm) const
9275ec532a9SColin Riley {
9285ec532a9SColin Riley     strm.Indent(m_name.AsCString());
9295ec532a9SColin Riley     strm.EOL();
9305ec532a9SColin Riley }
9315ec532a9SColin Riley 
9325ec532a9SColin Riley class CommandObjectRenderScriptRuntimeModuleProbe : public CommandObjectParsed
9335ec532a9SColin Riley {
9345ec532a9SColin Riley   private:
9355ec532a9SColin Riley   public:
9365ec532a9SColin Riley     CommandObjectRenderScriptRuntimeModuleProbe(CommandInterpreter &interpreter)
9375ec532a9SColin Riley         : CommandObjectParsed(interpreter, "renderscript module probe",
9385ec532a9SColin Riley                               "Initiates a Probe of all loaded modules for kernels and other renderscript objects.",
9395ec532a9SColin Riley                               "renderscript module probe",
940e87764f2SEnrico Granata                               eCommandRequiresTarget | eCommandRequiresProcess | eCommandProcessMustBeLaunched)
9415ec532a9SColin Riley     {
9425ec532a9SColin Riley     }
9435ec532a9SColin Riley 
9445ec532a9SColin Riley     ~CommandObjectRenderScriptRuntimeModuleProbe() {}
9455ec532a9SColin Riley 
9465ec532a9SColin Riley     bool
9475ec532a9SColin Riley     DoExecute(Args &command, CommandReturnObject &result)
9485ec532a9SColin Riley     {
9495ec532a9SColin Riley         const size_t argc = command.GetArgumentCount();
9505ec532a9SColin Riley         if (argc == 0)
9515ec532a9SColin Riley         {
9525ec532a9SColin Riley             Target *target = m_exe_ctx.GetTargetPtr();
9535ec532a9SColin Riley             RenderScriptRuntime *runtime =
9545ec532a9SColin Riley                 (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
9555ec532a9SColin Riley             auto module_list = target->GetImages();
9565ec532a9SColin Riley             bool new_rs_details = runtime->ProbeModules(module_list);
9575ec532a9SColin Riley             if (new_rs_details)
9585ec532a9SColin Riley             {
9595ec532a9SColin Riley                 result.AppendMessage("New renderscript modules added to runtime model.");
9605ec532a9SColin Riley             }
9615ec532a9SColin Riley             result.SetStatus(eReturnStatusSuccessFinishResult);
9625ec532a9SColin Riley             return true;
9635ec532a9SColin Riley         }
9645ec532a9SColin Riley 
9655ec532a9SColin Riley         result.AppendErrorWithFormat("'%s' takes no arguments", m_cmd_name.c_str());
9665ec532a9SColin Riley         result.SetStatus(eReturnStatusFailed);
9675ec532a9SColin Riley         return false;
9685ec532a9SColin Riley     }
9695ec532a9SColin Riley };
9705ec532a9SColin Riley 
9715ec532a9SColin Riley class CommandObjectRenderScriptRuntimeModuleDump : public CommandObjectParsed
9725ec532a9SColin Riley {
9735ec532a9SColin Riley   private:
9745ec532a9SColin Riley   public:
9755ec532a9SColin Riley     CommandObjectRenderScriptRuntimeModuleDump(CommandInterpreter &interpreter)
9765ec532a9SColin Riley         : CommandObjectParsed(interpreter, "renderscript module dump",
9775ec532a9SColin Riley                               "Dumps renderscript specific information for all modules.", "renderscript module dump",
978e87764f2SEnrico Granata                               eCommandRequiresProcess | eCommandProcessMustBeLaunched)
9795ec532a9SColin Riley     {
9805ec532a9SColin Riley     }
9815ec532a9SColin Riley 
9825ec532a9SColin Riley     ~CommandObjectRenderScriptRuntimeModuleDump() {}
9835ec532a9SColin Riley 
9845ec532a9SColin Riley     bool
9855ec532a9SColin Riley     DoExecute(Args &command, CommandReturnObject &result)
9865ec532a9SColin Riley     {
9875ec532a9SColin Riley         RenderScriptRuntime *runtime =
9885ec532a9SColin Riley             (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
9895ec532a9SColin Riley         runtime->DumpModules(result.GetOutputStream());
9905ec532a9SColin Riley         result.SetStatus(eReturnStatusSuccessFinishResult);
9915ec532a9SColin Riley         return true;
9925ec532a9SColin Riley     }
9935ec532a9SColin Riley };
9945ec532a9SColin Riley 
9955ec532a9SColin Riley class CommandObjectRenderScriptRuntimeModule : public CommandObjectMultiword
9965ec532a9SColin Riley {
9975ec532a9SColin Riley   private:
9985ec532a9SColin Riley   public:
9995ec532a9SColin Riley     CommandObjectRenderScriptRuntimeModule(CommandInterpreter &interpreter)
10005ec532a9SColin Riley         : CommandObjectMultiword(interpreter, "renderscript module", "Commands that deal with renderscript modules.",
10015ec532a9SColin Riley                                  NULL)
10025ec532a9SColin Riley     {
10035ec532a9SColin Riley         LoadSubCommand("probe", CommandObjectSP(new CommandObjectRenderScriptRuntimeModuleProbe(interpreter)));
10045ec532a9SColin Riley         LoadSubCommand("dump", CommandObjectSP(new CommandObjectRenderScriptRuntimeModuleDump(interpreter)));
10055ec532a9SColin Riley     }
10065ec532a9SColin Riley 
10075ec532a9SColin Riley     ~CommandObjectRenderScriptRuntimeModule() {}
10085ec532a9SColin Riley };
10095ec532a9SColin Riley 
1010*4640cde1SColin Riley class CommandObjectRenderScriptRuntimeKernelList : public CommandObjectParsed
1011*4640cde1SColin Riley {
1012*4640cde1SColin Riley   private:
1013*4640cde1SColin Riley   public:
1014*4640cde1SColin Riley     CommandObjectRenderScriptRuntimeKernelList(CommandInterpreter &interpreter)
1015*4640cde1SColin Riley         : CommandObjectParsed(interpreter, "renderscript kernel list",
1016*4640cde1SColin Riley                               "Lists renderscript kernel names and associated script resources.", "renderscript kernel list",
1017*4640cde1SColin Riley                               eCommandRequiresProcess | eCommandProcessMustBeLaunched)
1018*4640cde1SColin Riley     {
1019*4640cde1SColin Riley     }
1020*4640cde1SColin Riley 
1021*4640cde1SColin Riley     ~CommandObjectRenderScriptRuntimeKernelList() {}
1022*4640cde1SColin Riley 
1023*4640cde1SColin Riley     bool
1024*4640cde1SColin Riley     DoExecute(Args &command, CommandReturnObject &result)
1025*4640cde1SColin Riley     {
1026*4640cde1SColin Riley         RenderScriptRuntime *runtime =
1027*4640cde1SColin Riley             (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
1028*4640cde1SColin Riley         runtime->DumpKernels(result.GetOutputStream());
1029*4640cde1SColin Riley         result.SetStatus(eReturnStatusSuccessFinishResult);
1030*4640cde1SColin Riley         return true;
1031*4640cde1SColin Riley     }
1032*4640cde1SColin Riley };
1033*4640cde1SColin Riley 
1034*4640cde1SColin Riley class CommandObjectRenderScriptRuntimeKernelBreakpoint : public CommandObjectParsed
1035*4640cde1SColin Riley {
1036*4640cde1SColin Riley   private:
1037*4640cde1SColin Riley   public:
1038*4640cde1SColin Riley     CommandObjectRenderScriptRuntimeKernelBreakpoint(CommandInterpreter &interpreter)
1039*4640cde1SColin Riley         : CommandObjectParsed(interpreter, "renderscript kernel breakpoint",
1040*4640cde1SColin Riley                               "Sets a breakpoint on a renderscript kernel.", "renderscript kernel breakpoint",
1041*4640cde1SColin Riley                               eCommandRequiresProcess | eCommandProcessMustBeLaunched | eCommandProcessMustBePaused)
1042*4640cde1SColin Riley     {
1043*4640cde1SColin Riley     }
1044*4640cde1SColin Riley 
1045*4640cde1SColin Riley     ~CommandObjectRenderScriptRuntimeKernelBreakpoint() {}
1046*4640cde1SColin Riley 
1047*4640cde1SColin Riley     bool
1048*4640cde1SColin Riley     DoExecute(Args &command, CommandReturnObject &result)
1049*4640cde1SColin Riley     {
1050*4640cde1SColin Riley         const size_t argc = command.GetArgumentCount();
1051*4640cde1SColin Riley         if (argc == 1)
1052*4640cde1SColin Riley         {
1053*4640cde1SColin Riley             RenderScriptRuntime *runtime =
1054*4640cde1SColin Riley                 (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
1055*4640cde1SColin Riley 
1056*4640cde1SColin Riley             Error error;
1057*4640cde1SColin Riley             runtime->AttemptBreakpointAtKernelName(result.GetOutputStream(), command.GetArgumentAtIndex(0), error);
1058*4640cde1SColin Riley 
1059*4640cde1SColin Riley             if (error.Success())
1060*4640cde1SColin Riley             {
1061*4640cde1SColin Riley                 result.AppendMessage("Breakpoint(s) created");
1062*4640cde1SColin Riley                 result.SetStatus(eReturnStatusSuccessFinishResult);
1063*4640cde1SColin Riley                 return true;
1064*4640cde1SColin Riley             }
1065*4640cde1SColin Riley             result.SetStatus(eReturnStatusFailed);
1066*4640cde1SColin Riley             result.AppendErrorWithFormat("Error: %s", error.AsCString());
1067*4640cde1SColin Riley             return false;
1068*4640cde1SColin Riley         }
1069*4640cde1SColin Riley 
1070*4640cde1SColin Riley         result.AppendErrorWithFormat("'%s' takes 1 argument of kernel name", m_cmd_name.c_str());
1071*4640cde1SColin Riley         result.SetStatus(eReturnStatusFailed);
1072*4640cde1SColin Riley         return false;
1073*4640cde1SColin Riley     }
1074*4640cde1SColin Riley };
1075*4640cde1SColin Riley 
1076*4640cde1SColin Riley class CommandObjectRenderScriptRuntimeKernel : public CommandObjectMultiword
1077*4640cde1SColin Riley {
1078*4640cde1SColin Riley   private:
1079*4640cde1SColin Riley   public:
1080*4640cde1SColin Riley     CommandObjectRenderScriptRuntimeKernel(CommandInterpreter &interpreter)
1081*4640cde1SColin Riley         : CommandObjectMultiword(interpreter, "renderscript kernel", "Commands that deal with renderscript kernels.",
1082*4640cde1SColin Riley                                  NULL)
1083*4640cde1SColin Riley     {
1084*4640cde1SColin Riley         LoadSubCommand("list", CommandObjectSP(new CommandObjectRenderScriptRuntimeKernelList(interpreter)));
1085*4640cde1SColin Riley         LoadSubCommand("breakpoint", CommandObjectSP(new CommandObjectRenderScriptRuntimeKernelBreakpoint(interpreter)));
1086*4640cde1SColin Riley     }
1087*4640cde1SColin Riley 
1088*4640cde1SColin Riley     ~CommandObjectRenderScriptRuntimeKernel() {}
1089*4640cde1SColin Riley };
1090*4640cde1SColin Riley 
1091*4640cde1SColin Riley class CommandObjectRenderScriptRuntimeContextDump : public CommandObjectParsed
1092*4640cde1SColin Riley {
1093*4640cde1SColin Riley   private:
1094*4640cde1SColin Riley   public:
1095*4640cde1SColin Riley     CommandObjectRenderScriptRuntimeContextDump(CommandInterpreter &interpreter)
1096*4640cde1SColin Riley         : CommandObjectParsed(interpreter, "renderscript context dump",
1097*4640cde1SColin Riley                               "Dumps renderscript context information.", "renderscript context dump",
1098*4640cde1SColin Riley                               eCommandRequiresProcess | eCommandProcessMustBeLaunched)
1099*4640cde1SColin Riley     {
1100*4640cde1SColin Riley     }
1101*4640cde1SColin Riley 
1102*4640cde1SColin Riley     ~CommandObjectRenderScriptRuntimeContextDump() {}
1103*4640cde1SColin Riley 
1104*4640cde1SColin Riley     bool
1105*4640cde1SColin Riley     DoExecute(Args &command, CommandReturnObject &result)
1106*4640cde1SColin Riley     {
1107*4640cde1SColin Riley         RenderScriptRuntime *runtime =
1108*4640cde1SColin Riley             (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
1109*4640cde1SColin Riley         runtime->DumpContexts(result.GetOutputStream());
1110*4640cde1SColin Riley         result.SetStatus(eReturnStatusSuccessFinishResult);
1111*4640cde1SColin Riley         return true;
1112*4640cde1SColin Riley     }
1113*4640cde1SColin Riley };
1114*4640cde1SColin Riley 
1115*4640cde1SColin Riley class CommandObjectRenderScriptRuntimeContext : public CommandObjectMultiword
1116*4640cde1SColin Riley {
1117*4640cde1SColin Riley   private:
1118*4640cde1SColin Riley   public:
1119*4640cde1SColin Riley     CommandObjectRenderScriptRuntimeContext(CommandInterpreter &interpreter)
1120*4640cde1SColin Riley         : CommandObjectMultiword(interpreter, "renderscript context", "Commands that deal with renderscript contexts.",
1121*4640cde1SColin Riley                                  NULL)
1122*4640cde1SColin Riley     {
1123*4640cde1SColin Riley         LoadSubCommand("dump", CommandObjectSP(new CommandObjectRenderScriptRuntimeContextDump(interpreter)));
1124*4640cde1SColin Riley     }
1125*4640cde1SColin Riley 
1126*4640cde1SColin Riley     ~CommandObjectRenderScriptRuntimeContext() {}
1127*4640cde1SColin Riley };
1128*4640cde1SColin Riley 
1129*4640cde1SColin Riley class CommandObjectRenderScriptRuntimeStatus : public CommandObjectParsed
1130*4640cde1SColin Riley {
1131*4640cde1SColin Riley   private:
1132*4640cde1SColin Riley   public:
1133*4640cde1SColin Riley     CommandObjectRenderScriptRuntimeStatus(CommandInterpreter &interpreter)
1134*4640cde1SColin Riley         : CommandObjectParsed(interpreter, "renderscript status",
1135*4640cde1SColin Riley                               "Displays current renderscript runtime status.", "renderscript status",
1136*4640cde1SColin Riley                               eCommandRequiresProcess | eCommandProcessMustBeLaunched)
1137*4640cde1SColin Riley     {
1138*4640cde1SColin Riley     }
1139*4640cde1SColin Riley 
1140*4640cde1SColin Riley     ~CommandObjectRenderScriptRuntimeStatus() {}
1141*4640cde1SColin Riley 
1142*4640cde1SColin Riley     bool
1143*4640cde1SColin Riley     DoExecute(Args &command, CommandReturnObject &result)
1144*4640cde1SColin Riley     {
1145*4640cde1SColin Riley         RenderScriptRuntime *runtime =
1146*4640cde1SColin Riley             (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
1147*4640cde1SColin Riley         runtime->Status(result.GetOutputStream());
1148*4640cde1SColin Riley         result.SetStatus(eReturnStatusSuccessFinishResult);
1149*4640cde1SColin Riley         return true;
1150*4640cde1SColin Riley     }
1151*4640cde1SColin Riley };
1152*4640cde1SColin Riley 
11535ec532a9SColin Riley class CommandObjectRenderScriptRuntime : public CommandObjectMultiword
11545ec532a9SColin Riley {
11555ec532a9SColin Riley   public:
11565ec532a9SColin Riley     CommandObjectRenderScriptRuntime(CommandInterpreter &interpreter)
11575ec532a9SColin Riley         : CommandObjectMultiword(interpreter, "renderscript", "A set of commands for operating on renderscript.",
11585ec532a9SColin Riley                                  "renderscript <subcommand> [<subcommand-options>]")
11595ec532a9SColin Riley     {
11605ec532a9SColin Riley         LoadSubCommand("module", CommandObjectSP(new CommandObjectRenderScriptRuntimeModule(interpreter)));
1161*4640cde1SColin Riley         LoadSubCommand("status", CommandObjectSP(new CommandObjectRenderScriptRuntimeStatus(interpreter)));
1162*4640cde1SColin Riley         LoadSubCommand("kernel", CommandObjectSP(new CommandObjectRenderScriptRuntimeKernel(interpreter)));
1163*4640cde1SColin Riley         LoadSubCommand("context", CommandObjectSP(new CommandObjectRenderScriptRuntimeContext(interpreter)));
11645ec532a9SColin Riley     }
11655ec532a9SColin Riley 
11665ec532a9SColin Riley     ~CommandObjectRenderScriptRuntime() {}
11675ec532a9SColin Riley };
1168ef20b08fSColin Riley 
1169ef20b08fSColin Riley void
1170ef20b08fSColin Riley RenderScriptRuntime::Initiate()
11715ec532a9SColin Riley {
1172ef20b08fSColin Riley     assert(!m_initiated);
11735ec532a9SColin Riley }
1174ef20b08fSColin Riley 
1175ef20b08fSColin Riley RenderScriptRuntime::RenderScriptRuntime(Process *process)
1176*4640cde1SColin Riley     : lldb_private::CPPLanguageRuntime(process), m_initiated(false), m_debuggerPresentFlagged(false)
1177ef20b08fSColin Riley {
1178*4640cde1SColin Riley     ModulesDidLoad(process->GetTarget().GetImages());
1179ef20b08fSColin Riley }
1180*4640cde1SColin Riley 
1181*4640cde1SColin Riley lldb::CommandObjectSP
1182*4640cde1SColin Riley RenderScriptRuntime::GetCommandObject(lldb_private::CommandInterpreter& interpreter)
1183*4640cde1SColin Riley {
1184*4640cde1SColin Riley     static CommandObjectSP command_object;
1185*4640cde1SColin Riley     if(!command_object)
1186*4640cde1SColin Riley     {
1187*4640cde1SColin Riley         command_object.reset(new CommandObjectRenderScriptRuntime(interpreter));
1188*4640cde1SColin Riley     }
1189*4640cde1SColin Riley     return command_object;
1190*4640cde1SColin Riley }
1191*4640cde1SColin Riley 
1192