diff options
| author | Zachary Turner <zturner@google.com> | 2014-08-27 20:15:09 +0000 |
|---|---|---|
| committer | Zachary Turner <zturner@google.com> | 2014-08-27 20:15:09 +0000 |
| commit | 58a559c07e448570659b92de50ca22172fbe0508 (patch) | |
| tree | c531c86e19e38d9e81e69355ddacc4dbc5f9458e /lldb/source | |
| parent | dfbe3d6b17b0038d61a2d4a05e6ac3185a81f4a3 (diff) | |
| download | bcm5719-llvm-58a559c07e448570659b92de50ca22172fbe0508.tar.gz bcm5719-llvm-58a559c07e448570659b92de50ca22172fbe0508.zip | |
Update LLDB to use LLVM's DynamicLibrary.
LLDB had implemented its own DynamicLibrary class for plugin
support. LLVM has an equivalent mechanism, so this patch deletes
the duplicated code in LLDB and updates LLDB to reference the
mechanism provided by LLVM.
llvm-svn: 216606
Diffstat (limited to 'lldb/source')
| -rw-r--r-- | lldb/source/API/SBDebugger.cpp | 15 | ||||
| -rw-r--r-- | lldb/source/Core/Debugger.cpp | 9 | ||||
| -rw-r--r-- | lldb/source/Core/PluginManager.cpp | 41 | ||||
| -rw-r--r-- | lldb/source/Host/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | lldb/source/Host/common/DynamicLibrary.cpp | 33 | ||||
| -rw-r--r-- | lldb/source/Host/common/Host.cpp | 124 | ||||
| -rw-r--r-- | lldb/source/Host/windows/Host.cpp | 22 |
7 files changed, 31 insertions, 214 deletions
diff --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp index 20d62b4f809..dae567525a4 100644 --- a/lldb/source/API/SBDebugger.cpp +++ b/lldb/source/API/SBDebugger.cpp @@ -38,13 +38,14 @@ #include "lldb/Core/State.h" #include "lldb/Core/StreamFile.h" #include "lldb/DataFormatters/DataVisualization.h" -#include "lldb/Host/DynamicLibrary.h" #include "lldb/Interpreter/Args.h" #include "lldb/Interpreter/CommandInterpreter.h" #include "lldb/Interpreter/OptionGroupPlatform.h" #include "lldb/Target/Process.h" #include "lldb/Target/TargetList.h" +#include "llvm/Support/DynamicLibrary.h" + using namespace lldb; using namespace lldb_private; @@ -72,22 +73,22 @@ SBInputReader::IsActive() const return false; } -static lldb::DynamicLibrarySP +static llvm::sys::DynamicLibrary LoadPlugin (const lldb::DebuggerSP &debugger_sp, const FileSpec& spec, Error& error) { - lldb::DynamicLibrarySP dynlib_sp(new lldb_private::DynamicLibrary(spec)); - if (dynlib_sp && dynlib_sp->IsValid()) + llvm::sys::DynamicLibrary dynlib = llvm::sys::DynamicLibrary::getPermanentLibrary(spec.GetPath().c_str()); + if (dynlib.isValid()) { typedef bool (*LLDBCommandPluginInit) (lldb::SBDebugger& debugger); lldb::SBDebugger debugger_sb(debugger_sp); // This calls the bool lldb::PluginInitialize(lldb::SBDebugger debugger) function. // 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"); + LLDBCommandPluginInit init_func = (LLDBCommandPluginInit)dynlib.getAddressOfSymbol("_ZN4lldb16PluginInitializeENS_10SBDebuggerE"); if (init_func) { if (init_func(debugger_sb)) - return dynlib_sp; + return dynlib; else error.SetErrorString("plug-in refused to load (lldb::PluginInitialize(lldb::SBDebugger) returned false)"); } @@ -103,7 +104,7 @@ LoadPlugin (const lldb::DebuggerSP &debugger_sp, const FileSpec& spec, Error& er else error.SetErrorString("no such file"); } - return lldb::DynamicLibrarySP(); + return llvm::sys::DynamicLibrary(); } void diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index 98479374ba8..17829634767 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -34,7 +34,6 @@ #include "lldb/DataFormatters/DataVisualization.h" #include "lldb/DataFormatters/FormatManager.h" #include "lldb/DataFormatters/TypeSummary.h" -#include "lldb/Host/DynamicLibrary.h" #include "lldb/Host/HostInfo.h" #include "lldb/Host/Terminal.h" #include "lldb/Interpreter/CommandInterpreter.h" @@ -54,6 +53,8 @@ #include "lldb/Target/Thread.h" #include "lldb/Utility/AnsiTerminal.h" +#include "llvm/Support/DynamicLibrary.h" + using namespace lldb; using namespace lldb_private; @@ -413,10 +414,10 @@ Debugger::LoadPlugin (const FileSpec& spec, Error& error) { if (g_load_plugin_callback) { - lldb::DynamicLibrarySP dynlib_sp = g_load_plugin_callback (shared_from_this(), spec, error); - if (dynlib_sp) + llvm::sys::DynamicLibrary dynlib = g_load_plugin_callback (shared_from_this(), spec, error); + if (dynlib.isValid()) { - m_loaded_plugins.push_back(dynlib_sp); + m_loaded_plugins.push_back(dynlib); return true; } } diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp index 619dbc709d5..cda55802fab 100644 --- a/lldb/source/Core/PluginManager.cpp +++ b/lldb/source/Core/PluginManager.cpp @@ -25,6 +25,7 @@ #include "lldb/Interpreter/OptionValueProperties.h" #include "llvm/ADT/StringRef.h" +#include "llvm/Support/DynamicLibrary.h" using namespace lldb; using namespace lldb_private; @@ -42,7 +43,12 @@ typedef void (*PluginTermCallback) (void); struct PluginInfo { - void *plugin_handle; + PluginInfo() + : plugin_init_callback(nullptr), plugin_term_callback(nullptr) + { + } + + llvm::sys::DynamicLibrary library; PluginInitCallback plugin_init_callback; PluginTermCallback plugin_term_callback; }; @@ -113,20 +119,15 @@ LoadPluginCallback return FileSpec::eEnumerateDirectoryResultNext; else { - PluginInfo plugin_info = { NULL, NULL, NULL }; - uint32_t flags = Host::eDynamicLibraryOpenOptionLazy | - Host::eDynamicLibraryOpenOptionLocal | - Host::eDynamicLibraryOpenOptionLimitGetSymbol; + PluginInfo plugin_info; - plugin_info.plugin_handle = Host::DynamicLibraryOpen (plugin_file_spec, flags, error); - if (plugin_info.plugin_handle) + std::string pluginLoadError; + plugin_info.library = llvm::sys::DynamicLibrary::getPermanentLibrary (plugin_file_spec.GetPath().c_str(), &pluginLoadError); + if (plugin_info.library.isValid()) { bool success = false; plugin_info.plugin_init_callback = - CastToFPtr<PluginInitCallback>( - Host::DynamicLibraryGetSymbol(plugin_info.plugin_handle, - "LLDBPluginInitialize", - error)); + CastToFPtr<PluginInitCallback>(plugin_info.library.getAddressOfSymbol("LLDBPluginInitialize")); if (plugin_info.plugin_init_callback) { // Call the plug-in "bool LLDBPluginInitialize(void)" function @@ -137,19 +138,14 @@ LoadPluginCallback { // It is ok for the "LLDBPluginTerminate" symbol to be NULL plugin_info.plugin_term_callback = - CastToFPtr<PluginTermCallback>( - Host::DynamicLibraryGetSymbol( - plugin_info.plugin_handle, "LLDBPluginTerminate", - error)); + CastToFPtr<PluginTermCallback>(plugin_info.library.getAddressOfSymbol("LLDBPluginTerminate")); } else { - // The initialize function returned FALSE which means the - // plug-in might not be compatible, or might be too new or - // too old, or might not want to run on this machine. - Host::DynamicLibraryClose (plugin_info.plugin_handle); - plugin_info.plugin_handle = NULL; - plugin_info.plugin_init_callback = NULL; + // The initialize function returned FALSE which means the plug-in might not be + // compatible, or might be too new or too old, or might not want to run on this + // machine. Set it to a default-constructed instance to invalidate it. + plugin_info = PluginInfo(); } // Regardless of success or failure, cache the plug-in load @@ -225,11 +221,10 @@ PluginManager::Terminate () { // Call the plug-in "void LLDBPluginTerminate (void)" function if there // is one (if the symbol was not NULL). - if (pos->second.plugin_handle) + if (pos->second.library.isValid()) { if (pos->second.plugin_term_callback) pos->second.plugin_term_callback(); - Host::DynamicLibraryClose (pos->second.plugin_handle); } } plugin_map.clear(); diff --git a/lldb/source/Host/CMakeLists.txt b/lldb/source/Host/CMakeLists.txt index 3fc9dd939e2..18077122540 100644 --- a/lldb/source/Host/CMakeLists.txt +++ b/lldb/source/Host/CMakeLists.txt @@ -5,7 +5,6 @@ endmacro() add_host_subdirectory(common common/Condition.cpp - common/DynamicLibrary.cpp common/Editline.cpp common/File.cpp common/FileCache.cpp diff --git a/lldb/source/Host/common/DynamicLibrary.cpp b/lldb/source/Host/common/DynamicLibrary.cpp deleted file mode 100644 index 315a675895f..00000000000 --- a/lldb/source/Host/common/DynamicLibrary.cpp +++ /dev/null @@ -1,33 +0,0 @@ -//===-- DynamicLibrary.cpp ------------------------------------------*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "lldb/Core/Error.h" -#include "lldb/Host/DynamicLibrary.h" - -using namespace lldb_private; - -DynamicLibrary::DynamicLibrary (const FileSpec& spec, uint32_t options) : m_filespec(spec) -{ - Error err; - m_handle = Host::DynamicLibraryOpen (spec,options,err); - if (err.Fail()) - m_handle = NULL; -} - -bool -DynamicLibrary::IsValid () -{ - return m_handle != NULL; -} - -DynamicLibrary::~DynamicLibrary () -{ - if (m_handle) - Host::DynamicLibraryClose (m_handle); -} diff --git a/lldb/source/Host/common/Host.cpp b/lldb/source/Host/common/Host.cpp index 770ef0f3cea..0ce42ac7e12 100644 --- a/lldb/source/Host/common/Host.cpp +++ b/lldb/source/Host/common/Host.cpp @@ -664,130 +664,6 @@ Host::ResolveExecutableInBundle (FileSpec &file) #ifndef _WIN32 -// Opaque info that tracks a dynamic library that was loaded -struct DynamicLibraryInfo -{ - DynamicLibraryInfo (const FileSpec &fs, int o, void *h) : - file_spec (fs), - open_options (o), - handle (h) - { - } - - const FileSpec file_spec; - uint32_t open_options; - void * handle; -}; - -void * -Host::DynamicLibraryOpen (const FileSpec &file_spec, uint32_t options, Error &error) -{ - char path[PATH_MAX]; - if (file_spec.GetPath(path, sizeof(path))) - { - int mode = 0; - - if (options & eDynamicLibraryOpenOptionLazy) - mode |= RTLD_LAZY; - else - mode |= RTLD_NOW; - - - if (options & eDynamicLibraryOpenOptionLocal) - mode |= RTLD_LOCAL; - else - mode |= RTLD_GLOBAL; - -#ifdef LLDB_CONFIG_DLOPEN_RTLD_FIRST_SUPPORTED - if (options & eDynamicLibraryOpenOptionLimitGetSymbol) - mode |= RTLD_FIRST; -#endif - - void * opaque = ::dlopen (path, mode); - - if (opaque) - { - error.Clear(); - return new DynamicLibraryInfo (file_spec, options, opaque); - } - else - { - error.SetErrorString(::dlerror()); - } - } - else - { - error.SetErrorString("failed to extract path"); - } - return NULL; -} - -Error -Host::DynamicLibraryClose (void *opaque) -{ - Error error; - if (opaque == NULL) - { - error.SetErrorString ("invalid dynamic library handle"); - } - else - { - DynamicLibraryInfo *dylib_info = (DynamicLibraryInfo *) opaque; - if (::dlclose (dylib_info->handle) != 0) - { - error.SetErrorString(::dlerror()); - } - - dylib_info->open_options = 0; - dylib_info->handle = 0; - delete dylib_info; - } - return error; -} - -void * -Host::DynamicLibraryGetSymbol (void *opaque, const char *symbol_name, Error &error) -{ - if (opaque == NULL) - { - error.SetErrorString ("invalid dynamic library handle"); - } - else - { - DynamicLibraryInfo *dylib_info = (DynamicLibraryInfo *) opaque; - - void *symbol_addr = ::dlsym (dylib_info->handle, symbol_name); - if (symbol_addr) - { -#ifndef LLDB_CONFIG_DLOPEN_RTLD_FIRST_SUPPORTED - // This host doesn't support limiting searches to this shared library - // so we need to verify that the match came from this shared library - // if it was requested in the Host::DynamicLibraryOpen() function. - if (dylib_info->open_options & eDynamicLibraryOpenOptionLimitGetSymbol) - { - FileSpec match_dylib_spec (Host::GetModuleFileSpecForHostAddress (symbol_addr)); - if (match_dylib_spec != dylib_info->file_spec) - { - char dylib_path[PATH_MAX]; - if (dylib_info->file_spec.GetPath (dylib_path, sizeof(dylib_path))) - error.SetErrorStringWithFormat ("symbol not found in \"%s\"", dylib_path); - else - error.SetErrorString ("symbol not found"); - return NULL; - } - } -#endif - error.Clear(); - return symbol_addr; - } - else - { - error.SetErrorString(::dlerror()); - } - } - return NULL; -} - FileSpec Host::GetModuleFileSpecForHostAddress (const void *host_addr) { diff --git a/lldb/source/Host/windows/Host.cpp b/lldb/source/Host/windows/Host.cpp index 3f2870cb5fa..bc0f48b49c7 100644 --- a/lldb/source/Host/windows/Host.cpp +++ b/lldb/source/Host/windows/Host.cpp @@ -213,28 +213,6 @@ Host::GetModuleFileSpecForHostAddress (const void *host_addr) return module_filespec; } -void * -Host::DynamicLibraryOpen(const FileSpec &file_spec, uint32_t options, Error &error) -{ - error.SetErrorString("not implemented"); - return NULL; -} - -Error -Host::DynamicLibraryClose (void *opaque) -{ - Error error; - error.SetErrorString("not implemented"); - return error; -} - -void * -Host::DynamicLibraryGetSymbol(void *opaque, const char *symbol_name, Error &error) -{ - error.SetErrorString("not implemented"); - return NULL; -} - uint32_t Host::FindProcesses (const ProcessInstanceInfoMatch &match_info, ProcessInstanceInfoList &process_infos) { |

