llvm-6502/include/llvm/System/DynamicLibrary.h
Reid Spencer b0b0ea07bb Add in some methods for use by the JIT. LoadLibraryPermanently brings the
library into the address space permanently. SearchForAddressOfSymbol looks
in all previously permanently loaded libraries and any currently open
libraries for a symbol, instead of just one library like GetAddressOfSymbol


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18354 91177308-0d34-0410-b5e6-96231b3b80d8
2004-11-29 13:27:56 +00:00

114 lines
4.5 KiB
C++

//===-- llvm/System/DynamicLibrary.h - Portable Dynamic Library -*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file was developed by Reid Spencer and 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 "llvm/System/Path.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.
/// @since 1.4
/// @brief Portable dynamic library abstraction.
class DynamicLibrary {
/// @name Constructors
/// @{
public:
/// Construct a DynamicLibrary that represents the currently executing
/// program. The program must have been linked with -export-dynamic or
/// -dlopen self for this to work. Any symbols retrieved with the
/// GetAddressOfSymbol function will refer to the program not to any
/// library.
/// @throws std::string indicating why the program couldn't be opened.
/// @brief Open program as dynamic library.
DynamicLibrary();
/// This is the constructor for DynamicLibrary instances. It will open
/// the dynamic library specified by the \filename Path.
/// @throws std::string indicating why the library couldn't be opened.
/// @brief Open a dynamic library.
DynamicLibrary(const char* filename);
/// After destruction, the symbols of the library will no longer be
/// available to the program. It is important to make sure the lifespan
/// of a DynamicLibrary exceeds the lifetime of the pointers returned
/// by the GetAddressOfSymbol otherwise the program may walk off into
/// uncharted territory.
/// @see GetAddressOfSymbol.
/// @brief Closes the DynamicLibrary
~DynamicLibrary();
/// @}
/// @name Functions
/// @{
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.
/// @throws std::string on error.
/// @brief Open a dynamic library permanently.
static void LoadLibraryPermanently(const char* filename);
/// 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
static void* SearchForAddressOfSymbol(const char* symbolName);
/// @brief Convenience function for C++ophiles.
static void* SearchForAddressOfSymbol(const std::string& symbolName) {
return SearchForAddressOfSymbol(symbolName.c_str());
}
/// @}
/// @name Accessors
/// @{
public:
/// Looks up a \p symbolName in the DynamicLibrary and returns its address
/// if it exists. If the symbol does not exist, returns (void*)0.
/// @returns the address of the symbol or 0.
/// @brief Get the address of a symbol in the DynamicLibrary.
void* GetAddressOfSymbol(const char* symbolName);
/// @brief Convenience function for C++ophiles.
void* GetAddressOfSymbol(const std::string& symbolName) {
return GetAddressOfSymbol(symbolName.c_str());
}
/// @}
/// @name Implementation
/// @{
protected:
void* handle; // Opaque handle for information about the library
DynamicLibrary(const DynamicLibrary&); ///< Do not implement
DynamicLibrary& operator=(const DynamicLibrary&); ///< Do not implement
/// @}
};
} // End sys namespace
} // End llvm namespace
#endif // LLVM_SYSTEM_DYNAMIC_LIBRARY_H