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