15ec532a9SColin Riley //===-- RenderScriptRuntime.cpp ---------------------------------*- C++ -*-===// 25ec532a9SColin Riley // 35ec532a9SColin Riley // The LLVM Compiler Infrastructure 45ec532a9SColin Riley // 55ec532a9SColin Riley // This file is distributed under the University of Illinois Open Source 65ec532a9SColin Riley // License. See LICENSE.TXT for details. 75ec532a9SColin Riley // 85ec532a9SColin Riley //===----------------------------------------------------------------------===// 95ec532a9SColin Riley 105ec532a9SColin Riley #include "RenderScriptRuntime.h" 115ec532a9SColin Riley 125ec532a9SColin Riley #include "lldb/Core/ConstString.h" 135ec532a9SColin Riley #include "lldb/Core/Debugger.h" 145ec532a9SColin Riley #include "lldb/Core/Error.h" 155ec532a9SColin Riley #include "lldb/Core/Log.h" 165ec532a9SColin Riley #include "lldb/Core/PluginManager.h" 175ec532a9SColin Riley #include "lldb/Symbol/Symbol.h" 185ec532a9SColin Riley #include "lldb/Target/Process.h" 195ec532a9SColin Riley #include "lldb/Target/Target.h" 205ec532a9SColin Riley #include "lldb/Interpreter/Args.h" 215ec532a9SColin Riley #include "lldb/Interpreter/Options.h" 225ec532a9SColin Riley #include "lldb/Interpreter/CommandInterpreter.h" 235ec532a9SColin Riley #include "lldb/Interpreter/CommandReturnObject.h" 245ec532a9SColin Riley #include "lldb/Interpreter/CommandObjectMultiword.h" 255ec532a9SColin Riley 265ec532a9SColin Riley using namespace lldb; 275ec532a9SColin Riley using namespace lldb_private; 285ec532a9SColin Riley 295ec532a9SColin Riley //------------------------------------------------------------------ 305ec532a9SColin Riley // Static Functions 315ec532a9SColin Riley //------------------------------------------------------------------ 325ec532a9SColin Riley LanguageRuntime * 335ec532a9SColin Riley RenderScriptRuntime::CreateInstance(Process *process, lldb::LanguageType language) 345ec532a9SColin Riley { 355ec532a9SColin Riley 365ec532a9SColin Riley if (language == eLanguageTypeExtRenderScript) 375ec532a9SColin Riley return new RenderScriptRuntime(process); 385ec532a9SColin Riley else 395ec532a9SColin Riley return NULL; 405ec532a9SColin Riley } 415ec532a9SColin Riley 425ec532a9SColin Riley void 435ec532a9SColin Riley RenderScriptRuntime::Initialize() 445ec532a9SColin Riley { 455ec532a9SColin Riley PluginManager::RegisterPlugin(GetPluginNameStatic(), "RenderScript language support", CreateInstance); 465ec532a9SColin Riley } 475ec532a9SColin Riley 485ec532a9SColin Riley void 495ec532a9SColin Riley RenderScriptRuntime::Terminate() 505ec532a9SColin Riley { 515ec532a9SColin Riley PluginManager::UnregisterPlugin(CreateInstance); 525ec532a9SColin Riley } 535ec532a9SColin Riley 545ec532a9SColin Riley lldb_private::ConstString 555ec532a9SColin Riley RenderScriptRuntime::GetPluginNameStatic() 565ec532a9SColin Riley { 575ec532a9SColin Riley static ConstString g_name("renderscript"); 585ec532a9SColin Riley return g_name; 595ec532a9SColin Riley } 605ec532a9SColin Riley 615ec532a9SColin Riley //------------------------------------------------------------------ 625ec532a9SColin Riley // PluginInterface protocol 635ec532a9SColin Riley //------------------------------------------------------------------ 645ec532a9SColin Riley lldb_private::ConstString 655ec532a9SColin Riley RenderScriptRuntime::GetPluginName() 665ec532a9SColin Riley { 675ec532a9SColin Riley return GetPluginNameStatic(); 685ec532a9SColin Riley } 695ec532a9SColin Riley 705ec532a9SColin Riley uint32_t 715ec532a9SColin Riley RenderScriptRuntime::GetPluginVersion() 725ec532a9SColin Riley { 735ec532a9SColin Riley return 1; 745ec532a9SColin Riley } 755ec532a9SColin Riley 765ec532a9SColin Riley bool 775ec532a9SColin Riley RenderScriptRuntime::IsVTableName(const char *name) 785ec532a9SColin Riley { 795ec532a9SColin Riley return false; 805ec532a9SColin Riley } 815ec532a9SColin Riley 825ec532a9SColin Riley bool 835ec532a9SColin Riley RenderScriptRuntime::GetDynamicTypeAndAddress(ValueObject &in_value, lldb::DynamicValueType use_dynamic, 845ec532a9SColin Riley TypeAndOrName &class_type_or_name, Address &address) 855ec532a9SColin Riley { 865ec532a9SColin Riley return false; 875ec532a9SColin Riley } 885ec532a9SColin Riley 895ec532a9SColin Riley bool 905ec532a9SColin Riley RenderScriptRuntime::CouldHaveDynamicValue(ValueObject &in_value) 915ec532a9SColin Riley { 925ec532a9SColin Riley return false; 935ec532a9SColin Riley } 945ec532a9SColin Riley 955ec532a9SColin Riley lldb::BreakpointResolverSP 965ec532a9SColin Riley RenderScriptRuntime::CreateExceptionResolver(Breakpoint *bkpt, bool catch_bp, bool throw_bp) 975ec532a9SColin Riley { 985ec532a9SColin Riley BreakpointResolverSP resolver_sp; 995ec532a9SColin Riley return resolver_sp; 1005ec532a9SColin Riley } 1015ec532a9SColin Riley 1025ec532a9SColin Riley bool 1035ec532a9SColin Riley RenderScriptRuntime::LoadModule(const lldb::ModuleSP &module_sp) 1045ec532a9SColin Riley { 1055ec532a9SColin Riley if (module_sp) 1065ec532a9SColin Riley { 1075ec532a9SColin Riley for (const auto &rs_module : m_rsmodules) 1085ec532a9SColin Riley { 1095ec532a9SColin Riley if (rs_module.m_module == module_sp) 1105ec532a9SColin Riley return false; 1115ec532a9SColin Riley } 1125ec532a9SColin Riley RSModuleDescriptor module_desc(module_sp); 1135ec532a9SColin Riley if (module_desc.ParseRSInfo()) 1145ec532a9SColin Riley { 1155ec532a9SColin Riley m_rsmodules.push_back(module_desc); 1165ec532a9SColin Riley return true; 1175ec532a9SColin Riley } 1185ec532a9SColin Riley } 1195ec532a9SColin Riley return false; 1205ec532a9SColin Riley } 1215ec532a9SColin Riley 1225ec532a9SColin Riley // The maximum line length of an .rs.info packet 1235ec532a9SColin Riley #define MAXLINE 500 1245ec532a9SColin Riley 1255ec532a9SColin Riley // The .rs.info symbol in renderscript modules contains a string which needs to be parsed. 1265ec532a9SColin Riley // The string is basic and is parsed on a line by line basis. 1275ec532a9SColin Riley bool 1285ec532a9SColin Riley RSModuleDescriptor::ParseRSInfo() 1295ec532a9SColin Riley { 1305ec532a9SColin Riley const Symbol *info_sym = m_module->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), eSymbolTypeData); 1315ec532a9SColin Riley if (info_sym) 1325ec532a9SColin Riley { 1335ec532a9SColin Riley const addr_t addr = info_sym->GetAddress().GetFileAddress(); 1345ec532a9SColin Riley const addr_t size = info_sym->GetByteSize(); 1355ec532a9SColin Riley const FileSpec fs = m_module->GetFileSpec(); 1365ec532a9SColin Riley 1375ec532a9SColin Riley DataBufferSP buffer = fs.ReadFileContents(addr, size); 1385ec532a9SColin Riley 1395ec532a9SColin Riley if (!buffer) 1405ec532a9SColin Riley return false; 1415ec532a9SColin Riley 1425ec532a9SColin Riley std::string info((const char *)buffer->GetBytes()); 1435ec532a9SColin Riley 1445ec532a9SColin Riley std::vector<std::string> info_lines; 1455ec532a9SColin Riley size_t lpos = info.find_first_of("\n"); 1465ec532a9SColin Riley while (lpos != std::string::npos) 1475ec532a9SColin Riley { 1485ec532a9SColin Riley info_lines.push_back(info.substr(0, lpos)); 1495ec532a9SColin Riley info = info.substr(lpos + 1); 1505ec532a9SColin Riley lpos = info.find_first_of("\n"); 1515ec532a9SColin Riley } 1525ec532a9SColin Riley size_t offset = 0; 1535ec532a9SColin Riley while (offset < info_lines.size()) 1545ec532a9SColin Riley { 1555ec532a9SColin Riley std::string line = info_lines[offset]; 1565ec532a9SColin Riley // Parse directives 1575ec532a9SColin Riley uint32_t numDefns = 0; 1585ec532a9SColin Riley if (sscanf(line.c_str(), "exportVarCount: %u", &numDefns) == 1) 1595ec532a9SColin Riley { 1605ec532a9SColin Riley while (numDefns--) 1615ec532a9SColin Riley m_globals.push_back(RSGlobalDescriptor(*this, info_lines[++offset].c_str())); 1625ec532a9SColin Riley } 1635ec532a9SColin Riley else if (sscanf(line.c_str(), "exportFuncCount: %u", &numDefns) == 1) 1645ec532a9SColin Riley { 1655ec532a9SColin Riley } 1665ec532a9SColin Riley else if (sscanf(line.c_str(), "exportForEachCount: %u", &numDefns) == 1) 1675ec532a9SColin Riley { 1685ec532a9SColin Riley char name[MAXLINE]; 1695ec532a9SColin Riley while (numDefns--) 1705ec532a9SColin Riley { 1715ec532a9SColin Riley uint32_t slot = 0; 1725ec532a9SColin Riley name[0] = '\0'; 1735ec532a9SColin Riley if (sscanf(info_lines[++offset].c_str(), "%u - %s", &slot, &name[0]) == 2) 1745ec532a9SColin Riley { 1755ec532a9SColin Riley m_kernels.push_back(RSKernelDescriptor(*this, name, slot)); 1765ec532a9SColin Riley } 1775ec532a9SColin Riley } 1785ec532a9SColin Riley } 1795ec532a9SColin Riley else if (sscanf(line.c_str(), "objectSlotCount: %u", &numDefns) == 1) 1805ec532a9SColin Riley { 1815ec532a9SColin Riley } 1825ec532a9SColin Riley 1835ec532a9SColin Riley offset++; 1845ec532a9SColin Riley } 1855ec532a9SColin Riley return m_kernels.size() > 0; 1865ec532a9SColin Riley } 1875ec532a9SColin Riley return false; 1885ec532a9SColin Riley } 1895ec532a9SColin Riley 1905ec532a9SColin Riley bool 1915ec532a9SColin Riley RenderScriptRuntime::ProbeModules(const ModuleList module_list) 1925ec532a9SColin Riley { 1935ec532a9SColin Riley bool rs_found = false; 1945ec532a9SColin Riley size_t num_modules = module_list.GetSize(); 1955ec532a9SColin Riley for (size_t i = 0; i < num_modules; i++) 1965ec532a9SColin Riley { 1975ec532a9SColin Riley auto module = module_list.GetModuleAtIndex(i); 1985ec532a9SColin Riley rs_found |= LoadModule(module); 1995ec532a9SColin Riley } 2005ec532a9SColin Riley return rs_found; 2015ec532a9SColin Riley } 2025ec532a9SColin Riley 2035ec532a9SColin Riley void 2045ec532a9SColin Riley RenderScriptRuntime::DumpModules(Stream &strm) const 2055ec532a9SColin Riley { 2065ec532a9SColin Riley strm.Printf("RenderScript Modules:"); 2075ec532a9SColin Riley strm.EOL(); 2085ec532a9SColin Riley strm.IndentMore(); 2095ec532a9SColin Riley for (const auto &module : m_rsmodules) 2105ec532a9SColin Riley { 2115ec532a9SColin Riley module.Dump(strm); 2125ec532a9SColin Riley } 2135ec532a9SColin Riley strm.IndentLess(); 2145ec532a9SColin Riley } 2155ec532a9SColin Riley 2165ec532a9SColin Riley void 2175ec532a9SColin Riley RSModuleDescriptor::Dump(Stream &strm) const 2185ec532a9SColin Riley { 2195ec532a9SColin Riley strm.Indent(); 2205ec532a9SColin Riley m_module->GetFileSpec().Dump(&strm); 2215ec532a9SColin Riley strm.EOL(); 2225ec532a9SColin Riley strm.IndentMore(); 2235ec532a9SColin Riley strm.Indent(); 224*189598edSColin Riley strm.Printf("Globals: %" PRIu64, static_cast<uint64_t>(m_globals.size())); 2255ec532a9SColin Riley strm.EOL(); 2265ec532a9SColin Riley strm.IndentMore(); 2275ec532a9SColin Riley for (const auto &global : m_globals) 2285ec532a9SColin Riley { 2295ec532a9SColin Riley global.Dump(strm); 2305ec532a9SColin Riley } 2315ec532a9SColin Riley strm.IndentLess(); 2325ec532a9SColin Riley strm.Indent(); 233*189598edSColin Riley strm.Printf("Kernels: %" PRIu64, static_cast<uint64_t>(m_kernels.size())); 2345ec532a9SColin Riley strm.EOL(); 2355ec532a9SColin Riley strm.IndentMore(); 2365ec532a9SColin Riley for (const auto &kernel : m_kernels) 2375ec532a9SColin Riley { 2385ec532a9SColin Riley kernel.Dump(strm); 2395ec532a9SColin Riley } 2405ec532a9SColin Riley strm.IndentLess(4); 2415ec532a9SColin Riley } 2425ec532a9SColin Riley 2435ec532a9SColin Riley void 2445ec532a9SColin Riley RSGlobalDescriptor::Dump(Stream &strm) const 2455ec532a9SColin Riley { 2465ec532a9SColin Riley strm.Indent(m_name.AsCString()); 2475ec532a9SColin Riley strm.EOL(); 2485ec532a9SColin Riley } 2495ec532a9SColin Riley 2505ec532a9SColin Riley void 2515ec532a9SColin Riley RSKernelDescriptor::Dump(Stream &strm) const 2525ec532a9SColin Riley { 2535ec532a9SColin Riley strm.Indent(m_name.AsCString()); 2545ec532a9SColin Riley strm.EOL(); 2555ec532a9SColin Riley } 2565ec532a9SColin Riley 2575ec532a9SColin Riley class CommandObjectRenderScriptRuntimeModuleProbe : public CommandObjectParsed 2585ec532a9SColin Riley { 2595ec532a9SColin Riley private: 2605ec532a9SColin Riley public: 2615ec532a9SColin Riley CommandObjectRenderScriptRuntimeModuleProbe(CommandInterpreter &interpreter) 2625ec532a9SColin Riley : CommandObjectParsed(interpreter, "renderscript module probe", 2635ec532a9SColin Riley "Initiates a Probe of all loaded modules for kernels and other renderscript objects.", 2645ec532a9SColin Riley "renderscript module probe", 2655ec532a9SColin Riley eFlagRequiresTarget | eFlagRequiresProcess | eFlagProcessMustBeLaunched) 2665ec532a9SColin Riley { 2675ec532a9SColin Riley } 2685ec532a9SColin Riley 2695ec532a9SColin Riley ~CommandObjectRenderScriptRuntimeModuleProbe() {} 2705ec532a9SColin Riley 2715ec532a9SColin Riley bool 2725ec532a9SColin Riley DoExecute(Args &command, CommandReturnObject &result) 2735ec532a9SColin Riley { 2745ec532a9SColin Riley const size_t argc = command.GetArgumentCount(); 2755ec532a9SColin Riley if (argc == 0) 2765ec532a9SColin Riley { 2775ec532a9SColin Riley Target *target = m_exe_ctx.GetTargetPtr(); 2785ec532a9SColin Riley RenderScriptRuntime *runtime = 2795ec532a9SColin Riley (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript); 2805ec532a9SColin Riley auto module_list = target->GetImages(); 2815ec532a9SColin Riley bool new_rs_details = runtime->ProbeModules(module_list); 2825ec532a9SColin Riley if (new_rs_details) 2835ec532a9SColin Riley { 2845ec532a9SColin Riley result.AppendMessage("New renderscript modules added to runtime model."); 2855ec532a9SColin Riley } 2865ec532a9SColin Riley result.SetStatus(eReturnStatusSuccessFinishResult); 2875ec532a9SColin Riley return true; 2885ec532a9SColin Riley } 2895ec532a9SColin Riley 2905ec532a9SColin Riley result.AppendErrorWithFormat("'%s' takes no arguments", m_cmd_name.c_str()); 2915ec532a9SColin Riley result.SetStatus(eReturnStatusFailed); 2925ec532a9SColin Riley return false; 2935ec532a9SColin Riley } 2945ec532a9SColin Riley }; 2955ec532a9SColin Riley 2965ec532a9SColin Riley class CommandObjectRenderScriptRuntimeModuleDump : public CommandObjectParsed 2975ec532a9SColin Riley { 2985ec532a9SColin Riley private: 2995ec532a9SColin Riley public: 3005ec532a9SColin Riley CommandObjectRenderScriptRuntimeModuleDump(CommandInterpreter &interpreter) 3015ec532a9SColin Riley : CommandObjectParsed(interpreter, "renderscript module dump", 3025ec532a9SColin Riley "Dumps renderscript specific information for all modules.", "renderscript module dump", 3035ec532a9SColin Riley eFlagRequiresProcess | eFlagProcessMustBeLaunched) 3045ec532a9SColin Riley { 3055ec532a9SColin Riley } 3065ec532a9SColin Riley 3075ec532a9SColin Riley ~CommandObjectRenderScriptRuntimeModuleDump() {} 3085ec532a9SColin Riley 3095ec532a9SColin Riley bool 3105ec532a9SColin Riley DoExecute(Args &command, CommandReturnObject &result) 3115ec532a9SColin Riley { 3125ec532a9SColin Riley RenderScriptRuntime *runtime = 3135ec532a9SColin Riley (RenderScriptRuntime *)m_exe_ctx.GetProcessPtr()->GetLanguageRuntime(eLanguageTypeExtRenderScript); 3145ec532a9SColin Riley runtime->DumpModules(result.GetOutputStream()); 3155ec532a9SColin Riley result.SetStatus(eReturnStatusSuccessFinishResult); 3165ec532a9SColin Riley return true; 3175ec532a9SColin Riley } 3185ec532a9SColin Riley }; 3195ec532a9SColin Riley 3205ec532a9SColin Riley class CommandObjectRenderScriptRuntimeModule : public CommandObjectMultiword 3215ec532a9SColin Riley { 3225ec532a9SColin Riley private: 3235ec532a9SColin Riley public: 3245ec532a9SColin Riley CommandObjectRenderScriptRuntimeModule(CommandInterpreter &interpreter) 3255ec532a9SColin Riley : CommandObjectMultiword(interpreter, "renderscript module", "Commands that deal with renderscript modules.", 3265ec532a9SColin Riley NULL) 3275ec532a9SColin Riley { 3285ec532a9SColin Riley LoadSubCommand("probe", CommandObjectSP(new CommandObjectRenderScriptRuntimeModuleProbe(interpreter))); 3295ec532a9SColin Riley LoadSubCommand("dump", CommandObjectSP(new CommandObjectRenderScriptRuntimeModuleDump(interpreter))); 3305ec532a9SColin Riley } 3315ec532a9SColin Riley 3325ec532a9SColin Riley ~CommandObjectRenderScriptRuntimeModule() {} 3335ec532a9SColin Riley }; 3345ec532a9SColin Riley 3355ec532a9SColin Riley class CommandObjectRenderScriptRuntime : public CommandObjectMultiword 3365ec532a9SColin Riley { 3375ec532a9SColin Riley public: 3385ec532a9SColin Riley CommandObjectRenderScriptRuntime(CommandInterpreter &interpreter) 3395ec532a9SColin Riley : CommandObjectMultiword(interpreter, "renderscript", "A set of commands for operating on renderscript.", 3405ec532a9SColin Riley "renderscript <subcommand> [<subcommand-options>]") 3415ec532a9SColin Riley { 3425ec532a9SColin Riley LoadSubCommand("module", CommandObjectSP(new CommandObjectRenderScriptRuntimeModule(interpreter))); 3435ec532a9SColin Riley } 3445ec532a9SColin Riley 3455ec532a9SColin Riley ~CommandObjectRenderScriptRuntime() {} 3465ec532a9SColin Riley }; 3475ec532a9SColin Riley RenderScriptRuntime::RenderScriptRuntime(Process *process) 3485ec532a9SColin Riley : lldb_private::CPPLanguageRuntime(process) 3495ec532a9SColin Riley { 3505ec532a9SColin Riley if (process) 3515ec532a9SColin Riley { 3525ec532a9SColin Riley CommandInterpreter &interpreter = process->GetTarget().GetDebugger().GetCommandInterpreter(); 3535ec532a9SColin Riley interpreter.AddCommand("renderscript", CommandObjectSP(new CommandObjectRenderScriptRuntime(interpreter)), 3545ec532a9SColin Riley true); 3555ec532a9SColin Riley } 3565ec532a9SColin Riley } 357