LCOV - code coverage report
Current view: top level - lib/Passes - PassPlugin.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 8 22 36.4 %
Date: 2018-10-20 13:21:21 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- lib/Passes/PassPluginLoader.cpp - Load Plugins for New PM Passes ---===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : 
      10             : #include "llvm/Passes/PassPlugin.h"
      11             : #include "llvm/Support/raw_ostream.h"
      12             : 
      13             : #include <cstdint>
      14             : 
      15             : using namespace llvm;
      16             : 
      17           1 : Expected<PassPlugin> PassPlugin::Load(const std::string &Filename) {
      18             :   std::string Error;
      19             :   auto Library =
      20           1 :       sys::DynamicLibrary::getPermanentLibrary(Filename.c_str(), &Error);
      21           1 :   if (!Library.isValid())
      22           0 :     return make_error<StringError>(Twine("Could not load library '") +
      23           0 :                                        Filename + "': " + Error,
      24           0 :                                    inconvertibleErrorCode());
      25             : 
      26             :   PassPlugin P{Filename, Library};
      27             :   intptr_t getDetailsFn =
      28           1 :       (intptr_t)Library.SearchForAddressOfSymbol("llvmGetPassPluginInfo");
      29             : 
      30           1 :   if (!getDetailsFn)
      31             :     // If the symbol isn't found, this is probably a legacy plugin, which is an
      32             :     // error
      33           0 :     return make_error<StringError>(Twine("Plugin entry point not found in '") +
      34           0 :                                        Filename + "'. Is this a legacy plugin?",
      35           0 :                                    inconvertibleErrorCode());
      36             : 
      37           1 :   P.Info = reinterpret_cast<decltype(llvmGetPassPluginInfo) *>(getDetailsFn)();
      38             : 
      39           1 :   if (P.Info.APIVersion != LLVM_PLUGIN_API_VERSION)
      40           0 :     return make_error<StringError>(
      41           0 :         Twine("Wrong API version on plugin '") + Filename + "'. Got version " +
      42           0 :             Twine(P.Info.APIVersion) + ", supported version is " +
      43           0 :             Twine(LLVM_PLUGIN_API_VERSION) + ".",
      44           0 :         inconvertibleErrorCode());
      45             : 
      46           1 :   if (!P.Info.RegisterPassBuilderCallbacks)
      47           0 :     return make_error<StringError>(Twine("Empty entry callback in plugin '") +
      48           0 :                                        Filename + "'.'",
      49           0 :                                    inconvertibleErrorCode());
      50             : 
      51             :   return P;
      52             : }

Generated by: LCOV version 1.13