1f22ef01cSRoman Divacky //===-- PluginLoader.cpp - Implement -load command line option ------------===// 2f22ef01cSRoman Divacky // 3f22ef01cSRoman Divacky // The LLVM Compiler Infrastructure 4f22ef01cSRoman Divacky // 5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source 6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details. 7f22ef01cSRoman Divacky // 8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 9f22ef01cSRoman Divacky // 10f22ef01cSRoman Divacky // This file implements the -load <plugin> command line option handler. 11f22ef01cSRoman Divacky // 12f22ef01cSRoman Divacky //===----------------------------------------------------------------------===// 13f22ef01cSRoman Divacky 14f22ef01cSRoman Divacky #define DONT_GET_PLUGIN_LOADER_OPTION 15f22ef01cSRoman Divacky #include "llvm/Support/PluginLoader.h" 162754fe60SDimitry Andric #include "llvm/Support/DynamicLibrary.h" 17*139f7f9bSDimitry Andric #include "llvm/Support/ManagedStatic.h" 182754fe60SDimitry Andric #include "llvm/Support/Mutex.h" 19*139f7f9bSDimitry Andric #include "llvm/Support/raw_ostream.h" 20f22ef01cSRoman Divacky #include <vector> 21f22ef01cSRoman Divacky using namespace llvm; 22f22ef01cSRoman Divacky 23f22ef01cSRoman Divacky static ManagedStatic<std::vector<std::string> > Plugins; 24f22ef01cSRoman Divacky static ManagedStatic<sys::SmartMutex<true> > PluginsLock; 25f22ef01cSRoman Divacky operator =(const std::string & Filename)26f22ef01cSRoman Divackyvoid PluginLoader::operator=(const std::string &Filename) { 27f22ef01cSRoman Divacky sys::SmartScopedLock<true> Lock(*PluginsLock); 28f22ef01cSRoman Divacky std::string Error; 29f22ef01cSRoman Divacky if (sys::DynamicLibrary::LoadLibraryPermanently(Filename.c_str(), &Error)) { 30f22ef01cSRoman Divacky errs() << "Error opening '" << Filename << "': " << Error 31f22ef01cSRoman Divacky << "\n -load request ignored.\n"; 32f22ef01cSRoman Divacky } else { 33f22ef01cSRoman Divacky Plugins->push_back(Filename); 34f22ef01cSRoman Divacky } 35f22ef01cSRoman Divacky } 36f22ef01cSRoman Divacky getNumPlugins()37f22ef01cSRoman Divackyunsigned PluginLoader::getNumPlugins() { 38f22ef01cSRoman Divacky sys::SmartScopedLock<true> Lock(*PluginsLock); 39f22ef01cSRoman Divacky return Plugins.isConstructed() ? Plugins->size() : 0; 40f22ef01cSRoman Divacky } 41f22ef01cSRoman Divacky getPlugin(unsigned num)42f22ef01cSRoman Divackystd::string &PluginLoader::getPlugin(unsigned num) { 43f22ef01cSRoman Divacky sys::SmartScopedLock<true> Lock(*PluginsLock); 44f22ef01cSRoman Divacky assert(Plugins.isConstructed() && num < Plugins->size() && 45f22ef01cSRoman Divacky "Asking for an out of bounds plugin"); 46f22ef01cSRoman Divacky return (*Plugins)[num]; 47f22ef01cSRoman Divacky } 48