forked from OSchip/llvm-project
<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:
parent
2ad6691be4
commit
e743c78299
|
@ -330,7 +330,7 @@ public:
|
|||
typedef bool (*LLDBCommandPluginInit) (lldb::SBDebugger& debugger);
|
||||
|
||||
bool
|
||||
LoadPlugin (const FileSpec& spec);
|
||||
LoadPlugin (const FileSpec& spec, Error& error);
|
||||
|
||||
protected:
|
||||
|
||||
|
|
|
@ -36,6 +36,9 @@ public:
|
|||
return (T)symbol;
|
||||
}
|
||||
|
||||
bool
|
||||
IsValid ();
|
||||
|
||||
private:
|
||||
lldb_private::FileSpec m_filespec;
|
||||
void* m_handle;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue