<rdar://problem/13209140>

“plugin load” tries to be more helpful when it fails to load a plugin

llvm-svn: 180218
This commit is contained in:
Enrico Granata 2013-04-24 21:29:08 +00:00
parent 2ad6691be4
commit e743c78299
5 changed files with 29 additions and 4 deletions

View File

@ -330,7 +330,7 @@ public:
typedef bool (*LLDBCommandPluginInit) (lldb::SBDebugger& debugger);
bool
LoadPlugin (const FileSpec& spec);
LoadPlugin (const FileSpec& spec, Error& error);
protected:

View File

@ -36,6 +36,9 @@ public:
return (T)symbol;
}
bool
IsValid ();
private:
lldb_private::FileSpec m_filespec;
void* m_handle;

View File

@ -96,10 +96,13 @@ protected:
FileSpec dylib_fspec(path,true);
if (m_interpreter.GetDebugger().LoadPlugin(dylib_fspec))
if (m_interpreter.GetDebugger().LoadPlugin(dylib_fspec, error))
result.SetStatus(eReturnStatusSuccessFinishResult);
else
{
result.AppendError(error.AsCString());
result.SetStatus(eReturnStatusFailed);
}
return result.Succeeded();
}

View File

@ -344,20 +344,32 @@ Debugger::SettingsTerminate ()
}
bool
Debugger::LoadPlugin (const FileSpec& spec)
Debugger::LoadPlugin (const FileSpec& spec, Error& error)
{
lldb::DynamicLibrarySP dynlib_sp(new lldb_private::DynamicLibrary(spec));
if (!dynlib_sp || dynlib_sp->IsValid() == false)
{
if (spec.Exists())
error.SetErrorString("this file does not represent a loadable dylib");
else
error.SetErrorString("no such file");
return false;
}
lldb::DebuggerSP debugger_sp(shared_from_this());
lldb::SBDebugger debugger_sb(debugger_sp);
// TODO: mangle this differently for your system - on OSX, the first underscore needs to be removed and the second one stays
LLDBCommandPluginInit init_func = dynlib_sp->GetSymbol<LLDBCommandPluginInit>("_ZN4lldb16PluginInitializeENS_10SBDebuggerE");
if (!init_func)
{
error.SetErrorString("cannot find the initialization function lldb::PluginInitialize(lldb::SBDebugger)");
return false;
}
if (init_func(debugger_sb))
{
m_loaded_plugins.push_back(dynlib_sp);
return true;
}
error.SetErrorString("dylib refused to be loaded");
return false;
}
@ -392,7 +404,8 @@ LoadPluginCallback
if (plugin_file_spec.GetFileNameExtension() != g_dylibext)
return FileSpec::eEnumerateDirectoryResultNext;
debugger->LoadPlugin (plugin_file_spec);
Error plugin_load_error;
debugger->LoadPlugin (plugin_file_spec, plugin_load_error);
return FileSpec::eEnumerateDirectoryResultNext;
}

View File

@ -20,6 +20,12 @@ DynamicLibrary::DynamicLibrary (const FileSpec& spec, uint32_t options) : m_file
m_handle = NULL;
}
bool
DynamicLibrary::IsValid ()
{
return m_handle != NULL;
}
DynamicLibrary::~DynamicLibrary ()
{
if (m_handle)