X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSystem%2FDynamicLibrary.h;h=f90126c7360bdcc096a68c9c5ae088cfbd83c558;hb=393830a33a02d2f7163fcd4b27b7e5d6a46d8bac;hp=29ee9a8ffedcb827846e6d383cf08ce35745440e;hpb=0de02a6ba9d9da6aac3c787ec4047068d8250aa9;p=oota-llvm.git diff --git a/include/llvm/System/DynamicLibrary.h b/include/llvm/System/DynamicLibrary.h index 29ee9a8ffed..f90126c7360 100644 --- a/include/llvm/System/DynamicLibrary.h +++ b/include/llvm/System/DynamicLibrary.h @@ -1,10 +1,10 @@ //===-- llvm/System/DynamicLibrary.h - Portable Dynamic Library -*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by Reid Spencer and is distributed under the +// 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. @@ -21,32 +21,80 @@ 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 + /// 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 + /// 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. /// @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. + /// the dynamic library specified by the filename Path. /// @throws std::string indicating why the library couldn't be opened. - /// @brief DynamicLibrary constructor + /// @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 + /// 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()); + } + + /// 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. + static void AddSymbol(const char* symbolName, void *symbolValue); + + /// @brief Convenience function for C++ophiles. + static void AddSymbol(const std::string& symbolName, void *symbolValue) { + AddSymbol(symbolName.c_str(), symbolValue); + } + /// @} /// @name Accessors /// @{ @@ -68,7 +116,6 @@ namespace sys { protected: void* handle; // Opaque handle for information about the library - DynamicLibrary(); ///< Do not implement DynamicLibrary(const DynamicLibrary&); ///< Do not implement DynamicLibrary& operator=(const DynamicLibrary&); ///< Do not implement /// @}