summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp')
-rw-r--r--lldb/source/Plugins/LanguageRuntime/RenderScript/RenderScriptRuntime/RenderScriptRuntime.cpp93
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)
+{
+
+}
OpenPOWER on IntegriCloud