diff options
Diffstat (limited to 'lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp')
-rw-r--r-- | lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp | 93 |
1 files changed, 85 insertions, 8 deletions
diff --git a/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp b/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp index 4c406b05bb7..65144944205 100644 --- a/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp +++ b/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp @@ -58,6 +58,45 @@ RenderScriptRuntime::GetPluginNameStatic() return g_name; } +RenderScriptRuntime::ModuleKind +RenderScriptRuntime::GetModuleKind(const lldb::ModuleSP &module_sp) +{ + if (module_sp) + { + // Is this a module containing renderscript kernels? + const Symbol *info_sym = module_sp->FindFirstSymbolWithNameAndType(ConstString(".rs.info"), eSymbolTypeData); + if (info_sym) + { + return eModuleKindKernelObj; + } + } + return eModuleKindIgnored; +} + +bool +RenderScriptRuntime::IsRenderScriptModule(const lldb::ModuleSP &module_sp) +{ + return GetModuleKind(module_sp) != eModuleKindIgnored; +} + + +void +RenderScriptRuntime::ModulesDidLoad(const ModuleList &module_list ) +{ + Mutex::Locker locker (module_list.GetMutex ()); + + size_t num_modules = module_list.GetSize(); + for (size_t i = 0; i < num_modules; i++) + { + auto mod = module_list.GetModuleAtIndex (i); + if (IsRenderScriptModule (mod)) + { + LoadModule(mod); + } + } +} + + //------------------------------------------------------------------ // PluginInterface protocol //------------------------------------------------------------------ @@ -109,16 +148,45 @@ RenderScriptRuntime::LoadModule(const lldb::ModuleSP &module_sp) if (rs_module.m_module == module_sp) return false; } - RSModuleDescriptor module_desc(module_sp); - if (module_desc.ParseRSInfo()) + bool module_loaded = false; + switch (GetModuleKind(module_sp)) { - m_rsmodules.push_back(module_desc); - return true; + case eModuleKindKernelObj: + { + RSModuleDescriptor module_desc(module_sp); + if (module_desc.ParseRSInfo()) + { + m_rsmodules.push_back(module_desc); + module_loaded = true; + } + break; + } + case eModuleKindDriver: + case eModuleKindImpl: + case eModuleKindLibRS: + default: + break; } + if (module_loaded) + Update(); + return module_loaded; } return false; } +void +RenderScriptRuntime::Update() +{ + if (m_rsmodules.size() > 0) + { + if (!m_initiated) + { + Initiate(); + } + } +} + + // The maximum line length of an .rs.info packet #define MAXLINE 500 @@ -344,13 +412,22 @@ class CommandObjectRenderScriptRuntime : public CommandObjectMultiword ~CommandObjectRenderScriptRuntime() {} }; -RenderScriptRuntime::RenderScriptRuntime(Process *process) - : lldb_private::CPPLanguageRuntime(process) + +void +RenderScriptRuntime::Initiate() { + assert(!m_initiated); + Process* process = GetProcess(); if (process) { CommandInterpreter &interpreter = process->GetTarget().GetDebugger().GetCommandInterpreter(); - interpreter.AddCommand("renderscript", CommandObjectSP(new CommandObjectRenderScriptRuntime(interpreter)), - true); + m_initiated = interpreter.AddCommand("renderscript", CommandObjectSP( + new CommandObjectRenderScriptRuntime(interpreter)), true); } } + +RenderScriptRuntime::RenderScriptRuntime(Process *process) + : lldb_private::CPPLanguageRuntime(process), m_initiated(false) +{ + +} |