PluginLoader.cpp revision 256281
1234285Sdim//===-- PluginLoader.cpp - Implement -load command line option ------------===//
2234285Sdim//
3234285Sdim//                     The LLVM Compiler Infrastructure
4234285Sdim//
5234285Sdim// This file is distributed under the University of Illinois Open Source
6234285Sdim// License. See LICENSE.TXT for details.
7234285Sdim//
8234285Sdim//===----------------------------------------------------------------------===//
9234285Sdim//
10234285Sdim// This file implements the -load <plugin> command line option handler.
11234285Sdim//
12234285Sdim//===----------------------------------------------------------------------===//
13234285Sdim
14234285Sdim#define DONT_GET_PLUGIN_LOADER_OPTION
15234285Sdim#include "llvm/Support/PluginLoader.h"
16234285Sdim#include "llvm/Support/DynamicLibrary.h"
17234285Sdim#include "llvm/Support/ManagedStatic.h"
18263508Sdim#include "llvm/Support/Mutex.h"
19234285Sdim#include "llvm/Support/raw_ostream.h"
20234285Sdim#include <vector>
21234285Sdimusing namespace llvm;
22243830Sdim
23234285Sdimstatic ManagedStatic<std::vector<std::string> > Plugins;
24243830Sdimstatic ManagedStatic<sys::SmartMutex<true> > PluginsLock;
25243830Sdim
26243830Sdimvoid PluginLoader::operator=(const std::string &Filename) {
27243830Sdim  sys::SmartScopedLock<true> Lock(*PluginsLock);
28243830Sdim  std::string Error;
29243830Sdim  if (sys::DynamicLibrary::LoadLibraryPermanently(Filename.c_str(), &Error)) {
30243830Sdim    errs() << "Error opening '" << Filename << "': " << Error
31243830Sdim           << "\n  -load request ignored.\n";
32243830Sdim  } else {
33243830Sdim    Plugins->push_back(Filename);
34234285Sdim  }
35251662Sdim}
36251662Sdim
37251662Sdimunsigned PluginLoader::getNumPlugins() {
38251662Sdim  sys::SmartScopedLock<true> Lock(*PluginsLock);
39263508Sdim  return Plugins.isConstructed() ? Plugins->size() : 0;
40263508Sdim}
41251662Sdim
42243830Sdimstd::string &PluginLoader::getPlugin(unsigned num) {
43243830Sdim  sys::SmartScopedLock<true> Lock(*PluginsLock);
44234285Sdim  assert(Plugins.isConstructed() && num < Plugins->size() &&
45234285Sdim         "Asking for an out of bounds plugin");
46263508Sdim  return (*Plugins)[num];
47263508Sdim}
48234285Sdim