1*0b57cec5SDimitry Andric //===-- PluginLoader.cpp - Implement -load command line option ------------===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric // 9*0b57cec5SDimitry Andric // This file implements the -load <plugin> command line option handler. 10*0b57cec5SDimitry Andric // 11*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 12*0b57cec5SDimitry Andric 13*0b57cec5SDimitry Andric #define DONT_GET_PLUGIN_LOADER_OPTION 14*0b57cec5SDimitry Andric #include "llvm/Support/PluginLoader.h" 15*0b57cec5SDimitry Andric #include "llvm/Support/DynamicLibrary.h" 16*0b57cec5SDimitry Andric #include "llvm/Support/ManagedStatic.h" 17*0b57cec5SDimitry Andric #include "llvm/Support/Mutex.h" 18*0b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 19*0b57cec5SDimitry Andric #include <vector> 20*0b57cec5SDimitry Andric using namespace llvm; 21*0b57cec5SDimitry Andric 22*0b57cec5SDimitry Andric static ManagedStatic<std::vector<std::string> > Plugins; 23*0b57cec5SDimitry Andric static ManagedStatic<sys::SmartMutex<true> > PluginsLock; 24*0b57cec5SDimitry Andric operator =(const std::string & Filename)25*0b57cec5SDimitry Andricvoid PluginLoader::operator=(const std::string &Filename) { 26*0b57cec5SDimitry Andric sys::SmartScopedLock<true> Lock(*PluginsLock); 27*0b57cec5SDimitry Andric std::string Error; 28*0b57cec5SDimitry Andric if (sys::DynamicLibrary::LoadLibraryPermanently(Filename.c_str(), &Error)) { 29*0b57cec5SDimitry Andric errs() << "Error opening '" << Filename << "': " << Error 30*0b57cec5SDimitry Andric << "\n -load request ignored.\n"; 31*0b57cec5SDimitry Andric } else { 32*0b57cec5SDimitry Andric Plugins->push_back(Filename); 33*0b57cec5SDimitry Andric } 34*0b57cec5SDimitry Andric } 35*0b57cec5SDimitry Andric getNumPlugins()36*0b57cec5SDimitry Andricunsigned PluginLoader::getNumPlugins() { 37*0b57cec5SDimitry Andric sys::SmartScopedLock<true> Lock(*PluginsLock); 38*0b57cec5SDimitry Andric return Plugins.isConstructed() ? Plugins->size() : 0; 39*0b57cec5SDimitry Andric } 40*0b57cec5SDimitry Andric getPlugin(unsigned num)41*0b57cec5SDimitry Andricstd::string &PluginLoader::getPlugin(unsigned num) { 42*0b57cec5SDimitry Andric sys::SmartScopedLock<true> Lock(*PluginsLock); 43*0b57cec5SDimitry Andric assert(Plugins.isConstructed() && num < Plugins->size() && 44*0b57cec5SDimitry Andric "Asking for an out of bounds plugin"); 45*0b57cec5SDimitry Andric return (*Plugins)[num]; 46*0b57cec5SDimitry Andric } 47