10b57cec5SDimitry Andric //===-- PluginLoader.cpp - Implement -load command line option ------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file implements the -load <plugin> command line option handler. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #define DONT_GET_PLUGIN_LOADER_OPTION 140b57cec5SDimitry Andric #include "llvm/Support/PluginLoader.h" 150b57cec5SDimitry Andric #include "llvm/Support/DynamicLibrary.h" 160b57cec5SDimitry Andric #include "llvm/Support/Mutex.h" 170b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 180b57cec5SDimitry Andric #include <vector> 190b57cec5SDimitry Andric using namespace llvm; 200b57cec5SDimitry Andric 21*bdd1243dSDimitry Andric namespace { 22*bdd1243dSDimitry Andric 23*bdd1243dSDimitry Andric struct Plugins { 24*bdd1243dSDimitry Andric sys::SmartMutex<true> Lock; 25*bdd1243dSDimitry Andric std::vector<std::string> List; 26*bdd1243dSDimitry Andric }; 27*bdd1243dSDimitry Andric getPlugins()28*bdd1243dSDimitry AndricPlugins &getPlugins() { 29*bdd1243dSDimitry Andric static Plugins P; 30*bdd1243dSDimitry Andric return P; 31*bdd1243dSDimitry Andric } 32*bdd1243dSDimitry Andric 33*bdd1243dSDimitry Andric } // anonymous namespace 340b57cec5SDimitry Andric operator =(const std::string & Filename)350b57cec5SDimitry Andricvoid PluginLoader::operator=(const std::string &Filename) { 36*bdd1243dSDimitry Andric auto &P = getPlugins(); 37*bdd1243dSDimitry Andric sys::SmartScopedLock<true> Lock(P.Lock); 380b57cec5SDimitry Andric std::string Error; 390b57cec5SDimitry Andric if (sys::DynamicLibrary::LoadLibraryPermanently(Filename.c_str(), &Error)) { 400b57cec5SDimitry Andric errs() << "Error opening '" << Filename << "': " << Error 410b57cec5SDimitry Andric << "\n -load request ignored.\n"; 420b57cec5SDimitry Andric } else { 43*bdd1243dSDimitry Andric P.List.push_back(Filename); 440b57cec5SDimitry Andric } 450b57cec5SDimitry Andric } 460b57cec5SDimitry Andric getNumPlugins()470b57cec5SDimitry Andricunsigned PluginLoader::getNumPlugins() { 48*bdd1243dSDimitry Andric auto &P = getPlugins(); 49*bdd1243dSDimitry Andric sys::SmartScopedLock<true> Lock(P.Lock); 50*bdd1243dSDimitry Andric return P.List.size(); 510b57cec5SDimitry Andric } 520b57cec5SDimitry Andric getPlugin(unsigned num)530b57cec5SDimitry Andricstd::string &PluginLoader::getPlugin(unsigned num) { 54*bdd1243dSDimitry Andric auto &P = getPlugins(); 55*bdd1243dSDimitry Andric sys::SmartScopedLock<true> Lock(P.Lock); 56*bdd1243dSDimitry Andric assert(num < P.List.size() && "Asking for an out of bounds plugin"); 57*bdd1243dSDimitry Andric return P.List[num]; 580b57cec5SDimitry Andric } 59