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