PluginLoader.cpp revision 198090
1191783Srmacklem//===-- PluginLoader.cpp - Implement -load command line option ------------===// 2191783Srmacklem// 3191783Srmacklem// The LLVM Compiler Infrastructure 4191783Srmacklem// 5191783Srmacklem// This file is distributed under the University of Illinois Open Source 6191783Srmacklem// License. See LICENSE.TXT for details. 7191783Srmacklem// 8191783Srmacklem//===----------------------------------------------------------------------===// 9191783Srmacklem// 10191783Srmacklem// This file implements the -load <plugin> command line option handler. 11191783Srmacklem// 12191783Srmacklem//===----------------------------------------------------------------------===// 13191783Srmacklem 14191783Srmacklem#define DONT_GET_PLUGIN_LOADER_OPTION 15191783Srmacklem#include "llvm/Support/ManagedStatic.h" 16191783Srmacklem#include "llvm/Support/PluginLoader.h" 17191783Srmacklem#include "llvm/Support/raw_ostream.h" 18191783Srmacklem#include "llvm/System/DynamicLibrary.h" 19191783Srmacklem#include "llvm/System/Mutex.h" 20191783Srmacklem#include <vector> 21191783Srmacklemusing namespace llvm; 22191783Srmacklem 23191783Srmacklemstatic ManagedStatic<std::vector<std::string> > Plugins; 24191783Srmacklemstatic ManagedStatic<sys::SmartMutex<true> > PluginsLock; 25191783Srmacklem 26191783Srmacklemvoid PluginLoader::operator=(const std::string &Filename) { 27191783Srmacklem sys::SmartScopedLock<true> Lock(*PluginsLock); 28191783Srmacklem std::string Error; 29191783Srmacklem if (sys::DynamicLibrary::LoadLibraryPermanently(Filename.c_str(), &Error)) { 30191783Srmacklem errs() << "Error opening '" << Filename << "': " << Error 31191783Srmacklem << "\n -load request ignored.\n"; 32191783Srmacklem } else { 33191783Srmacklem Plugins->push_back(Filename); 34191783Srmacklem } 35191783Srmacklem} 36191783Srmacklem 37191783Srmacklemunsigned PluginLoader::getNumPlugins() { 38191783Srmacklem sys::SmartScopedLock<true> Lock(*PluginsLock); 39191783Srmacklem return Plugins.isConstructed() ? Plugins->size() : 0; 40191783Srmacklem} 41191783Srmacklem 42191783Srmacklemstd::string &PluginLoader::getPlugin(unsigned num) { 43191783Srmacklem sys::SmartScopedLock<true> Lock(*PluginsLock); 44191783Srmacklem assert(Plugins.isConstructed() && num < Plugins->size() && 45191783Srmacklem "Asking for an out of bounds plugin"); 46191783Srmacklem return (*Plugins)[num]; 47191783Srmacklem} 48191783Srmacklem