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 : }
|