[PM/AA] Move the LibCall AA creation routine declaration to that
[oota-llvm.git] / lib / Support / PluginLoader.cpp
index c2e4e89813a85a63725a284387d158b16540758b..358137f08f5f86fbb1eecc9adf2ecfff905b1927 100644 (file)
@@ -1,30 +1,47 @@
 //===-- PluginLoader.cpp - Implement -load command line option ------------===//
 //
-// This file implements the -load <plugin> command line option processor.  When
-// linked into a program, this new command line option is available that allows
-// users to load shared objects into the running program.
+//                     The LLVM Compiler Infrastructure
 //
-// Note that there are no symbols exported by the .o file generated for this
-// .cpp file.  Because of this, a program must link against support.o instead of
-// support.a: otherwise this translation unit will not be included.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
+//
+// This file implements the -load <plugin> command line option handler.
+//
+//===----------------------------------------------------------------------===//
+
+#define DONT_GET_PLUGIN_LOADER_OPTION
+#include "llvm/Support/PluginLoader.h"
+#include "llvm/Support/DynamicLibrary.h"
+#include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/Mutex.h"
+#include "llvm/Support/raw_ostream.h"
+#include <vector>
+using namespace llvm;
 
-#include "Support/CommandLine.h"
-#include <dlfcn.h>
-#include <link.h>
+static ManagedStatic<std::vector<std::string> > Plugins;
+static ManagedStatic<sys::SmartMutex<true> > PluginsLock;
 
-namespace {
-  struct PluginLoader {
-    void operator=(const std::string &Filename) {
-      if (dlopen(Filename.c_str(), RTLD_NOW) == 0)
-        std::cerr << "Error opening '" << Filename << "': " << dlerror()
-                  << "\n  -load request ignored.\n";
-    }
-  };
+void PluginLoader::operator=(const std::string &Filename) {
+  sys::SmartScopedLock<true> Lock(*PluginsLock);
+  std::string Error;
+  if (sys::DynamicLibrary::LoadLibraryPermanently(Filename.c_str(), &Error)) {
+    errs() << "Error opening '" << Filename << "': " << Error
+           << "\n  -load request ignored.\n";
+  } else {
+    Plugins->push_back(Filename);
+  }
 }
 
-// This causes operator= above to be invoked for every -load option.
-static cl::opt<PluginLoader, false, cl::parser<string> >
-LoadOpt("load", cl::ZeroOrMore, cl::value_desc("plugin.so"),
-        cl::desc("Load the specified plugin"));
+unsigned PluginLoader::getNumPlugins() {
+  sys::SmartScopedLock<true> Lock(*PluginsLock);
+  return Plugins.isConstructed() ? Plugins->size() : 0;
+}
+
+std::string &PluginLoader::getPlugin(unsigned num) {
+  sys::SmartScopedLock<true> Lock(*PluginsLock);
+  assert(Plugins.isConstructed() && num < Plugins->size() &&
+         "Asking for an out of bounds plugin");
+  return (*Plugins)[num];
+}