xref: /freebsd-src/contrib/llvm-project/llvm/lib/Support/PluginLoader.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
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 Andric Plugins &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 Andric void 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 Andric unsigned 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 Andric std::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