mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-21 03:05:26 -04:00
Allow clients to specify search order of DynamicLibraries.
Summary: Different JITs and other clients of LLVM may have different needs in how symbol resolution should occur. Reviewers: v.g.vassilev, lhames, karies Reviewed By: v.g.vassilev Subscribers: pcanal, llvm-commits Differential Revision: https://reviews.llvm.org/D33529 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307849 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -14,6 +14,7 @@
|
||||
#include "llvm/Support/DynamicLibrary.h"
|
||||
#include "llvm-c/Support.h"
|
||||
#include "llvm/ADT/DenseSet.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/ADT/StringMap.h"
|
||||
#include "llvm/Config/config.h"
|
||||
#include "llvm/Support/ManagedStatic.h"
|
||||
@@ -73,19 +74,37 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
void *Lookup(const char *Symbol) {
|
||||
// Process handle gets first try.
|
||||
void *LibLookup(const char *Symbol, DynamicLibrary::SearchOrdering Order) {
|
||||
if (Order & SO_LoadOrder) {
|
||||
for (void *Handle : Handles) {
|
||||
if (void *Ptr = DLSym(Handle, Symbol))
|
||||
return Ptr;
|
||||
}
|
||||
} else {
|
||||
for (void *Handle : llvm::reverse(Handles)) {
|
||||
if (void *Ptr = DLSym(Handle, Symbol))
|
||||
return Ptr;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void *Lookup(const char *Symbol, DynamicLibrary::SearchOrdering Order) {
|
||||
assert(!((Order & SO_LoadedFirst) && (Order & SO_LoadedLast)) &&
|
||||
"Invalid Ordering");
|
||||
|
||||
if (!Process || (Order & SO_LoadedFirst)) {
|
||||
if (void *Ptr = LibLookup(Symbol, Order))
|
||||
return Ptr;
|
||||
}
|
||||
if (Process) {
|
||||
// Use OS facilities to search the current binary and all loaded libs.
|
||||
if (void *Ptr = DLSym(Process, Symbol))
|
||||
return Ptr;
|
||||
#ifndef NDEBUG
|
||||
for (void *Handle : Handles)
|
||||
assert(!DLSym(Handle, Symbol) && "Symbol exists in non process handle");
|
||||
#endif
|
||||
} else {
|
||||
// Iterate in reverse, so newer libraries/symbols override older.
|
||||
for (auto &&I = Handles.rbegin(), E = Handles.rend(); I != E; ++I) {
|
||||
if (void *Ptr = DLSym(*I, Symbol))
|
||||
|
||||
// Search any libs that might have been skipped because of RTLD_LOCAL.
|
||||
if (Order & SO_LoadedLast) {
|
||||
if (void *Ptr = LibLookup(Symbol, Order))
|
||||
return Ptr;
|
||||
}
|
||||
}
|
||||
@@ -113,6 +132,8 @@ static llvm::ManagedStatic<llvm::sys::SmartMutex<true>> SymbolsMutex;
|
||||
#endif
|
||||
|
||||
char DynamicLibrary::Invalid;
|
||||
DynamicLibrary::SearchOrdering DynamicLibrary::SearchOrder =
|
||||
DynamicLibrary::SO_Linker;
|
||||
|
||||
namespace llvm {
|
||||
void *SearchForAddressOfSpecialSymbol(const char *SymbolName) {
|
||||
@@ -170,7 +191,7 @@ void *DynamicLibrary::SearchForAddressOfSymbol(const char *SymbolName) {
|
||||
|
||||
// Now search the libraries.
|
||||
if (OpenedHandles.isConstructed()) {
|
||||
if (void *Ptr = OpenedHandles->Lookup(SymbolName))
|
||||
if (void *Ptr = OpenedHandles->Lookup(SymbolName, SearchOrder))
|
||||
return Ptr;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user