For PR804:
[oota-llvm.git] / include / llvm / System / DynamicLibrary.h
index 29ee9a8ffedcb827846e6d383cf08ce35745440e..f90126c7360bdcc096a68c9c5ae088cfbd83c558 100644 (file)
@@ -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
     /// @}