Fix the process of getting the ObjC runtime - if we ask for it too early (in the process of handling the

load notification for the first load) then we will set it the runtime to NULL and won't re-search for it.
Added a way for the dynamic loader to force a re-search, since it knows the world has changed.

llvm-svn: 152453
This commit is contained in:
Jim Ingham 2012-03-10 00:22:19 +00:00
parent da00aa80b6
commit ab175242d9
3 changed files with 14 additions and 15 deletions

View File

@ -3033,14 +3033,14 @@ public:
virtual LanguageRuntime *
GetLanguageRuntime (lldb::LanguageType language);
GetLanguageRuntime (lldb::LanguageType language, bool retry_if_null = true);
virtual CPPLanguageRuntime *
GetCPPLanguageRuntime ();
GetCPPLanguageRuntime (bool retry_if_null = true);
virtual ObjCLanguageRuntime *
GetObjCLanguageRuntime ();
GetObjCLanguageRuntime (bool retry_if_null = true);
bool
IsRunning () const;

View File

@ -849,7 +849,7 @@ DynamicLoaderMacOSXDYLD::AddModulesUsingImageInfos (DYLDImageInfo::collection &i
// to save time.
// Also, I'm assuming there can be only one libobjc dylib loaded...
ObjCLanguageRuntime *objc_runtime = m_process->GetObjCLanguageRuntime();
ObjCLanguageRuntime *objc_runtime = m_process->GetObjCLanguageRuntime(true);
if (objc_runtime != NULL && !objc_runtime->HasReadObjCLibrary())
{
size_t num_modules = loaded_module_list.GetSize();

View File

@ -1462,35 +1462,34 @@ Process::GetABI()
}
LanguageRuntime *
Process::GetLanguageRuntime(lldb::LanguageType language)
Process::GetLanguageRuntime(lldb::LanguageType language, bool retry_if_null)
{
LanguageRuntimeCollection::iterator pos;
pos = m_language_runtimes.find (language);
if (pos == m_language_runtimes.end())
if (pos == m_language_runtimes.end() || (retry_if_null && !(*pos).second))
{
lldb::LanguageRuntimeSP runtime(LanguageRuntime::FindPlugin(this, language));
lldb::LanguageRuntimeSP runtime_sp(LanguageRuntime::FindPlugin(this, language));
m_language_runtimes[language]
= runtime;
return runtime.get();
m_language_runtimes[language] = runtime_sp;
return runtime_sp.get();
}
else
return (*pos).second.get();
}
CPPLanguageRuntime *
Process::GetCPPLanguageRuntime ()
Process::GetCPPLanguageRuntime (bool retry_if_null)
{
LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus);
LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus, retry_if_null);
if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeC_plus_plus)
return static_cast<CPPLanguageRuntime *> (runtime);
return NULL;
}
ObjCLanguageRuntime *
Process::GetObjCLanguageRuntime ()
Process::GetObjCLanguageRuntime (bool retry_if_null)
{
LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC);
LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC, retry_if_null);
if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeObjC)
return static_cast<ObjCLanguageRuntime *> (runtime);
return NULL;