LLVM 20.0.0git
PassPlugin.cpp
Go to the documentation of this file.
1//===- lib/Passes/PassPluginLoader.cpp - Load Plugins for New PM Passes ---===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
11
12#include <cstdint>
13
14using namespace llvm;
15
16Expected<PassPlugin> PassPlugin::Load(const std::string &Filename) {
17 std::string Error;
18 auto Library =
20 if (!Library.isValid())
21 return make_error<StringError>(Twine("Could not load library '") +
22 Filename + "': " + Error,
24
25 PassPlugin P{Filename, Library};
26
27 // llvmGetPassPluginInfo should be resolved to the definition from the plugin
28 // we are currently loading.
29 intptr_t getDetailsFn =
30 (intptr_t)Library.getAddressOfSymbol("llvmGetPassPluginInfo");
31
32 if (!getDetailsFn)
33 // If the symbol isn't found, this is probably a legacy plugin, which is an
34 // error
35 return make_error<StringError>(Twine("Plugin entry point not found in '") +
36 Filename + "'. Is this a legacy plugin?",
38
39 P.Info = reinterpret_cast<decltype(llvmGetPassPluginInfo) *>(getDetailsFn)();
40
41 if (P.Info.APIVersion != LLVM_PLUGIN_API_VERSION)
42 return make_error<StringError>(
43 Twine("Wrong API version on plugin '") + Filename + "'. Got version " +
44 Twine(P.Info.APIVersion) + ", supported version is " +
47
48 if (!P.Info.RegisterPassBuilderCallbacks)
49 return make_error<StringError>(Twine("Empty entry callback in plugin '") +
50 Filename + "'.'",
52
53 return P;
54}
#define P(N)
::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK llvmGetPassPluginInfo()
The public entry point for a pass plugin.
#define LLVM_PLUGIN_API_VERSION
\macro LLVM_PLUGIN_API_VERSION Identifies the API version understood by this plugin.
Definition: PassPlugin.h:33
Lightweight error class with error context and mandatory checking.
Definition: Error.h:160
Tagged union holding either a T or a Error.
Definition: Error.h:481
A loaded pass plugin.
Definition: PassPlugin.h:60
static Expected< PassPlugin > Load(const std::string &Filename)
Attempts to load a pass plugin from a given file.
Definition: PassPlugin.cpp:16
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
static DynamicLibrary getPermanentLibrary(const char *filename, std::string *errMsg=nullptr)
This function permanently loads the dynamic library at the given path using the library load operatio...
void * getAddressOfSymbol(const char *symbolName)
Searches through the library for the symbol symbolName.
bool isValid() const
Returns true if the object refers to a valid library.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Definition: Error.cpp:98