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"
184640cde1SColin 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"
264640cde1SColin Riley #include "lldb/Breakpoint/StoppointCallbackContext.h"
274640cde1SColin Riley #include "lldb/Target/RegisterContext.h"
284640cde1SColin Riley 
294640cde1SColin Riley #include "lldb/Symbol/VariableList.h"
305ec532a9SColin Riley 
315ec532a9SColin Riley using namespace lldb;
325ec532a9SColin Riley using namespace lldb_private;
3398156583SEwan Crawford using namespace lldb_renderscript;
345ec532a9SColin Riley 
355ec532a9SColin Riley //------------------------------------------------------------------
365ec532a9SColin Riley // Static Functions
375ec532a9SColin Riley //------------------------------------------------------------------
385ec532a9SColin Riley LanguageRuntime *
395ec532a9SColin Riley RenderScriptRuntime::CreateInstance(Process *process, lldb::LanguageType language)
405ec532a9SColin Riley {
415ec532a9SColin Riley 
425ec532a9SColin Riley     if (language == eLanguageTypeExtRenderScript)
435ec532a9SColin Riley         return new RenderScriptRuntime(process);
445ec532a9SColin Riley     else
455ec532a9SColin Riley         return NULL;
465ec532a9SColin Riley }
475ec532a9SColin Riley 
4898156583SEwan Crawford // Callback with a module to search for matching symbols.
4998156583SEwan Crawford // We first check that the module contains RS kernels.
5098156583SEwan Crawford // Then look for a symbol which matches our kernel name.
5198156583SEwan Crawford // The breakpoint address is finally set using the address of this symbol.
5298156583SEwan Crawford Searcher::CallbackReturn
5398156583SEwan Crawford RSBreakpointResolver::SearchCallback(SearchFilter &filter,
5498156583SEwan Crawford                                      SymbolContext &context,
5598156583SEwan Crawford                                      Address*,
5698156583SEwan Crawford                                      bool)
5798156583SEwan Crawford {
5898156583SEwan Crawford     ModuleSP module = context.module_sp;
5998156583SEwan Crawford 
6098156583SEwan Crawford     if (!module)
6198156583SEwan Crawford         return Searcher::eCallbackReturnContinue;
6298156583SEwan Crawford 
6398156583SEwan Crawford     // Is this a module containing renderscript kernels?
6498156583SEwan Crawford     if (nullptr == module->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), eSymbolTypeData))
6598156583SEwan Crawford         return Searcher::eCallbackReturnContinue;
6698156583SEwan Crawford 
6798156583SEwan Crawford     // Attempt to set a breakpoint on the kernel name symbol within the module library.
6898156583SEwan Crawford     // If it's not found, it's likely debug info is unavailable - try to set a
6998156583SEwan Crawford     // breakpoint on <name>.expand.
7098156583SEwan Crawford 
7198156583SEwan Crawford     const Symbol* kernel_sym = module->FindFirstSymbolWithNameAndType(m_kernel_name, eSymbolTypeCode);
7298156583SEwan Crawford     if (!kernel_sym)
7398156583SEwan Crawford     {
7498156583SEwan Crawford         std::string kernel_name_expanded(m_kernel_name.AsCString());
7598156583SEwan Crawford         kernel_name_expanded.append(".expand");
7698156583SEwan Crawford         kernel_sym = module->FindFirstSymbolWithNameAndType(ConstString(kernel_name_expanded.c_str()), eSymbolTypeCode);
7798156583SEwan Crawford     }
7898156583SEwan Crawford 
7998156583SEwan Crawford     if (kernel_sym)
8098156583SEwan Crawford     {
8198156583SEwan Crawford         Address bp_addr = kernel_sym->GetAddress();
8298156583SEwan Crawford         if (filter.AddressPasses(bp_addr))
8398156583SEwan Crawford             m_breakpoint->AddLocation(bp_addr);
8498156583SEwan Crawford     }
8598156583SEwan Crawford 
8698156583SEwan Crawford     return Searcher::eCallbackReturnContinue;
8798156583SEwan Crawford }
8898156583SEwan Crawford 
895ec532a9SColin Riley void
905ec532a9SColin Riley RenderScriptRuntime::Initialize()
915ec532a9SColin Riley {
924640cde1SColin Riley     PluginManager::RegisterPlugin(GetPluginNameStatic(), "RenderScript language support", CreateInstance, GetCommandObject);
935ec532a9SColin Riley }
945ec532a9SColin Riley 
955ec532a9SColin Riley void
965ec532a9SColin Riley RenderScriptRuntime::Terminate()
975ec532a9SColin Riley {
985ec532a9SColin Riley     PluginManager::UnregisterPlugin(CreateInstance);
995ec532a9SColin Riley }
1005ec532a9SColin Riley 
1015ec532a9SColin Riley lldb_private::ConstString
1025ec532a9SColin Riley RenderScriptRuntime::GetPluginNameStatic()
1035ec532a9SColin Riley {
1045ec532a9SColin Riley     static ConstString g_name("renderscript");
1055ec532a9SColin Riley     return g_name;
1065ec532a9SColin Riley }
1075ec532a9SColin Riley 
108ef20b08fSColin Riley RenderScriptRuntime::ModuleKind
109ef20b08fSColin Riley RenderScriptRuntime::GetModuleKind(const lldb::ModuleSP &module_sp)
110ef20b08fSColin Riley {
111ef20b08fSColin Riley     if (module_sp)
112ef20b08fSColin Riley     {
113ef20b08fSColin Riley         // Is this a module containing renderscript kernels?
114ef20b08fSColin Riley         const Symbol *info_sym = module_sp->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), eSymbolTypeData);
115ef20b08fSColin Riley         if (info_sym)
116ef20b08fSColin Riley         {
117ef20b08fSColin Riley             return eModuleKindKernelObj;
118ef20b08fSColin Riley         }
1194640cde1SColin Riley 
1204640cde1SColin Riley         // Is this the main RS runtime library
1214640cde1SColin Riley         const ConstString rs_lib("libRS.so");
1224640cde1SColin Riley         if (module_sp->GetFileSpec().GetFilename() == rs_lib)
1234640cde1SColin Riley         {
1244640cde1SColin Riley             return eModuleKindLibRS;
1254640cde1SColin Riley         }
1264640cde1SColin Riley 
1274640cde1SColin Riley         const ConstString rs_driverlib("libRSDriver.so");
1284640cde1SColin Riley         if (module_sp->GetFileSpec().GetFilename() == rs_driverlib)
1294640cde1SColin Riley         {
1304640cde1SColin Riley             return eModuleKindDriver;
1314640cde1SColin Riley         }
1324640cde1SColin Riley 
1334640cde1SColin Riley         const ConstString rs_cpureflib("libRSCPURef.so");
1344640cde1SColin Riley         if (module_sp->GetFileSpec().GetFilename() == rs_cpureflib)
1354640cde1SColin Riley         {
1364640cde1SColin Riley             return eModuleKindImpl;
1374640cde1SColin Riley         }
1384640cde1SColin Riley 
139ef20b08fSColin Riley     }
140ef20b08fSColin Riley     return eModuleKindIgnored;
141ef20b08fSColin Riley }
142ef20b08fSColin Riley 
143ef20b08fSColin Riley bool
144ef20b08fSColin Riley RenderScriptRuntime::IsRenderScriptModule(const lldb::ModuleSP &module_sp)
145ef20b08fSColin Riley {
146ef20b08fSColin Riley     return GetModuleKind(module_sp) != eModuleKindIgnored;
147ef20b08fSColin Riley }
148ef20b08fSColin Riley 
149ef20b08fSColin Riley 
150ef20b08fSColin Riley void
151ef20b08fSColin Riley RenderScriptRuntime::ModulesDidLoad(const ModuleList &module_list )
152ef20b08fSColin Riley {
153ef20b08fSColin Riley     Mutex::Locker locker (module_list.GetMutex ());
154ef20b08fSColin Riley 
155ef20b08fSColin Riley     size_t num_modules = module_list.GetSize();
156ef20b08fSColin Riley     for (size_t i = 0; i < num_modules; i++)
157ef20b08fSColin Riley     {
158ef20b08fSColin Riley         auto mod = module_list.GetModuleAtIndex (i);
159ef20b08fSColin Riley         if (IsRenderScriptModule (mod))
160ef20b08fSColin Riley         {
161ef20b08fSColin Riley             LoadModule(mod);
162ef20b08fSColin Riley         }
163ef20b08fSColin Riley     }
164ef20b08fSColin Riley }
165ef20b08fSColin Riley 
166ef20b08fSColin Riley 
1675ec532a9SColin Riley //------------------------------------------------------------------
1685ec532a9SColin Riley // PluginInterface protocol
1695ec532a9SColin Riley //------------------------------------------------------------------
1705ec532a9SColin Riley lldb_private::ConstString
1715ec532a9SColin Riley RenderScriptRuntime::GetPluginName()
1725ec532a9SColin Riley {
1735ec532a9SColin Riley     return GetPluginNameStatic();
1745ec532a9SColin Riley }
1755ec532a9SColin Riley 
1765ec532a9SColin Riley uint32_t
1775ec532a9SColin Riley RenderScriptRuntime::GetPluginVersion()
1785ec532a9SColin Riley {
1795ec532a9SColin Riley     return 1;
1805ec532a9SColin Riley }
1815ec532a9SColin Riley 
1825ec532a9SColin Riley bool
1835ec532a9SColin Riley RenderScriptRuntime::IsVTableName(const char *name)
1845ec532a9SColin Riley {
1855ec532a9SColin Riley     return false;
1865ec532a9SColin Riley }
1875ec532a9SColin Riley 
1885ec532a9SColin Riley bool
1895ec532a9SColin Riley RenderScriptRuntime::GetDynamicTypeAndAddress(ValueObject &in_value, lldb::DynamicValueType use_dynamic,
1900b6003f3SEnrico Granata                                               TypeAndOrName &class_type_or_name, Address &address,
1910b6003f3SEnrico Granata                                               Value::ValueType &value_type)
1925ec532a9SColin Riley {
1935ec532a9SColin Riley     return false;
1945ec532a9SColin Riley }
1955ec532a9SColin Riley 
1965ec532a9SColin Riley bool
1975ec532a9SColin Riley RenderScriptRuntime::CouldHaveDynamicValue(ValueObject &in_value)
1985ec532a9SColin Riley {
1995ec532a9SColin Riley     return false;
2005ec532a9SColin Riley }
2015ec532a9SColin Riley 
2025ec532a9SColin Riley lldb::BreakpointResolverSP
2035ec532a9SColin Riley RenderScriptRuntime::CreateExceptionResolver(Breakpoint *bkpt, bool catch_bp, bool throw_bp)
2045ec532a9SColin Riley {
2055ec532a9SColin Riley     BreakpointResolverSP resolver_sp;
2065ec532a9SColin Riley     return resolver_sp;
2075ec532a9SColin Riley }
2085ec532a9SColin Riley 
2094640cde1SColin Riley 
2104640cde1SColin Riley const RenderScriptRuntime::HookDefn RenderScriptRuntime::s_runtimeHookDefns[] =
2114640cde1SColin Riley {
2124640cde1SColin Riley     //rsdScript
213*82780287SAidan Dodds     {
214*82780287SAidan Dodds         "rsdScriptInit", //name
215*82780287SAidan Dodds         "_Z13rsdScriptInitPKN7android12renderscript7ContextEPNS0_7ScriptCEPKcS7_PKhjj", // symbol name 32 bit
216*82780287SAidan Dodds         "_Z13rsdScriptInitPKN7android12renderscript7ContextEPNS0_7ScriptCEPKcS7_PKhmj", // symbol name 64 bit
217*82780287SAidan Dodds         0, // version
218*82780287SAidan Dodds         RenderScriptRuntime::eModuleKindDriver, // type
219*82780287SAidan Dodds         &lldb_private::RenderScriptRuntime::CaptureScriptInit1 // handler
220*82780287SAidan Dodds     },
221*82780287SAidan Dodds     {
222*82780287SAidan Dodds         "rsdScriptInvokeForEach", // name
223*82780287SAidan Dodds         "_Z22rsdScriptInvokeForEachPKN7android12renderscript7ContextEPNS0_6ScriptEjPKNS0_10AllocationEPS6_PKvjPK12RsScriptCall", // symbol name 32bit
224*82780287SAidan Dodds         "_Z22rsdScriptInvokeForEachPKN7android12renderscript7ContextEPNS0_6ScriptEjPKNS0_10AllocationEPS6_PKvmPK12RsScriptCall", // symbol name 64bit
225*82780287SAidan Dodds         0, // version
226*82780287SAidan Dodds         RenderScriptRuntime::eModuleKindDriver, // type
227*82780287SAidan Dodds         nullptr // handler
228*82780287SAidan Dodds     },
229*82780287SAidan Dodds     {
230*82780287SAidan Dodds         "rsdScriptInvokeForEachMulti", // name
231*82780287SAidan Dodds         "_Z27rsdScriptInvokeForEachMultiPKN7android12renderscript7ContextEPNS0_6ScriptEjPPKNS0_10AllocationEjPS6_PKvjPK12RsScriptCall", // symbol name 32bit
232*82780287SAidan Dodds         "_Z27rsdScriptInvokeForEachMultiPKN7android12renderscript7ContextEPNS0_6ScriptEjPPKNS0_10AllocationEmPS6_PKvmPK12RsScriptCall", // symbol name 64bit
233*82780287SAidan Dodds         0, // version
234*82780287SAidan Dodds         RenderScriptRuntime::eModuleKindDriver, // type
235*82780287SAidan Dodds         nullptr // handler
236*82780287SAidan Dodds     },
237*82780287SAidan Dodds     {
238*82780287SAidan Dodds         "rsdScriptInvokeFunction", // name
239*82780287SAidan Dodds         "_Z23rsdScriptInvokeFunctionPKN7android12renderscript7ContextEPNS0_6ScriptEjPKvj", // symbol name 32bit
240*82780287SAidan Dodds         "_Z23rsdScriptInvokeFunctionPKN7android12renderscript7ContextEPNS0_6ScriptEjPKvm", // symbol name 64bit
241*82780287SAidan Dodds         0, // version
242*82780287SAidan Dodds         RenderScriptRuntime::eModuleKindDriver, // type
243*82780287SAidan Dodds         nullptr // handler
244*82780287SAidan Dodds     },
245*82780287SAidan Dodds     {
246*82780287SAidan Dodds         "rsdScriptSetGlobalVar", // name
247*82780287SAidan Dodds         "_Z21rsdScriptSetGlobalVarPKN7android12renderscript7ContextEPKNS0_6ScriptEjPvj", // symbol name 32bit
248*82780287SAidan Dodds         "_Z21rsdScriptSetGlobalVarPKN7android12renderscript7ContextEPKNS0_6ScriptEjPvm", // symbol name 64bit
249*82780287SAidan Dodds         0, // version
250*82780287SAidan Dodds         RenderScriptRuntime::eModuleKindDriver, // type
251*82780287SAidan Dodds         &lldb_private::RenderScriptRuntime::CaptureSetGlobalVar1 // handler
252*82780287SAidan Dodds     },
2534640cde1SColin Riley 
2544640cde1SColin Riley     //rsdAllocation
255*82780287SAidan Dodds     {
256*82780287SAidan Dodds         "rsdAllocationInit", // name
257*82780287SAidan Dodds         "_Z17rsdAllocationInitPKN7android12renderscript7ContextEPNS0_10AllocationEb", // symbol name 32bit
258*82780287SAidan Dodds         "_Z17rsdAllocationInitPKN7android12renderscript7ContextEPNS0_10AllocationEb", // symbol name 64bit
259*82780287SAidan Dodds         0, // version
260*82780287SAidan Dodds         RenderScriptRuntime::eModuleKindDriver, // type
261*82780287SAidan Dodds         &lldb_private::RenderScriptRuntime::CaptureAllocationInit1 // handler
262*82780287SAidan Dodds     },
263*82780287SAidan Dodds     {
264*82780287SAidan Dodds         "rsdAllocationRead2D", //name
265*82780287SAidan Dodds         "_Z19rsdAllocationRead2DPKN7android12renderscript7ContextEPKNS0_10AllocationEjjj23RsAllocationCubemapFacejjPvjj", // symbol name 32bit
266*82780287SAidan Dodds         "_Z19rsdAllocationRead2DPKN7android12renderscript7ContextEPKNS0_10AllocationEjjj23RsAllocationCubemapFacejjPvmm", // symbol name 64bit
267*82780287SAidan Dodds         0, // version
268*82780287SAidan Dodds         RenderScriptRuntime::eModuleKindDriver, // type
269*82780287SAidan Dodds         nullptr // handler
270*82780287SAidan Dodds     },
2714640cde1SColin Riley };
2724640cde1SColin Riley const size_t RenderScriptRuntime::s_runtimeHookCount = sizeof(s_runtimeHookDefns)/sizeof(s_runtimeHookDefns[0]);
2734640cde1SColin Riley 
2744640cde1SColin Riley 
2754640cde1SColin Riley bool
2764640cde1SColin Riley RenderScriptRuntime::HookCallback(void *baton, StoppointCallbackContext *ctx, lldb::user_id_t break_id, lldb::user_id_t break_loc_id)
2774640cde1SColin Riley {
2784640cde1SColin Riley     RuntimeHook* hook_info = (RuntimeHook*)baton;
2794640cde1SColin Riley     ExecutionContext context(ctx->exe_ctx_ref);
2804640cde1SColin Riley 
2814640cde1SColin Riley     RenderScriptRuntime *lang_rt = (RenderScriptRuntime *)context.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
2824640cde1SColin Riley 
2834640cde1SColin Riley     lang_rt->HookCallback(hook_info, context);
2844640cde1SColin Riley 
2854640cde1SColin Riley     return false;
2864640cde1SColin Riley }
2874640cde1SColin Riley 
2884640cde1SColin Riley 
2894640cde1SColin Riley void
2904640cde1SColin Riley RenderScriptRuntime::HookCallback(RuntimeHook* hook_info, ExecutionContext& context)
2914640cde1SColin Riley {
2924640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
2934640cde1SColin Riley 
2944640cde1SColin Riley     if (log)
2954640cde1SColin Riley         log->Printf ("RenderScriptRuntime::HookCallback - '%s' .", hook_info->defn->name);
2964640cde1SColin Riley 
2974640cde1SColin Riley     if (hook_info->defn->grabber)
2984640cde1SColin Riley     {
2994640cde1SColin Riley         (this->*(hook_info->defn->grabber))(hook_info, context);
3004640cde1SColin Riley     }
3014640cde1SColin Riley }
3024640cde1SColin Riley 
3034640cde1SColin Riley 
3044640cde1SColin Riley bool
305*82780287SAidan Dodds RenderScriptRuntime::GetArgSimple(ExecutionContext &context, uint32_t arg, uint64_t *data)
3064640cde1SColin Riley {
3074640cde1SColin Riley     if (!data)
3084640cde1SColin Riley         return false;
3094640cde1SColin Riley 
310*82780287SAidan Dodds     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
3114640cde1SColin Riley     Error error;
3124640cde1SColin Riley     RegisterContext* reg_ctx = context.GetRegisterContext();
3134640cde1SColin Riley     Process* process = context.GetProcessPtr();
314*82780287SAidan Dodds     bool success = false; // return value
3154640cde1SColin Riley 
316*82780287SAidan Dodds     if (!context.GetTargetPtr())
317*82780287SAidan Dodds     {
318*82780287SAidan Dodds         if (log)
319*82780287SAidan Dodds             log->Printf("RenderScriptRuntime::GetArgSimple - Invalid target");
320*82780287SAidan Dodds 
321*82780287SAidan Dodds         return false;
322*82780287SAidan Dodds     }
323*82780287SAidan Dodds 
324*82780287SAidan Dodds     switch (context.GetTargetPtr()->GetArchitecture().GetMachine())
325*82780287SAidan Dodds     {
326*82780287SAidan Dodds         case llvm::Triple::ArchType::x86:
3274640cde1SColin Riley         {
3284640cde1SColin Riley             uint64_t sp = reg_ctx->GetSP();
3294640cde1SColin Riley             uint32_t offset = (1 + arg) * sizeof(uint32_t);
330*82780287SAidan Dodds             uint32_t result = 0;
331*82780287SAidan Dodds             process->ReadMemory(sp + offset, &result, sizeof(uint32_t), error);
3324640cde1SColin Riley             if (error.Fail())
3334640cde1SColin Riley             {
3344640cde1SColin Riley                 if (log)
335*82780287SAidan Dodds                     log->Printf ("RenderScriptRuntime:: GetArgSimple - error reading X86 stack: %s.", error.AsCString());
3364640cde1SColin Riley             }
337*82780287SAidan Dodds             else
3384640cde1SColin Riley             {
339*82780287SAidan Dodds                 *data = result;
340*82780287SAidan Dodds                 success = true;
341*82780287SAidan Dodds             }
342*82780287SAidan Dodds 
343*82780287SAidan Dodds             break;
344*82780287SAidan Dodds         }
345*82780287SAidan Dodds         case llvm::Triple::ArchType::arm:
346*82780287SAidan Dodds         {
347*82780287SAidan Dodds             // arm 32 bit
3484640cde1SColin Riley             if (arg < 4)
3494640cde1SColin Riley             {
3504640cde1SColin Riley                 const RegisterInfo* rArg = reg_ctx->GetRegisterInfoAtIndex(arg);
3514640cde1SColin Riley                 RegisterValue rVal;
3524640cde1SColin Riley                 reg_ctx->ReadRegister(rArg, rVal);
3534640cde1SColin Riley                 (*data) = rVal.GetAsUInt32();
354*82780287SAidan Dodds                 success = true;
3554640cde1SColin Riley             }
3564640cde1SColin Riley             else
3574640cde1SColin Riley             {
3584640cde1SColin Riley                 uint64_t sp = reg_ctx->GetSP();
3594640cde1SColin Riley                 {
3604640cde1SColin Riley                     uint32_t offset = (arg-4) * sizeof(uint32_t);
3614640cde1SColin Riley                     process->ReadMemory(sp + offset, &data, sizeof(uint32_t), error);
3624640cde1SColin Riley                     if (error.Fail())
3634640cde1SColin Riley                     {
3644640cde1SColin Riley                         if (log)
365*82780287SAidan Dodds                             log->Printf ("RenderScriptRuntime:: GetArgSimple - error reading ARM stack: %s.", error.AsCString());
366*82780287SAidan Dodds                     }
367*82780287SAidan Dodds                     else
368*82780287SAidan Dodds                     {
369*82780287SAidan Dodds                         success = true;
3704640cde1SColin Riley                     }
3714640cde1SColin Riley                 }
3724640cde1SColin Riley             }
373*82780287SAidan Dodds 
374*82780287SAidan Dodds             break;
3754640cde1SColin Riley         }
376*82780287SAidan Dodds         case llvm::Triple::ArchType::aarch64:
377*82780287SAidan Dodds         {
378*82780287SAidan Dodds             // arm 64 bit
379*82780287SAidan Dodds             // first 8 arguments are in the registers
380*82780287SAidan Dodds             if (arg < 8)
381*82780287SAidan Dodds             {
382*82780287SAidan Dodds                 const RegisterInfo* rArg = reg_ctx->GetRegisterInfoAtIndex(arg);
383*82780287SAidan Dodds                 RegisterValue rVal;
384*82780287SAidan Dodds                 success = reg_ctx->ReadRegister(rArg, rVal);
385*82780287SAidan Dodds                 if (success)
386*82780287SAidan Dodds                 {
387*82780287SAidan Dodds                     *data = rVal.GetAsUInt64();
388*82780287SAidan Dodds                 }
389*82780287SAidan Dodds                 else
390*82780287SAidan Dodds                 {
391*82780287SAidan Dodds                     if (log)
392*82780287SAidan Dodds                         log->Printf("RenderScriptRuntime::GetArgSimple() - AARCH64 - Error while reading the argument #%d", arg);
393*82780287SAidan Dodds                 }
394*82780287SAidan Dodds             }
395*82780287SAidan Dodds             else
396*82780287SAidan Dodds             {
397*82780287SAidan Dodds                 // @TODO: need to find the argument in the stack
398*82780287SAidan Dodds                 if (log)
399*82780287SAidan Dodds                     log->Printf("RenderScriptRuntime::GetArgSimple - AARCH64 - FOR #ARG >= 8 NOT IMPLEMENTED YET. Argument number: %d", arg);
400*82780287SAidan Dodds             }
401*82780287SAidan Dodds             break;
402*82780287SAidan Dodds         }
403*82780287SAidan Dodds         default:
404*82780287SAidan Dodds         {
405*82780287SAidan Dodds             // invalid architecture
406*82780287SAidan Dodds             if (log)
407*82780287SAidan Dodds                 log->Printf("RenderScriptRuntime::GetArgSimple - Architecture not supported");
408*82780287SAidan Dodds 
409*82780287SAidan Dodds         }
410*82780287SAidan Dodds     }
411*82780287SAidan Dodds 
412*82780287SAidan Dodds 
413*82780287SAidan Dodds     return success;
4144640cde1SColin Riley }
4154640cde1SColin Riley 
4164640cde1SColin Riley void
4174640cde1SColin Riley RenderScriptRuntime::CaptureSetGlobalVar1(RuntimeHook* hook_info, ExecutionContext& context)
4184640cde1SColin Riley {
4194640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
4204640cde1SColin Riley 
4214640cde1SColin Riley     //Context, Script, int, data, length
4224640cde1SColin Riley 
423*82780287SAidan Dodds     uint64_t rs_context_u64 = 0U;
424*82780287SAidan Dodds     uint64_t rs_script_u64 = 0U;
425*82780287SAidan Dodds     uint64_t rs_id_u64 = 0U;
426*82780287SAidan Dodds     uint64_t rs_data_u64 = 0U;
427*82780287SAidan Dodds     uint64_t rs_length_u64 = 0U;
4284640cde1SColin Riley 
429*82780287SAidan Dodds     bool success =
430*82780287SAidan Dodds         GetArgSimple(context, 0, &rs_context_u64) &&
431*82780287SAidan Dodds         GetArgSimple(context, 1, &rs_script_u64) &&
432*82780287SAidan Dodds         GetArgSimple(context, 2, &rs_id_u64) &&
433*82780287SAidan Dodds         GetArgSimple(context, 3, &rs_data_u64) &&
434*82780287SAidan Dodds         GetArgSimple(context, 4, &rs_length_u64);
4354640cde1SColin Riley 
436*82780287SAidan Dodds     if (!success)
437*82780287SAidan Dodds     {
438*82780287SAidan Dodds         if (log)
439*82780287SAidan Dodds             log->Printf("RenderScriptRuntime::CaptureSetGlobalVar1 - Error while reading the function parameters");
440*82780287SAidan Dodds         return;
441*82780287SAidan Dodds     }
4424640cde1SColin Riley 
4434640cde1SColin Riley     if (log)
4444640cde1SColin Riley     {
4454640cde1SColin Riley         log->Printf ("RenderScriptRuntime::CaptureSetGlobalVar1 - 0x%" PRIx64 ",0x%" PRIx64 " slot %" PRIu64 " = 0x%" PRIx64 ":%" PRIu64 "bytes.",
446*82780287SAidan Dodds                         rs_context_u64, rs_script_u64, rs_id_u64, rs_data_u64, rs_length_u64);
4474640cde1SColin Riley 
448*82780287SAidan Dodds         addr_t script_addr =  (addr_t)rs_script_u64;
4494640cde1SColin Riley         if (m_scriptMappings.find( script_addr ) != m_scriptMappings.end())
4504640cde1SColin Riley         {
4514640cde1SColin Riley             auto rsm = m_scriptMappings[script_addr];
452*82780287SAidan Dodds             if (rs_id_u64 < rsm->m_globals.size())
4534640cde1SColin Riley             {
454*82780287SAidan Dodds                 auto rsg = rsm->m_globals[rs_id_u64];
4554640cde1SColin Riley                 log->Printf ("RenderScriptRuntime::CaptureSetGlobalVar1 - Setting of '%s' within '%s' inferred", rsg.m_name.AsCString(),
4564640cde1SColin Riley                                 rsm->m_module->GetFileSpec().GetFilename().AsCString());
4574640cde1SColin Riley             }
4584640cde1SColin Riley         }
4594640cde1SColin Riley     }
4604640cde1SColin Riley }
4614640cde1SColin Riley 
4624640cde1SColin Riley void
4634640cde1SColin Riley RenderScriptRuntime::CaptureAllocationInit1(RuntimeHook* hook_info, ExecutionContext& context)
4644640cde1SColin Riley {
4654640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
4664640cde1SColin Riley 
4674640cde1SColin Riley     //Context, Alloc, bool
4684640cde1SColin Riley 
469*82780287SAidan Dodds     uint64_t rs_context_u64 = 0U;
470*82780287SAidan Dodds     uint64_t rs_alloc_u64 = 0U;
471*82780287SAidan Dodds     uint64_t rs_forceZero_u64 = 0U;
4724640cde1SColin Riley 
473*82780287SAidan Dodds     bool success =
474*82780287SAidan Dodds         GetArgSimple(context, 0, &rs_context_u64) &&
475*82780287SAidan Dodds         GetArgSimple(context, 1, &rs_alloc_u64) &&
476*82780287SAidan Dodds         GetArgSimple(context, 2, &rs_forceZero_u64);
477*82780287SAidan Dodds     if (!success) // error case
478*82780287SAidan Dodds     {
479*82780287SAidan Dodds         if (log)
480*82780287SAidan Dodds             log->Printf("RenderScriptRuntime::CaptureAllocationInit1 - Error while reading the function parameters");
481*82780287SAidan Dodds         return; // abort
482*82780287SAidan Dodds     }
4834640cde1SColin Riley 
4844640cde1SColin Riley     if (log)
4854640cde1SColin Riley         log->Printf ("RenderScriptRuntime::CaptureAllocationInit1 - 0x%" PRIx64 ",0x%" PRIx64 ",0x%" PRIx64 " .",
486*82780287SAidan Dodds                         rs_context_u64, rs_alloc_u64, rs_forceZero_u64);
4874640cde1SColin Riley }
4884640cde1SColin Riley 
4894640cde1SColin Riley void
4904640cde1SColin Riley RenderScriptRuntime::CaptureScriptInit1(RuntimeHook* hook_info, ExecutionContext& context)
4914640cde1SColin Riley {
4924640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
4934640cde1SColin Riley 
4944640cde1SColin Riley     //Context, Script, resname Str, cachedir Str
4954640cde1SColin Riley     Error error;
4964640cde1SColin Riley     Process* process = context.GetProcessPtr();
4974640cde1SColin Riley 
498*82780287SAidan Dodds     uint64_t rs_context_u64 = 0U;
499*82780287SAidan Dodds     uint64_t rs_script_u64 = 0U;
500*82780287SAidan Dodds     uint64_t rs_resnameptr_u64 = 0U;
501*82780287SAidan Dodds     uint64_t rs_cachedirptr_u64 = 0U;
5024640cde1SColin Riley 
5034640cde1SColin Riley     std::string resname;
5044640cde1SColin Riley     std::string cachedir;
5054640cde1SColin Riley 
506*82780287SAidan Dodds     // read the function parameters
507*82780287SAidan Dodds     bool success =
508*82780287SAidan Dodds         GetArgSimple(context, 0, &rs_context_u64) &&
509*82780287SAidan Dodds         GetArgSimple(context, 1, &rs_script_u64) &&
510*82780287SAidan Dodds         GetArgSimple(context, 2, &rs_resnameptr_u64) &&
511*82780287SAidan Dodds         GetArgSimple(context, 3, &rs_cachedirptr_u64);
5124640cde1SColin Riley 
513*82780287SAidan Dodds     if (!success)
514*82780287SAidan Dodds     {
515*82780287SAidan Dodds         if (log)
516*82780287SAidan Dodds             log->Printf("RenderScriptRuntime::CaptureScriptInit1 - Error while reading the function parameters");
517*82780287SAidan Dodds         return;
518*82780287SAidan Dodds     }
519*82780287SAidan Dodds 
520*82780287SAidan Dodds     process->ReadCStringFromMemory((lldb::addr_t)rs_resnameptr_u64, resname, error);
5214640cde1SColin Riley     if (error.Fail())
5224640cde1SColin Riley     {
5234640cde1SColin Riley         if (log)
5244640cde1SColin Riley             log->Printf ("RenderScriptRuntime::CaptureScriptInit1 - error reading resname: %s.", error.AsCString());
5254640cde1SColin Riley 
5264640cde1SColin Riley     }
5274640cde1SColin Riley 
528*82780287SAidan Dodds     process->ReadCStringFromMemory((lldb::addr_t)rs_cachedirptr_u64, cachedir, error);
5294640cde1SColin Riley     if (error.Fail())
5304640cde1SColin Riley     {
5314640cde1SColin Riley         if (log)
5324640cde1SColin Riley             log->Printf ("RenderScriptRuntime::CaptureScriptInit1 - error reading cachedir: %s.", error.AsCString());
5334640cde1SColin Riley     }
5344640cde1SColin Riley 
5354640cde1SColin Riley     if (log)
5364640cde1SColin Riley         log->Printf ("RenderScriptRuntime::CaptureScriptInit1 - 0x%" PRIx64 ",0x%" PRIx64 " => '%s' at '%s' .",
537*82780287SAidan Dodds                      rs_context_u64, rs_script_u64, resname.c_str(), cachedir.c_str());
5384640cde1SColin Riley 
5394640cde1SColin Riley     if (resname.size() > 0)
5404640cde1SColin Riley     {
5414640cde1SColin Riley         StreamString strm;
5424640cde1SColin Riley         strm.Printf("librs.%s.so", resname.c_str());
5434640cde1SColin Riley 
5444640cde1SColin Riley         ScriptDetails script;
5454640cde1SColin Riley         script.cachedir = cachedir;
5464640cde1SColin Riley         script.resname = resname;
5474640cde1SColin Riley         script.scriptDyLib.assign(strm.GetData());
548*82780287SAidan Dodds         script.script = (addr_t) rs_script_u64;
549*82780287SAidan Dodds         script.context = (addr_t) rs_context_u64;
5504640cde1SColin Riley 
5514640cde1SColin Riley         m_scripts.push_back(script);
5524640cde1SColin Riley 
5534640cde1SColin Riley         if (log)
5544640cde1SColin Riley             log->Printf ("RenderScriptRuntime::CaptureScriptInit1 - '%s' tagged with context 0x%" PRIx64 " and script 0x%" PRIx64 ".",
555*82780287SAidan Dodds                          strm.GetData(), rs_context_u64, rs_script_u64);
5564640cde1SColin Riley     }
5574640cde1SColin Riley     else if (log)
5584640cde1SColin Riley     {
5594640cde1SColin Riley         log->Printf ("RenderScriptRuntime::CaptureScriptInit1 - resource name invalid, Script not tagged");
5604640cde1SColin Riley     }
5614640cde1SColin Riley 
5624640cde1SColin Riley }
5634640cde1SColin Riley 
5644640cde1SColin Riley 
5654640cde1SColin Riley void
5664640cde1SColin Riley RenderScriptRuntime::LoadRuntimeHooks(lldb::ModuleSP module, ModuleKind kind)
5674640cde1SColin Riley {
5684640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
5694640cde1SColin Riley 
5704640cde1SColin Riley     if (!module)
5714640cde1SColin Riley     {
5724640cde1SColin Riley         return;
5734640cde1SColin Riley     }
5744640cde1SColin Riley 
575*82780287SAidan Dodds     Target &target = GetProcess()->GetTarget();
576*82780287SAidan Dodds     llvm::Triple::ArchType targetArchType = target.GetArchitecture().GetMachine();
577*82780287SAidan Dodds 
578*82780287SAidan Dodds     if (targetArchType != llvm::Triple::ArchType::x86
579*82780287SAidan Dodds         && targetArchType != llvm::Triple::ArchType::arm
580*82780287SAidan Dodds         && targetArchType != llvm::Triple::ArchType::aarch64)
5814640cde1SColin Riley     {
5824640cde1SColin Riley         if (log)
5834640cde1SColin Riley             log->Printf ("RenderScriptRuntime::LoadRuntimeHooks - Unable to hook runtime. Only X86, ARM supported currently.");
5844640cde1SColin Riley 
5854640cde1SColin Riley         return;
5864640cde1SColin Riley     }
5874640cde1SColin Riley 
588*82780287SAidan Dodds     uint32_t archByteSize = target.GetArchitecture().GetAddressByteSize();
5894640cde1SColin Riley 
5904640cde1SColin Riley     for (size_t idx = 0; idx < s_runtimeHookCount; idx++)
5914640cde1SColin Riley     {
5924640cde1SColin Riley         const HookDefn* hook_defn = &s_runtimeHookDefns[idx];
5934640cde1SColin Riley         if (hook_defn->kind != kind) {
5944640cde1SColin Riley             continue;
5954640cde1SColin Riley         }
5964640cde1SColin Riley 
597*82780287SAidan Dodds         const char* symbol_name = (archByteSize == 4) ? hook_defn->symbol_name_m32 : hook_defn->symbol_name_m64;
598*82780287SAidan Dodds 
599*82780287SAidan Dodds         const Symbol *sym = module->FindFirstSymbolWithNameAndType(ConstString(symbol_name), eSymbolTypeCode);
600*82780287SAidan Dodds         if (!sym){
601*82780287SAidan Dodds             if (log){
602*82780287SAidan Dodds                 log->Printf("RenderScriptRuntime::LoadRuntimeHooks - ERROR: Symbol '%s' related to the function %s not found", symbol_name, hook_defn->name);
603*82780287SAidan Dodds             }
604*82780287SAidan Dodds             continue;
605*82780287SAidan Dodds         }
6064640cde1SColin Riley 
607358cf1eaSGreg Clayton         addr_t addr = sym->GetLoadAddress(&target);
6084640cde1SColin Riley         if (addr == LLDB_INVALID_ADDRESS)
6094640cde1SColin Riley         {
6104640cde1SColin Riley             if (log)
6114640cde1SColin Riley                 log->Printf ("RenderScriptRuntime::LoadRuntimeHooks - Unable to resolve the address of hook function '%s' with symbol '%s'.",
612*82780287SAidan Dodds                              hook_defn->name, symbol_name);
6134640cde1SColin Riley             continue;
6144640cde1SColin Riley         }
615*82780287SAidan Dodds         else
616*82780287SAidan Dodds         {
617*82780287SAidan Dodds             if (log)
618*82780287SAidan Dodds                 log->Printf("RenderScriptRuntime::LoadRuntimeHooks - Function %s, address resolved at 0x%" PRIx64, hook_defn->name, addr);
619*82780287SAidan Dodds         }
6204640cde1SColin Riley 
6214640cde1SColin Riley         RuntimeHookSP hook(new RuntimeHook());
6224640cde1SColin Riley         hook->address = addr;
6234640cde1SColin Riley         hook->defn = hook_defn;
6244640cde1SColin Riley         hook->bp_sp = target.CreateBreakpoint(addr, true, false);
6254640cde1SColin Riley         hook->bp_sp->SetCallback(HookCallback, hook.get(), true);
6264640cde1SColin Riley         m_runtimeHooks[addr] = hook;
6274640cde1SColin Riley         if (log)
6284640cde1SColin Riley         {
6294640cde1SColin Riley             log->Printf ("RenderScriptRuntime::LoadRuntimeHooks - Successfully hooked '%s' in '%s' version %" PRIu64 " at 0x%" PRIx64 ".",
6304640cde1SColin Riley                 hook_defn->name, module->GetFileSpec().GetFilename().AsCString(), (uint64_t)hook_defn->version, (uint64_t)addr);
6314640cde1SColin Riley         }
6324640cde1SColin Riley     }
6334640cde1SColin Riley }
6344640cde1SColin Riley 
6354640cde1SColin Riley void
6364640cde1SColin Riley RenderScriptRuntime::FixupScriptDetails(RSModuleDescriptorSP rsmodule_sp)
6374640cde1SColin Riley {
6384640cde1SColin Riley     if (!rsmodule_sp)
6394640cde1SColin Riley         return;
6404640cde1SColin Riley 
6414640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
6424640cde1SColin Riley 
6434640cde1SColin Riley     const ModuleSP module = rsmodule_sp->m_module;
6444640cde1SColin Riley     const FileSpec& file = module->GetPlatformFileSpec();
6454640cde1SColin Riley 
6464640cde1SColin Riley     for (const auto &rs_script : m_scripts)
6474640cde1SColin Riley     {
6484640cde1SColin Riley         if (file.GetFilename() == ConstString(rs_script.scriptDyLib.c_str()))
6494640cde1SColin Riley         {
6504640cde1SColin Riley             if (m_scriptMappings.find( rs_script.script ) != m_scriptMappings.end())
6514640cde1SColin Riley             {
6524640cde1SColin Riley                 if (m_scriptMappings[rs_script.script] != rsmodule_sp)
6534640cde1SColin Riley                 {
6544640cde1SColin Riley                     if (log)
6554640cde1SColin Riley                     {
6564640cde1SColin Riley                         log->Printf ("RenderScriptRuntime::FixupScriptDetails - Error: script %" PRIx64 " wants reassigned to new rsmodule '%s'.",
6574640cde1SColin Riley                                      (uint64_t)rs_script.script, rsmodule_sp->m_module->GetFileSpec().GetFilename().AsCString());
6584640cde1SColin Riley                     }
6594640cde1SColin Riley                 }
6604640cde1SColin Riley             }
6614640cde1SColin Riley             else
6624640cde1SColin Riley             {
6634640cde1SColin Riley                 m_scriptMappings[rs_script.script] = rsmodule_sp;
6644640cde1SColin Riley                 rsmodule_sp->m_resname = rs_script.resname;
6654640cde1SColin Riley                 if (log)
6664640cde1SColin Riley                 {
6674640cde1SColin Riley                     log->Printf ("RenderScriptRuntime::FixupScriptDetails - script %" PRIx64 " associated with rsmodule '%s'.",
6684640cde1SColin Riley                                     (uint64_t)rs_script.script, rsmodule_sp->m_module->GetFileSpec().GetFilename().AsCString());
6694640cde1SColin Riley                 }
6704640cde1SColin Riley             }
6714640cde1SColin Riley         }
6724640cde1SColin Riley     }
6734640cde1SColin Riley 
6744640cde1SColin Riley }
6754640cde1SColin Riley 
6765ec532a9SColin Riley bool
6775ec532a9SColin Riley RenderScriptRuntime::LoadModule(const lldb::ModuleSP &module_sp)
6785ec532a9SColin Riley {
6794640cde1SColin Riley     Log* log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE));
6804640cde1SColin Riley 
6815ec532a9SColin Riley     if (module_sp)
6825ec532a9SColin Riley     {
6835ec532a9SColin Riley         for (const auto &rs_module : m_rsmodules)
6845ec532a9SColin Riley         {
6854640cde1SColin Riley             if (rs_module->m_module == module_sp)
6867dc7771cSEwan Crawford             {
6877dc7771cSEwan Crawford                 // Check if the user has enabled automatically breaking on
6887dc7771cSEwan Crawford                 // all RS kernels.
6897dc7771cSEwan Crawford                 if (m_breakAllKernels)
6907dc7771cSEwan Crawford                     BreakOnModuleKernels(rs_module);
6917dc7771cSEwan Crawford 
6925ec532a9SColin Riley                 return false;
6935ec532a9SColin Riley             }
6947dc7771cSEwan Crawford         }
695ef20b08fSColin Riley         bool module_loaded = false;
696ef20b08fSColin Riley         switch (GetModuleKind(module_sp))
697ef20b08fSColin Riley         {
698ef20b08fSColin Riley             case eModuleKindKernelObj:
699ef20b08fSColin Riley             {
7004640cde1SColin Riley                 RSModuleDescriptorSP module_desc;
7014640cde1SColin Riley                 module_desc.reset(new RSModuleDescriptor(module_sp));
7024640cde1SColin Riley                 if (module_desc->ParseRSInfo())
7035ec532a9SColin Riley                 {
7045ec532a9SColin Riley                     m_rsmodules.push_back(module_desc);
705ef20b08fSColin Riley                     module_loaded = true;
7065ec532a9SColin Riley                 }
7074640cde1SColin Riley                 if (module_loaded)
7084640cde1SColin Riley                 {
7094640cde1SColin Riley                     FixupScriptDetails(module_desc);
7104640cde1SColin Riley                 }
711ef20b08fSColin Riley                 break;
712ef20b08fSColin Riley             }
713ef20b08fSColin Riley             case eModuleKindDriver:
7144640cde1SColin Riley             {
7154640cde1SColin Riley                 if (!m_libRSDriver)
7164640cde1SColin Riley                 {
7174640cde1SColin Riley                     m_libRSDriver = module_sp;
7184640cde1SColin Riley                     LoadRuntimeHooks(m_libRSDriver, RenderScriptRuntime::eModuleKindDriver);
7194640cde1SColin Riley                 }
7204640cde1SColin Riley                 break;
7214640cde1SColin Riley             }
722ef20b08fSColin Riley             case eModuleKindImpl:
7234640cde1SColin Riley             {
7244640cde1SColin Riley                 m_libRSCpuRef = module_sp;
7254640cde1SColin Riley                 break;
7264640cde1SColin Riley             }
727ef20b08fSColin Riley             case eModuleKindLibRS:
7284640cde1SColin Riley             {
7294640cde1SColin Riley                 if (!m_libRS)
7304640cde1SColin Riley                 {
7314640cde1SColin Riley                     m_libRS = module_sp;
7324640cde1SColin Riley                     static ConstString gDbgPresentStr("gDebuggerPresent");
7334640cde1SColin Riley                     const Symbol* debug_present = m_libRS->FindFirstSymbolWithNameAndType(gDbgPresentStr, eSymbolTypeData);
7344640cde1SColin Riley                     if (debug_present)
7354640cde1SColin Riley                     {
7364640cde1SColin Riley                         Error error;
7374640cde1SColin Riley                         uint32_t flag = 0x00000001U;
7384640cde1SColin Riley                         Target &target = GetProcess()->GetTarget();
739358cf1eaSGreg Clayton                         addr_t addr = debug_present->GetLoadAddress(&target);
7404640cde1SColin Riley                         GetProcess()->WriteMemory(addr, &flag, sizeof(flag), error);
7414640cde1SColin Riley                         if(error.Success())
7424640cde1SColin Riley                         {
7434640cde1SColin Riley                             if (log)
7444640cde1SColin Riley                                 log->Printf ("RenderScriptRuntime::LoadModule - Debugger present flag set on debugee");
7454640cde1SColin Riley 
7464640cde1SColin Riley                             m_debuggerPresentFlagged = true;
7474640cde1SColin Riley                         }
7484640cde1SColin Riley                         else if (log)
7494640cde1SColin Riley                         {
7504640cde1SColin Riley                             log->Printf ("RenderScriptRuntime::LoadModule - Error writing debugger present flags '%s' ", error.AsCString());
7514640cde1SColin Riley                         }
7524640cde1SColin Riley                     }
7534640cde1SColin Riley                     else if (log)
7544640cde1SColin Riley                     {
7554640cde1SColin Riley                         log->Printf ("RenderScriptRuntime::LoadModule - Error writing debugger present flags - symbol not found");
7564640cde1SColin Riley                     }
7574640cde1SColin Riley                 }
7584640cde1SColin Riley                 break;
7594640cde1SColin Riley             }
760ef20b08fSColin Riley             default:
761ef20b08fSColin Riley                 break;
762ef20b08fSColin Riley         }
763ef20b08fSColin Riley         if (module_loaded)
764ef20b08fSColin Riley             Update();
765ef20b08fSColin Riley         return module_loaded;
7665ec532a9SColin Riley     }
7675ec532a9SColin Riley     return false;
7685ec532a9SColin Riley }
7695ec532a9SColin Riley 
770ef20b08fSColin Riley void
771ef20b08fSColin Riley RenderScriptRuntime::Update()
772ef20b08fSColin Riley {
773ef20b08fSColin Riley     if (m_rsmodules.size() > 0)
774ef20b08fSColin Riley     {
775ef20b08fSColin Riley         if (!m_initiated)
776ef20b08fSColin Riley         {
777ef20b08fSColin Riley             Initiate();
778ef20b08fSColin Riley         }
779ef20b08fSColin Riley     }
780ef20b08fSColin Riley }
781ef20b08fSColin Riley 
782ef20b08fSColin Riley 
7835ec532a9SColin Riley // The maximum line length of an .rs.info packet
7845ec532a9SColin Riley #define MAXLINE 500
7855ec532a9SColin Riley 
7865ec532a9SColin Riley // The .rs.info symbol in renderscript modules contains a string which needs to be parsed.
7875ec532a9SColin Riley // The string is basic and is parsed on a line by line basis.
7885ec532a9SColin Riley bool
7895ec532a9SColin Riley RSModuleDescriptor::ParseRSInfo()
7905ec532a9SColin Riley {
7915ec532a9SColin Riley     const Symbol *info_sym = m_module->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), eSymbolTypeData);
7925ec532a9SColin Riley     if (info_sym)
7935ec532a9SColin Riley     {
794358cf1eaSGreg Clayton         const addr_t addr = info_sym->GetAddressRef().GetFileAddress();
7955ec532a9SColin Riley         const addr_t size = info_sym->GetByteSize();
7965ec532a9SColin Riley         const FileSpec fs = m_module->GetFileSpec();
7975ec532a9SColin Riley 
7985ec532a9SColin Riley         DataBufferSP buffer = fs.ReadFileContents(addr, size);
7995ec532a9SColin Riley 
8005ec532a9SColin Riley         if (!buffer)
8015ec532a9SColin Riley             return false;
8025ec532a9SColin Riley 
8035ec532a9SColin Riley         std::string info((const char *)buffer->GetBytes());
8045ec532a9SColin Riley 
8055ec532a9SColin Riley         std::vector<std::string> info_lines;
806e8433cc1SBruce Mitchener         size_t lpos = info.find('\n');
8075ec532a9SColin Riley         while (lpos != std::string::npos)
8085ec532a9SColin Riley         {
8095ec532a9SColin Riley             info_lines.push_back(info.substr(0, lpos));
8105ec532a9SColin Riley             info = info.substr(lpos + 1);
811e8433cc1SBruce Mitchener             lpos = info.find('\n');
8125ec532a9SColin Riley         }
8135ec532a9SColin Riley         size_t offset = 0;
8145ec532a9SColin Riley         while (offset < info_lines.size())
8155ec532a9SColin Riley         {
8165ec532a9SColin Riley             std::string line = info_lines[offset];
8175ec532a9SColin Riley             // Parse directives
8185ec532a9SColin Riley             uint32_t numDefns = 0;
8195ec532a9SColin Riley             if (sscanf(line.c_str(), "exportVarCount: %u", &numDefns) == 1)
8205ec532a9SColin Riley             {
8215ec532a9SColin Riley                 while (numDefns--)
8224640cde1SColin Riley                     m_globals.push_back(RSGlobalDescriptor(this, info_lines[++offset].c_str()));
8235ec532a9SColin Riley             }
8245ec532a9SColin Riley             else if (sscanf(line.c_str(), "exportFuncCount: %u", &numDefns) == 1)
8255ec532a9SColin Riley             {
8265ec532a9SColin Riley             }
8275ec532a9SColin Riley             else if (sscanf(line.c_str(), "exportForEachCount: %u", &numDefns) == 1)
8285ec532a9SColin Riley             {
8295ec532a9SColin Riley                 char name[MAXLINE];
8305ec532a9SColin Riley                 while (numDefns--)
8315ec532a9SColin Riley                 {
8325ec532a9SColin Riley                     uint32_t slot = 0;
8335ec532a9SColin Riley                     name[0] = '\0';
8345ec532a9SColin Riley                     if (sscanf(info_lines[++offset].c_str(), "%u - %s", &slot, &name[0]) == 2)
8355ec532a9SColin Riley                     {
8364640cde1SColin Riley                         m_kernels.push_back(RSKernelDescriptor(this, name, slot));
8374640cde1SColin Riley                     }
8384640cde1SColin Riley                 }
8394640cde1SColin Riley             }
8404640cde1SColin Riley             else if (sscanf(line.c_str(), "pragmaCount: %u", &numDefns) == 1)
8414640cde1SColin Riley             {
8424640cde1SColin Riley                 char name[MAXLINE];
8434640cde1SColin Riley                 char value[MAXLINE];
8444640cde1SColin Riley                 while (numDefns--)
8454640cde1SColin Riley                 {
8464640cde1SColin Riley                     name[0] = '\0';
8474640cde1SColin Riley                     value[0] = '\0';
8484640cde1SColin Riley                     if (sscanf(info_lines[++offset].c_str(), "%s - %s", &name[0], &value[0]) != 0
8494640cde1SColin Riley                         && (name[0] != '\0'))
8504640cde1SColin Riley                     {
8514640cde1SColin Riley                         m_pragmas[std::string(name)] = value;
8525ec532a9SColin Riley                     }
8535ec532a9SColin Riley                 }
8545ec532a9SColin Riley             }
8555ec532a9SColin Riley             else if (sscanf(line.c_str(), "objectSlotCount: %u", &numDefns) == 1)
8565ec532a9SColin Riley             {
8575ec532a9SColin Riley             }
8585ec532a9SColin Riley 
8595ec532a9SColin Riley             offset++;
8605ec532a9SColin Riley         }
8615ec532a9SColin Riley         return m_kernels.size() > 0;
8625ec532a9SColin Riley     }
8635ec532a9SColin Riley     return false;
8645ec532a9SColin Riley }
8655ec532a9SColin Riley 
8665ec532a9SColin Riley bool
8675ec532a9SColin Riley RenderScriptRuntime::ProbeModules(const ModuleList module_list)
8685ec532a9SColin Riley {
8695ec532a9SColin Riley     bool rs_found = false;
8705ec532a9SColin Riley     size_t num_modules = module_list.GetSize();
8715ec532a9SColin Riley     for (size_t i = 0; i < num_modules; i++)
8725ec532a9SColin Riley     {
8735ec532a9SColin Riley         auto module = module_list.GetModuleAtIndex(i);
8745ec532a9SColin Riley         rs_found |= LoadModule(module);
8755ec532a9SColin Riley     }
8765ec532a9SColin Riley     return rs_found;
8775ec532a9SColin Riley }
8785ec532a9SColin Riley 
8795ec532a9SColin Riley void
8804640cde1SColin Riley RenderScriptRuntime::Status(Stream &strm) const
8814640cde1SColin Riley {
8824640cde1SColin Riley     if (m_libRS)
8834640cde1SColin Riley     {
8844640cde1SColin Riley         strm.Printf("Runtime Library discovered.");
8854640cde1SColin Riley         strm.EOL();
8864640cde1SColin Riley     }
8874640cde1SColin Riley     if (m_libRSDriver)
8884640cde1SColin Riley     {
8894640cde1SColin Riley         strm.Printf("Runtime Driver discovered.");
8904640cde1SColin Riley         strm.EOL();
8914640cde1SColin Riley     }
8924640cde1SColin Riley     if (m_libRSCpuRef)
8934640cde1SColin Riley     {
8944640cde1SColin Riley         strm.Printf("CPU Reference Implementation discovered.");
8954640cde1SColin Riley         strm.EOL();
8964640cde1SColin Riley     }
8974640cde1SColin Riley 
8984640cde1SColin Riley     if (m_runtimeHooks.size())
8994640cde1SColin Riley     {
9004640cde1SColin Riley         strm.Printf("Runtime functions hooked:");
9014640cde1SColin Riley         strm.EOL();
9024640cde1SColin Riley         for (auto b : m_runtimeHooks)
9034640cde1SColin Riley         {
9044640cde1SColin Riley             strm.Indent(b.second->defn->name);
9054640cde1SColin Riley             strm.EOL();
9064640cde1SColin Riley         }
9074640cde1SColin Riley         strm.EOL();
9084640cde1SColin Riley     }
9094640cde1SColin Riley     else
9104640cde1SColin Riley     {
9114640cde1SColin Riley         strm.Printf("Runtime is not hooked.");
9124640cde1SColin Riley         strm.EOL();
9134640cde1SColin Riley     }
9144640cde1SColin Riley }
9154640cde1SColin Riley 
9164640cde1SColin Riley void
9174640cde1SColin Riley RenderScriptRuntime::DumpContexts(Stream &strm) const
9184640cde1SColin Riley {
9194640cde1SColin Riley     strm.Printf("Inferred RenderScript Contexts:");
9204640cde1SColin Riley     strm.EOL();
9214640cde1SColin Riley     strm.IndentMore();
9224640cde1SColin Riley 
9234640cde1SColin Riley     std::map<addr_t, uint64_t> contextReferences;
9244640cde1SColin Riley 
9254640cde1SColin Riley     for (const auto &script : m_scripts)
9264640cde1SColin Riley     {
9274640cde1SColin Riley         if (contextReferences.find(script.context) != contextReferences.end())
9284640cde1SColin Riley         {
9294640cde1SColin Riley             contextReferences[script.context]++;
9304640cde1SColin Riley         }
9314640cde1SColin Riley         else
9324640cde1SColin Riley         {
9334640cde1SColin Riley             contextReferences[script.context] = 1;
9344640cde1SColin Riley         }
9354640cde1SColin Riley     }
9364640cde1SColin Riley 
9374640cde1SColin Riley     for (const auto& cRef : contextReferences)
9384640cde1SColin Riley     {
9394640cde1SColin Riley         strm.Printf("Context 0x%" PRIx64 ": %" PRIu64 " script instances", cRef.first, cRef.second);
9404640cde1SColin Riley         strm.EOL();
9414640cde1SColin Riley     }
9424640cde1SColin Riley     strm.IndentLess();
9434640cde1SColin Riley }
9444640cde1SColin Riley 
9454640cde1SColin Riley void
9464640cde1SColin Riley RenderScriptRuntime::DumpKernels(Stream &strm) const
9474640cde1SColin Riley {
9484640cde1SColin Riley     strm.Printf("RenderScript Kernels:");
9494640cde1SColin Riley     strm.EOL();
9504640cde1SColin Riley     strm.IndentMore();
9514640cde1SColin Riley     for (const auto &module : m_rsmodules)
9524640cde1SColin Riley     {
9534640cde1SColin Riley         strm.Printf("Resource '%s':",module->m_resname.c_str());
9544640cde1SColin Riley         strm.EOL();
9554640cde1SColin Riley         for (const auto &kernel : module->m_kernels)
9564640cde1SColin Riley         {
9574640cde1SColin Riley             strm.Indent(kernel.m_name.AsCString());
9584640cde1SColin Riley             strm.EOL();
9594640cde1SColin Riley         }
9604640cde1SColin Riley     }
9614640cde1SColin Riley     strm.IndentLess();
9624640cde1SColin Riley }
9634640cde1SColin Riley 
9647dc7771cSEwan Crawford // Set breakpoints on every kernel found in RS module
9657dc7771cSEwan Crawford void
9667dc7771cSEwan Crawford RenderScriptRuntime::BreakOnModuleKernels(const RSModuleDescriptorSP rsmodule_sp)
9677dc7771cSEwan Crawford {
9687dc7771cSEwan Crawford     for (const auto &kernel : rsmodule_sp->m_kernels)
9697dc7771cSEwan Crawford     {
9707dc7771cSEwan Crawford         // Don't set breakpoint on 'root' kernel
9717dc7771cSEwan Crawford         if (strcmp(kernel.m_name.AsCString(), "root") == 0)
9727dc7771cSEwan Crawford             continue;
9737dc7771cSEwan Crawford 
9747dc7771cSEwan Crawford         CreateKernelBreakpoint(kernel.m_name);
9757dc7771cSEwan Crawford     }
9767dc7771cSEwan Crawford }
9777dc7771cSEwan Crawford 
9787dc7771cSEwan Crawford // Method is internally called by the 'kernel breakpoint all' command to
9797dc7771cSEwan Crawford // enable or disable breaking on all kernels.
9807dc7771cSEwan Crawford //
9817dc7771cSEwan Crawford // When do_break is true we want to enable this functionality.
9827dc7771cSEwan Crawford // When do_break is false we want to disable it.
9837dc7771cSEwan Crawford void
9847dc7771cSEwan Crawford RenderScriptRuntime::SetBreakAllKernels(bool do_break, TargetSP target)
9857dc7771cSEwan Crawford {
98654782db7SEwan Crawford     Log* log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_LANGUAGE | LIBLLDB_LOG_BREAKPOINTS));
9877dc7771cSEwan Crawford 
9887dc7771cSEwan Crawford     InitSearchFilter(target);
9897dc7771cSEwan Crawford 
9907dc7771cSEwan Crawford     // Set breakpoints on all the kernels
9917dc7771cSEwan Crawford     if (do_break && !m_breakAllKernels)
9927dc7771cSEwan Crawford     {
9937dc7771cSEwan Crawford         m_breakAllKernels = true;
9947dc7771cSEwan Crawford 
9957dc7771cSEwan Crawford         for (const auto &module : m_rsmodules)
9967dc7771cSEwan Crawford             BreakOnModuleKernels(module);
9977dc7771cSEwan Crawford 
9987dc7771cSEwan Crawford         if (log)
9997dc7771cSEwan Crawford             log->Printf("RenderScriptRuntime::SetBreakAllKernels(True)"
10007dc7771cSEwan Crawford                         "- breakpoints set on all currently loaded kernels");
10017dc7771cSEwan Crawford     }
10027dc7771cSEwan Crawford     else if (!do_break && m_breakAllKernels) // Breakpoints won't be set on any new kernels.
10037dc7771cSEwan Crawford     {
10047dc7771cSEwan Crawford         m_breakAllKernels = false;
10057dc7771cSEwan Crawford 
10067dc7771cSEwan Crawford         if (log)
10077dc7771cSEwan Crawford             log->Printf("RenderScriptRuntime::SetBreakAllKernels(False) - breakpoints no longer automatically set");
10087dc7771cSEwan Crawford     }
10097dc7771cSEwan Crawford }
10107dc7771cSEwan Crawford 
10117dc7771cSEwan Crawford // Given the name of a kernel this function creates a breakpoint using our
10127dc7771cSEwan Crawford // own breakpoint resolver, and returns the Breakpoint shared pointer.
10137dc7771cSEwan Crawford BreakpointSP
10147dc7771cSEwan Crawford RenderScriptRuntime::CreateKernelBreakpoint(const ConstString& name)
10157dc7771cSEwan Crawford {
101654782db7SEwan Crawford     Log* log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_LANGUAGE | LIBLLDB_LOG_BREAKPOINTS));
10177dc7771cSEwan Crawford 
10187dc7771cSEwan Crawford     if (!m_filtersp)
10197dc7771cSEwan Crawford     {
10207dc7771cSEwan Crawford         if (log)
10217dc7771cSEwan Crawford             log->Printf("RenderScriptRuntime::CreateKernelBreakpoint - Error: No breakpoint search filter set");
10227dc7771cSEwan Crawford         return nullptr;
10237dc7771cSEwan Crawford     }
10247dc7771cSEwan Crawford 
10257dc7771cSEwan Crawford     BreakpointResolverSP resolver_sp(new RSBreakpointResolver(nullptr, name));
10267dc7771cSEwan Crawford     BreakpointSP bp = GetProcess()->GetTarget().CreateBreakpoint(m_filtersp, resolver_sp, false, false, false);
10277dc7771cSEwan Crawford 
102854782db7SEwan Crawford     // Give RS breakpoints a specific name, so the user can manipulate them as a group.
102954782db7SEwan Crawford     Error err;
103054782db7SEwan Crawford     if (!bp->AddName("RenderScriptKernel", err) && log)
103154782db7SEwan Crawford         log->Printf("RenderScriptRuntime::CreateKernelBreakpoint: Error setting break name, %s", err.AsCString());
103254782db7SEwan Crawford 
10337dc7771cSEwan Crawford     return bp;
10347dc7771cSEwan Crawford }
10357dc7771cSEwan Crawford 
10364640cde1SColin Riley void
103798156583SEwan Crawford RenderScriptRuntime::AttemptBreakpointAtKernelName(Stream &strm, const char* name, Error& error, TargetSP target)
10384640cde1SColin Riley {
10394640cde1SColin Riley     if (!name)
10404640cde1SColin Riley     {
10414640cde1SColin Riley         error.SetErrorString("invalid kernel name");
10424640cde1SColin Riley         return;
10434640cde1SColin Riley     }
10444640cde1SColin Riley 
10457dc7771cSEwan Crawford     InitSearchFilter(target);
104698156583SEwan Crawford 
10474640cde1SColin Riley     ConstString kernel_name(name);
10487dc7771cSEwan Crawford     BreakpointSP bp = CreateKernelBreakpoint(kernel_name);
104998156583SEwan Crawford     if (bp)
105098156583SEwan Crawford         bp->GetDescription(&strm, lldb::eDescriptionLevelInitial, false);
10514640cde1SColin Riley 
10524640cde1SColin Riley     return;
10534640cde1SColin Riley }
10544640cde1SColin Riley 
10554640cde1SColin Riley void
10565ec532a9SColin Riley RenderScriptRuntime::DumpModules(Stream &strm) const
10575ec532a9SColin Riley {
10585ec532a9SColin Riley     strm.Printf("RenderScript Modules:");
10595ec532a9SColin Riley     strm.EOL();
10605ec532a9SColin Riley     strm.IndentMore();
10615ec532a9SColin Riley     for (const auto &module : m_rsmodules)
10625ec532a9SColin Riley     {
10634640cde1SColin Riley         module->Dump(strm);
10645ec532a9SColin Riley     }
10655ec532a9SColin Riley     strm.IndentLess();
10665ec532a9SColin Riley }
10675ec532a9SColin Riley 
10685ec532a9SColin Riley void
10695ec532a9SColin Riley RSModuleDescriptor::Dump(Stream &strm) const
10705ec532a9SColin Riley {
10715ec532a9SColin Riley     strm.Indent();
10725ec532a9SColin Riley     m_module->GetFileSpec().Dump(&strm);
10734640cde1SColin Riley     m_module->ParseAllDebugSymbols();
10744640cde1SColin Riley     if(m_module->GetNumCompileUnits())
10754640cde1SColin Riley     {
10764640cde1SColin Riley         strm.Indent("Debug info loaded.");
10774640cde1SColin Riley     }
10784640cde1SColin Riley     else
10794640cde1SColin Riley     {
10804640cde1SColin Riley         strm.Indent("Debug info does not exist.");
10814640cde1SColin Riley     }
10825ec532a9SColin Riley     strm.EOL();
10835ec532a9SColin Riley     strm.IndentMore();
10845ec532a9SColin Riley     strm.Indent();
1085189598edSColin Riley     strm.Printf("Globals: %" PRIu64, static_cast<uint64_t>(m_globals.size()));
10865ec532a9SColin Riley     strm.EOL();
10875ec532a9SColin Riley     strm.IndentMore();
10885ec532a9SColin Riley     for (const auto &global : m_globals)
10895ec532a9SColin Riley     {
10905ec532a9SColin Riley         global.Dump(strm);
10915ec532a9SColin Riley     }
10925ec532a9SColin Riley     strm.IndentLess();
10935ec532a9SColin Riley     strm.Indent();
1094189598edSColin Riley     strm.Printf("Kernels: %" PRIu64, static_cast<uint64_t>(m_kernels.size()));
10955ec532a9SColin Riley     strm.EOL();
10965ec532a9SColin Riley     strm.IndentMore();
10975ec532a9SColin Riley     for (const auto &kernel : m_kernels)
10985ec532a9SColin Riley     {
10995ec532a9SColin Riley         kernel.Dump(strm);
11005ec532a9SColin Riley     }
11014640cde1SColin Riley     strm.Printf("Pragmas: %"  PRIu64 , static_cast<uint64_t>(m_pragmas.size()));
11024640cde1SColin Riley     strm.EOL();
11034640cde1SColin Riley     strm.IndentMore();
11044640cde1SColin Riley     for (const auto &key_val : m_pragmas)
11054640cde1SColin Riley     {
11064640cde1SColin Riley         strm.Printf("%s: %s", key_val.first.c_str(), key_val.second.c_str());
11074640cde1SColin Riley         strm.EOL();
11084640cde1SColin Riley     }
11095ec532a9SColin Riley     strm.IndentLess(4);
11105ec532a9SColin Riley }
11115ec532a9SColin Riley 
11125ec532a9SColin Riley void
11135ec532a9SColin Riley RSGlobalDescriptor::Dump(Stream &strm) const
11145ec532a9SColin Riley {
11155ec532a9SColin Riley     strm.Indent(m_name.AsCString());
11164640cde1SColin Riley     VariableList var_list;
11174640cde1SColin Riley     m_module->m_module->FindGlobalVariables(m_name, nullptr, true, 1U, var_list);
11184640cde1SColin Riley     if (var_list.GetSize() == 1)
11194640cde1SColin Riley     {
11204640cde1SColin Riley         auto var = var_list.GetVariableAtIndex(0);
11214640cde1SColin Riley         auto type = var->GetType();
11224640cde1SColin Riley         if(type)
11234640cde1SColin Riley         {
11244640cde1SColin Riley             strm.Printf(" - ");
11254640cde1SColin Riley             type->DumpTypeName(&strm);
11264640cde1SColin Riley         }
11274640cde1SColin Riley         else
11284640cde1SColin Riley         {
11294640cde1SColin Riley             strm.Printf(" - Unknown Type");
11304640cde1SColin Riley         }
11314640cde1SColin Riley     }
11324640cde1SColin Riley     else
11334640cde1SColin Riley     {
11344640cde1SColin Riley         strm.Printf(" - variable identified, but not found in binary");
11354640cde1SColin Riley         const Symbol* s = m_module->m_module->FindFirstSymbolWithNameAndType(m_name, eSymbolTypeData);
11364640cde1SColin Riley         if (s)
11374640cde1SColin Riley         {
11384640cde1SColin Riley             strm.Printf(" (symbol exists) ");
11394640cde1SColin Riley         }
11404640cde1SColin Riley     }
11414640cde1SColin Riley 
11425ec532a9SColin Riley     strm.EOL();
11435ec532a9SColin Riley }
11445ec532a9SColin Riley 
11455ec532a9SColin Riley void
11465ec532a9SColin Riley RSKernelDescriptor::Dump(Stream &strm) const
11475ec532a9SColin Riley {
11485ec532a9SColin Riley     strm.Indent(m_name.AsCString());
11495ec532a9SColin Riley     strm.EOL();
11505ec532a9SColin Riley }
11515ec532a9SColin Riley 
11525ec532a9SColin Riley class CommandObjectRenderScriptRuntimeModuleProbe : public CommandObjectParsed
11535ec532a9SColin Riley {
11545ec532a9SColin Riley   private:
11555ec532a9SColin Riley   public:
11565ec532a9SColin Riley     CommandObjectRenderScriptRuntimeModuleProbe(CommandInterpreter &interpreter)
11575ec532a9SColin Riley         : CommandObjectParsed(interpreter, "renderscript module probe",
11585ec532a9SColin Riley                               "Initiates a Probe of all loaded modules for kernels and other renderscript objects.",
11595ec532a9SColin Riley                               "renderscript module probe",
1160e87764f2SEnrico Granata                               eCommandRequiresTarget | eCommandRequiresProcess | eCommandProcessMustBeLaunched)
11615ec532a9SColin Riley     {
11625ec532a9SColin Riley     }
11635ec532a9SColin Riley 
11645ec532a9SColin Riley     ~CommandObjectRenderScriptRuntimeModuleProbe() {}
11655ec532a9SColin Riley 
11665ec532a9SColin Riley     bool
11675ec532a9SColin Riley     DoExecute(Args &command, CommandReturnObject &result)
11685ec532a9SColin Riley     {
11695ec532a9SColin Riley         const size_t argc = command.GetArgumentCount();
11705ec532a9SColin Riley         if (argc == 0)
11715ec532a9SColin Riley         {
11725ec532a9SColin Riley             Target *target = m_exe_ctx.GetTargetPtr();
11735ec532a9SColin Riley             RenderScriptRuntime *runtime =
11745ec532a9SColin Riley                 (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
11755ec532a9SColin Riley             auto module_list = target->GetImages();
11765ec532a9SColin Riley             bool new_rs_details = runtime->ProbeModules(module_list);
11775ec532a9SColin Riley             if (new_rs_details)
11785ec532a9SColin Riley             {
11795ec532a9SColin Riley                 result.AppendMessage("New renderscript modules added to runtime model.");
11805ec532a9SColin Riley             }
11815ec532a9SColin Riley             result.SetStatus(eReturnStatusSuccessFinishResult);
11825ec532a9SColin Riley             return true;
11835ec532a9SColin Riley         }
11845ec532a9SColin Riley 
11855ec532a9SColin Riley         result.AppendErrorWithFormat("'%s' takes no arguments", m_cmd_name.c_str());
11865ec532a9SColin Riley         result.SetStatus(eReturnStatusFailed);
11875ec532a9SColin Riley         return false;
11885ec532a9SColin Riley     }
11895ec532a9SColin Riley };
11905ec532a9SColin Riley 
11915ec532a9SColin Riley class CommandObjectRenderScriptRuntimeModuleDump : public CommandObjectParsed
11925ec532a9SColin Riley {
11935ec532a9SColin Riley   private:
11945ec532a9SColin Riley   public:
11955ec532a9SColin Riley     CommandObjectRenderScriptRuntimeModuleDump(CommandInterpreter &interpreter)
11965ec532a9SColin Riley         : CommandObjectParsed(interpreter, "renderscript module dump",
11975ec532a9SColin Riley                               "Dumps renderscript specific information for all modules.", "renderscript module dump",
1198e87764f2SEnrico Granata                               eCommandRequiresProcess | eCommandProcessMustBeLaunched)
11995ec532a9SColin Riley     {
12005ec532a9SColin Riley     }
12015ec532a9SColin Riley 
12025ec532a9SColin Riley     ~CommandObjectRenderScriptRuntimeModuleDump() {}
12035ec532a9SColin Riley 
12045ec532a9SColin Riley     bool
12055ec532a9SColin Riley     DoExecute(Args &command, CommandReturnObject &result)
12065ec532a9SColin Riley     {
12075ec532a9SColin Riley         RenderScriptRuntime *runtime =
12085ec532a9SColin Riley             (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
12095ec532a9SColin Riley         runtime->DumpModules(result.GetOutputStream());
12105ec532a9SColin Riley         result.SetStatus(eReturnStatusSuccessFinishResult);
12115ec532a9SColin Riley         return true;
12125ec532a9SColin Riley     }
12135ec532a9SColin Riley };
12145ec532a9SColin Riley 
12155ec532a9SColin Riley class CommandObjectRenderScriptRuntimeModule : public CommandObjectMultiword
12165ec532a9SColin Riley {
12175ec532a9SColin Riley   private:
12185ec532a9SColin Riley   public:
12195ec532a9SColin Riley     CommandObjectRenderScriptRuntimeModule(CommandInterpreter &interpreter)
12205ec532a9SColin Riley         : CommandObjectMultiword(interpreter, "renderscript module", "Commands that deal with renderscript modules.",
12215ec532a9SColin Riley                                  NULL)
12225ec532a9SColin Riley     {
12235ec532a9SColin Riley         LoadSubCommand("probe", CommandObjectSP(new CommandObjectRenderScriptRuntimeModuleProbe(interpreter)));
12245ec532a9SColin Riley         LoadSubCommand("dump", CommandObjectSP(new CommandObjectRenderScriptRuntimeModuleDump(interpreter)));
12255ec532a9SColin Riley     }
12265ec532a9SColin Riley 
12275ec532a9SColin Riley     ~CommandObjectRenderScriptRuntimeModule() {}
12285ec532a9SColin Riley };
12295ec532a9SColin Riley 
12304640cde1SColin Riley class CommandObjectRenderScriptRuntimeKernelList : public CommandObjectParsed
12314640cde1SColin Riley {
12324640cde1SColin Riley   private:
12334640cde1SColin Riley   public:
12344640cde1SColin Riley     CommandObjectRenderScriptRuntimeKernelList(CommandInterpreter &interpreter)
12354640cde1SColin Riley         : CommandObjectParsed(interpreter, "renderscript kernel list",
12364640cde1SColin Riley                               "Lists renderscript kernel names and associated script resources.", "renderscript kernel list",
12374640cde1SColin Riley                               eCommandRequiresProcess | eCommandProcessMustBeLaunched)
12384640cde1SColin Riley     {
12394640cde1SColin Riley     }
12404640cde1SColin Riley 
12414640cde1SColin Riley     ~CommandObjectRenderScriptRuntimeKernelList() {}
12424640cde1SColin Riley 
12434640cde1SColin Riley     bool
12444640cde1SColin Riley     DoExecute(Args &command, CommandReturnObject &result)
12454640cde1SColin Riley     {
12464640cde1SColin Riley         RenderScriptRuntime *runtime =
12474640cde1SColin Riley             (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
12484640cde1SColin Riley         runtime->DumpKernels(result.GetOutputStream());
12494640cde1SColin Riley         result.SetStatus(eReturnStatusSuccessFinishResult);
12504640cde1SColin Riley         return true;
12514640cde1SColin Riley     }
12524640cde1SColin Riley };
12534640cde1SColin Riley 
12547dc7771cSEwan Crawford class CommandObjectRenderScriptRuntimeKernelBreakpointSet : public CommandObjectParsed
12554640cde1SColin Riley {
12564640cde1SColin Riley   private:
12574640cde1SColin Riley   public:
12587dc7771cSEwan Crawford     CommandObjectRenderScriptRuntimeKernelBreakpointSet(CommandInterpreter &interpreter)
12597dc7771cSEwan Crawford         : CommandObjectParsed(interpreter, "renderscript kernel breakpoint set",
12607dc7771cSEwan Crawford                               "Sets a breakpoint on a renderscript kernel.", "renderscript kernel breakpoint set <kernel_name>",
12614640cde1SColin Riley                               eCommandRequiresProcess | eCommandProcessMustBeLaunched | eCommandProcessMustBePaused)
12624640cde1SColin Riley     {
12634640cde1SColin Riley     }
12644640cde1SColin Riley 
12657dc7771cSEwan Crawford     ~CommandObjectRenderScriptRuntimeKernelBreakpointSet() {}
12664640cde1SColin Riley 
12674640cde1SColin Riley     bool
12684640cde1SColin Riley     DoExecute(Args &command, CommandReturnObject &result)
12694640cde1SColin Riley     {
12704640cde1SColin Riley         const size_t argc = command.GetArgumentCount();
12714640cde1SColin Riley         if (argc == 1)
12724640cde1SColin Riley         {
12734640cde1SColin Riley             RenderScriptRuntime *runtime =
12744640cde1SColin Riley                 (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
12754640cde1SColin Riley 
12764640cde1SColin Riley             Error error;
127798156583SEwan Crawford             runtime->AttemptBreakpointAtKernelName(result.GetOutputStream(), command.GetArgumentAtIndex(0),
127898156583SEwan Crawford                                                    error, m_exe_ctx.GetTargetSP());
12794640cde1SColin Riley 
12804640cde1SColin Riley             if (error.Success())
12814640cde1SColin Riley             {
12824640cde1SColin Riley                 result.AppendMessage("Breakpoint(s) created");
12834640cde1SColin Riley                 result.SetStatus(eReturnStatusSuccessFinishResult);
12844640cde1SColin Riley                 return true;
12854640cde1SColin Riley             }
12864640cde1SColin Riley             result.SetStatus(eReturnStatusFailed);
12874640cde1SColin Riley             result.AppendErrorWithFormat("Error: %s", error.AsCString());
12884640cde1SColin Riley             return false;
12894640cde1SColin Riley         }
12904640cde1SColin Riley 
12914640cde1SColin Riley         result.AppendErrorWithFormat("'%s' takes 1 argument of kernel name", m_cmd_name.c_str());
12924640cde1SColin Riley         result.SetStatus(eReturnStatusFailed);
12934640cde1SColin Riley         return false;
12944640cde1SColin Riley     }
12954640cde1SColin Riley };
12964640cde1SColin Riley 
12977dc7771cSEwan Crawford class CommandObjectRenderScriptRuntimeKernelBreakpointAll : public CommandObjectParsed
12987dc7771cSEwan Crawford {
12997dc7771cSEwan Crawford   private:
13007dc7771cSEwan Crawford   public:
13017dc7771cSEwan Crawford     CommandObjectRenderScriptRuntimeKernelBreakpointAll(CommandInterpreter &interpreter)
13027dc7771cSEwan Crawford         : CommandObjectParsed(interpreter, "renderscript kernel breakpoint all",
13037dc7771cSEwan Crawford                               "Automatically sets a breakpoint on all renderscript kernels that are or will be loaded.\n"
13047dc7771cSEwan Crawford                               "Disabling option means breakpoints will no longer be set on any kernels loaded in the future, "
13057dc7771cSEwan Crawford                               "but does not remove currently set breakpoints.",
13067dc7771cSEwan Crawford                               "renderscript kernel breakpoint all <enable/disable>",
13077dc7771cSEwan Crawford                               eCommandRequiresProcess | eCommandProcessMustBeLaunched | eCommandProcessMustBePaused)
13087dc7771cSEwan Crawford     {
13097dc7771cSEwan Crawford     }
13107dc7771cSEwan Crawford 
13117dc7771cSEwan Crawford     ~CommandObjectRenderScriptRuntimeKernelBreakpointAll() {}
13127dc7771cSEwan Crawford 
13137dc7771cSEwan Crawford     bool
13147dc7771cSEwan Crawford     DoExecute(Args &command, CommandReturnObject &result)
13157dc7771cSEwan Crawford     {
13167dc7771cSEwan Crawford         const size_t argc = command.GetArgumentCount();
13177dc7771cSEwan Crawford         if (argc != 1)
13187dc7771cSEwan Crawford         {
13197dc7771cSEwan Crawford             result.AppendErrorWithFormat("'%s' takes 1 argument of 'enable' or 'disable'", m_cmd_name.c_str());
13207dc7771cSEwan Crawford             result.SetStatus(eReturnStatusFailed);
13217dc7771cSEwan Crawford             return false;
13227dc7771cSEwan Crawford         }
13237dc7771cSEwan Crawford 
13247dc7771cSEwan Crawford         RenderScriptRuntime *runtime =
13257dc7771cSEwan Crawford           static_cast<RenderScriptRuntime *>(m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript));
13267dc7771cSEwan Crawford 
13277dc7771cSEwan Crawford         bool do_break = false;
13287dc7771cSEwan Crawford         const char* argument = command.GetArgumentAtIndex(0);
13297dc7771cSEwan Crawford         if (strcmp(argument, "enable") == 0)
13307dc7771cSEwan Crawford         {
13317dc7771cSEwan Crawford             do_break = true;
13327dc7771cSEwan Crawford             result.AppendMessage("Breakpoints will be set on all kernels.");
13337dc7771cSEwan Crawford         }
13347dc7771cSEwan Crawford         else if (strcmp(argument, "disable") == 0)
13357dc7771cSEwan Crawford         {
13367dc7771cSEwan Crawford             do_break = false;
13377dc7771cSEwan Crawford             result.AppendMessage("Breakpoints will not be set on any new kernels.");
13387dc7771cSEwan Crawford         }
13397dc7771cSEwan Crawford         else
13407dc7771cSEwan Crawford         {
13417dc7771cSEwan Crawford             result.AppendErrorWithFormat("Argument must be either 'enable' or 'disable'");
13427dc7771cSEwan Crawford             result.SetStatus(eReturnStatusFailed);
13437dc7771cSEwan Crawford             return false;
13447dc7771cSEwan Crawford         }
13457dc7771cSEwan Crawford 
13467dc7771cSEwan Crawford         runtime->SetBreakAllKernels(do_break, m_exe_ctx.GetTargetSP());
13477dc7771cSEwan Crawford 
13487dc7771cSEwan Crawford         result.SetStatus(eReturnStatusSuccessFinishResult);
13497dc7771cSEwan Crawford         return true;
13507dc7771cSEwan Crawford     }
13517dc7771cSEwan Crawford };
13527dc7771cSEwan Crawford 
13537dc7771cSEwan Crawford class CommandObjectRenderScriptRuntimeKernelBreakpoint : public CommandObjectMultiword
13547dc7771cSEwan Crawford {
13557dc7771cSEwan Crawford   private:
13567dc7771cSEwan Crawford   public:
13577dc7771cSEwan Crawford     CommandObjectRenderScriptRuntimeKernelBreakpoint(CommandInterpreter &interpreter)
13587dc7771cSEwan Crawford         : CommandObjectMultiword(interpreter, "renderscript kernel", "Commands that generate breakpoints on renderscript kernels.",
13597dc7771cSEwan Crawford                                  nullptr)
13607dc7771cSEwan Crawford     {
13617dc7771cSEwan Crawford         LoadSubCommand("set", CommandObjectSP(new CommandObjectRenderScriptRuntimeKernelBreakpointSet(interpreter)));
13627dc7771cSEwan Crawford         LoadSubCommand("all", CommandObjectSP(new CommandObjectRenderScriptRuntimeKernelBreakpointAll(interpreter)));
13637dc7771cSEwan Crawford     }
13647dc7771cSEwan Crawford 
13657dc7771cSEwan Crawford     ~CommandObjectRenderScriptRuntimeKernelBreakpoint() {}
13667dc7771cSEwan Crawford };
13677dc7771cSEwan Crawford 
13684640cde1SColin Riley class CommandObjectRenderScriptRuntimeKernel : public CommandObjectMultiword
13694640cde1SColin Riley {
13704640cde1SColin Riley   private:
13714640cde1SColin Riley   public:
13724640cde1SColin Riley     CommandObjectRenderScriptRuntimeKernel(CommandInterpreter &interpreter)
13734640cde1SColin Riley         : CommandObjectMultiword(interpreter, "renderscript kernel", "Commands that deal with renderscript kernels.",
13744640cde1SColin Riley                                  NULL)
13754640cde1SColin Riley     {
13764640cde1SColin Riley         LoadSubCommand("list", CommandObjectSP(new CommandObjectRenderScriptRuntimeKernelList(interpreter)));
13774640cde1SColin Riley         LoadSubCommand("breakpoint", CommandObjectSP(new CommandObjectRenderScriptRuntimeKernelBreakpoint(interpreter)));
13784640cde1SColin Riley     }
13794640cde1SColin Riley 
13804640cde1SColin Riley     ~CommandObjectRenderScriptRuntimeKernel() {}
13814640cde1SColin Riley };
13824640cde1SColin Riley 
13834640cde1SColin Riley class CommandObjectRenderScriptRuntimeContextDump : public CommandObjectParsed
13844640cde1SColin Riley {
13854640cde1SColin Riley   private:
13864640cde1SColin Riley   public:
13874640cde1SColin Riley     CommandObjectRenderScriptRuntimeContextDump(CommandInterpreter &interpreter)
13884640cde1SColin Riley         : CommandObjectParsed(interpreter, "renderscript context dump",
13894640cde1SColin Riley                               "Dumps renderscript context information.", "renderscript context dump",
13904640cde1SColin Riley                               eCommandRequiresProcess | eCommandProcessMustBeLaunched)
13914640cde1SColin Riley     {
13924640cde1SColin Riley     }
13934640cde1SColin Riley 
13944640cde1SColin Riley     ~CommandObjectRenderScriptRuntimeContextDump() {}
13954640cde1SColin Riley 
13964640cde1SColin Riley     bool
13974640cde1SColin Riley     DoExecute(Args &command, CommandReturnObject &result)
13984640cde1SColin Riley     {
13994640cde1SColin Riley         RenderScriptRuntime *runtime =
14004640cde1SColin Riley             (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
14014640cde1SColin Riley         runtime->DumpContexts(result.GetOutputStream());
14024640cde1SColin Riley         result.SetStatus(eReturnStatusSuccessFinishResult);
14034640cde1SColin Riley         return true;
14044640cde1SColin Riley     }
14054640cde1SColin Riley };
14064640cde1SColin Riley 
14074640cde1SColin Riley class CommandObjectRenderScriptRuntimeContext : public CommandObjectMultiword
14084640cde1SColin Riley {
14094640cde1SColin Riley   private:
14104640cde1SColin Riley   public:
14114640cde1SColin Riley     CommandObjectRenderScriptRuntimeContext(CommandInterpreter &interpreter)
14124640cde1SColin Riley         : CommandObjectMultiword(interpreter, "renderscript context", "Commands that deal with renderscript contexts.",
14134640cde1SColin Riley                                  NULL)
14144640cde1SColin Riley     {
14154640cde1SColin Riley         LoadSubCommand("dump", CommandObjectSP(new CommandObjectRenderScriptRuntimeContextDump(interpreter)));
14164640cde1SColin Riley     }
14174640cde1SColin Riley 
14184640cde1SColin Riley     ~CommandObjectRenderScriptRuntimeContext() {}
14194640cde1SColin Riley };
14204640cde1SColin Riley 
14214640cde1SColin Riley class CommandObjectRenderScriptRuntimeStatus : public CommandObjectParsed
14224640cde1SColin Riley {
14234640cde1SColin Riley   private:
14244640cde1SColin Riley   public:
14254640cde1SColin Riley     CommandObjectRenderScriptRuntimeStatus(CommandInterpreter &interpreter)
14264640cde1SColin Riley         : CommandObjectParsed(interpreter, "renderscript status",
14274640cde1SColin Riley                               "Displays current renderscript runtime status.", "renderscript status",
14284640cde1SColin Riley                               eCommandRequiresProcess | eCommandProcessMustBeLaunched)
14294640cde1SColin Riley     {
14304640cde1SColin Riley     }
14314640cde1SColin Riley 
14324640cde1SColin Riley     ~CommandObjectRenderScriptRuntimeStatus() {}
14334640cde1SColin Riley 
14344640cde1SColin Riley     bool
14354640cde1SColin Riley     DoExecute(Args &command, CommandReturnObject &result)
14364640cde1SColin Riley     {
14374640cde1SColin Riley         RenderScriptRuntime *runtime =
14384640cde1SColin Riley             (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript);
14394640cde1SColin Riley         runtime->Status(result.GetOutputStream());
14404640cde1SColin Riley         result.SetStatus(eReturnStatusSuccessFinishResult);
14414640cde1SColin Riley         return true;
14424640cde1SColin Riley     }
14434640cde1SColin Riley };
14444640cde1SColin Riley 
14455ec532a9SColin Riley class CommandObjectRenderScriptRuntime : public CommandObjectMultiword
14465ec532a9SColin Riley {
14475ec532a9SColin Riley   public:
14485ec532a9SColin Riley     CommandObjectRenderScriptRuntime(CommandInterpreter &interpreter)
14495ec532a9SColin Riley         : CommandObjectMultiword(interpreter, "renderscript", "A set of commands for operating on renderscript.",
14505ec532a9SColin Riley                                  "renderscript <subcommand> [<subcommand-options>]")
14515ec532a9SColin Riley     {
14525ec532a9SColin Riley         LoadSubCommand("module", CommandObjectSP(new CommandObjectRenderScriptRuntimeModule(interpreter)));
14534640cde1SColin Riley         LoadSubCommand("status", CommandObjectSP(new CommandObjectRenderScriptRuntimeStatus(interpreter)));
14544640cde1SColin Riley         LoadSubCommand("kernel", CommandObjectSP(new CommandObjectRenderScriptRuntimeKernel(interpreter)));
14554640cde1SColin Riley         LoadSubCommand("context", CommandObjectSP(new CommandObjectRenderScriptRuntimeContext(interpreter)));
14565ec532a9SColin Riley     }
14575ec532a9SColin Riley 
14585ec532a9SColin Riley     ~CommandObjectRenderScriptRuntime() {}
14595ec532a9SColin Riley };
1460ef20b08fSColin Riley 
1461ef20b08fSColin Riley void
1462ef20b08fSColin Riley RenderScriptRuntime::Initiate()
14635ec532a9SColin Riley {
1464ef20b08fSColin Riley     assert(!m_initiated);
14655ec532a9SColin Riley }
1466ef20b08fSColin Riley 
1467ef20b08fSColin Riley RenderScriptRuntime::RenderScriptRuntime(Process *process)
14687dc7771cSEwan Crawford     : lldb_private::CPPLanguageRuntime(process), m_initiated(false), m_debuggerPresentFlagged(false),
14697dc7771cSEwan Crawford       m_breakAllKernels(false)
1470ef20b08fSColin Riley {
14714640cde1SColin Riley     ModulesDidLoad(process->GetTarget().GetImages());
1472ef20b08fSColin Riley }
14734640cde1SColin Riley 
14744640cde1SColin Riley lldb::CommandObjectSP
14754640cde1SColin Riley RenderScriptRuntime::GetCommandObject(lldb_private::CommandInterpreter& interpreter)
14764640cde1SColin Riley {
14774640cde1SColin Riley     static CommandObjectSP command_object;
14784640cde1SColin Riley     if(!command_object)
14794640cde1SColin Riley     {
14804640cde1SColin Riley         command_object.reset(new CommandObjectRenderScriptRuntime(interpreter));
14814640cde1SColin Riley     }
14824640cde1SColin Riley     return command_object;
14834640cde1SColin Riley }
14844640cde1SColin Riley 
1485