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