LLVM  14.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 
14 using namespace llvm;
15 
16 Expected<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 }
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AllocatorList.h:23
intptr_t
llvm::sys::DynamicLibrary::getAddressOfSymbol
void * getAddressOfSymbol(const char *symbolName)
Searches through the library for the symbol symbolName.
Definition: DynamicLibrary.cpp:171
LLVM_PLUGIN_API_VERSION
#define LLVM_PLUGIN_API_VERSION
\macro LLVM_PLUGIN_API_VERSION Identifies the API version understood by this plugin.
Definition: PassPlugin.h:33
P
This currently compiles esp xmm0 movsd esp eax eax esp ret We should use not the dag combiner This is because dagcombine2 needs to be able to see through the X86ISD::Wrapper which DAGCombine can t really do The code for turning x load into a single vector load is target independent and should be moved to the dag combiner The code for turning x load into a vector load can only handle a direct load from a global or a direct load from the stack It should be generalized to handle any load from P
Definition: README-SSE.txt:411
llvm::PassPlugin
A loaded pass plugin.
Definition: PassPlugin.h:60
llvm::Expected
Tagged union holding either a T or a Error.
Definition: APFloat.h:42
llvm::PassPlugin::Load
static Expected< PassPlugin > Load(const std::string &Filename)
Attempts to load a pass plugin from a given file.
Definition: PassPlugin.cpp:16
llvm::sys::DynamicLibrary::getPermanentLibrary
static DynamicLibrary getPermanentLibrary(const char *filename, std::string *errMsg=nullptr)
This function permanently loads the dynamic library at the given path.
Definition: DynamicLibrary.cpp:146
llvm::sys::DynamicLibrary::isValid
bool isValid() const
Returns true if the object refers to a valid library.
Definition: DynamicLibrary.h:49
llvmGetPassPluginInfo
::llvm::PassPluginLibraryInfo LLVM_ATTRIBUTE_WEAK llvmGetPassPluginInfo()
The public entry point for a pass plugin.
PassPlugin.h
llvm::Twine
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:83
llvm::inconvertibleErrorCode
std::error_code inconvertibleErrorCode()
The value returned by this function can be returned from convertToErrorCode for Error values where no...
Definition: Error.cpp:77
llvm::Error
Lightweight error class with error context and mandatory checking.
Definition: Error.h:157
raw_ostream.h