mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-30 05:29:47 +00:00
This fixes PR4512 and eliminating static ctors is always good. Losing thread safety is unfortunate, but the code is just incredibly poorly designed. If someone is interested, the "right" solution is to split DynamicLibrary.cpp into two separate pieces: a stateless piece in libsystem, and a simple support file in libsupport that has the "state" (e.g. AddSymbol) in managed static objects. Doing this would both fix memory leaks we already have, as well as make the code thread safe again. it would also make sense to move all the unix specific code in System/DynamicLibrary.cpp into System/Unix/DynamicLibrary.inc. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74927 91177308-0d34-0410-b5e6-96231b3b80d8
87 lines
3.4 KiB
C++
87 lines
3.4 KiB
C++
//===-- llvm/System/DynamicLibrary.h - Portable Dynamic Library -*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file declares the sys::DynamicLibrary class.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_SYSTEM_DYNAMIC_LIBRARY_H
|
|
#define LLVM_SYSTEM_DYNAMIC_LIBRARY_H
|
|
|
|
#include <string>
|
|
|
|
namespace llvm {
|
|
namespace sys {
|
|
|
|
/// This class provides a portable interface to dynamic libraries which also
|
|
/// might be known as shared libraries, shared objects, dynamic shared
|
|
/// objects, or dynamic link libraries. Regardless of the terminology or the
|
|
/// operating system interface, this class provides a portable interface that
|
|
/// allows dynamic libraries to be loaded and and searched for externally
|
|
/// defined symbols. This is typically used to provide "plug-in" support.
|
|
/// It also allows for symbols to be defined which don't live in any library,
|
|
/// but rather the main program itself, useful on Windows where the main
|
|
/// executable cannot be searched.
|
|
class DynamicLibrary {
|
|
DynamicLibrary(); // DO NOT IMPLEMENT
|
|
public:
|
|
/// This function allows a library to be loaded without instantiating a
|
|
/// DynamicLibrary object. Consequently, it is marked as being permanent
|
|
/// and will only be unloaded when the program terminates. This returns
|
|
/// false on success or returns true and fills in *ErrMsg on failure.
|
|
/// @brief Open a dynamic library permanently.
|
|
///
|
|
/// NOTE: This function is not thread safe.
|
|
///
|
|
static bool LoadLibraryPermanently(const char *filename,
|
|
std::string *ErrMsg = 0);
|
|
|
|
/// This function will search through all previously loaded dynamic
|
|
/// libraries for the symbol \p symbolName. If it is found, the addressof
|
|
/// that symbol is returned. If not, null is returned. Note that this will
|
|
/// search permanently loaded libraries (LoadLibraryPermanently) as well
|
|
/// as ephemerally loaded libraries (constructors).
|
|
/// @throws std::string on error.
|
|
/// @brief Search through libraries for address of a symbol
|
|
///
|
|
/// NOTE: This function is not thread safe.
|
|
///
|
|
static void *SearchForAddressOfSymbol(const char *symbolName);
|
|
|
|
/// @brief Convenience function for C++ophiles.
|
|
///
|
|
/// NOTE: This function is not thread safe.
|
|
///
|
|
static void *SearchForAddressOfSymbol(const std::string &symbolName) {
|
|
return SearchForAddressOfSymbol(symbolName.c_str());
|
|
}
|
|
|
|
/// This functions permanently adds the symbol \p symbolName with the
|
|
/// value \p symbolValue. These symbols are searched before any
|
|
/// libraries.
|
|
/// @brief Add searchable symbol/value pair.
|
|
///
|
|
/// NOTE: This function is not thread safe.
|
|
///
|
|
static void AddSymbol(const char *symbolName, void *symbolValue);
|
|
|
|
/// @brief Convenience function for C++ophiles.
|
|
///
|
|
/// NOTE: This function is not thread safe.
|
|
///
|
|
static void AddSymbol(const std::string &symbolName, void *symbolValue) {
|
|
AddSymbol(symbolName.c_str(), symbolValue);
|
|
}
|
|
};
|
|
|
|
} // End sys namespace
|
|
} // End llvm namespace
|
|
|
|
#endif // LLVM_SYSTEM_DYNAMIC_LIBRARY_H
|