diff options
| author | Philip Pfaffe <philip.pfaffe@gmail.com> | 2018-04-05 11:29:37 +0000 |
|---|---|---|
| committer | Philip Pfaffe <philip.pfaffe@gmail.com> | 2018-04-05 11:29:37 +0000 |
| commit | e8f3ae9da07c47d5ee4d351a8085385e3df9390d (patch) | |
| tree | aeda50afb6b8bb71c6ff0ec65caed91f45fc167a /llvm/lib/Passes | |
| parent | e88b76a98995c08806b1fdc7a6b43b96fa709c60 (diff) | |
| download | bcm5719-llvm-e8f3ae9da07c47d5ee4d351a8085385e3df9390d.tar.gz bcm5719-llvm-e8f3ae9da07c47d5ee4d351a8085385e3df9390d.zip | |
[Plugins] Add a slim plugin API to work together with the new PM
Summary:
Add a new plugin API. This closes the gap between pass registration and out-of-tree passes for the new PassManager.
Unlike with the existing API, interaction with a plugin is always
initiated from the tools perspective. I.e., when a plugin is loaded, it
resolves and calls a well-known symbol `llvmGetPassPluginInfo` to obtain
details about the plugin. The fundamental motivation is to get rid of as
many global constructors as possible. The API exposed by the plugin
info is kept intentionally minimal.
Reviewers: chandlerc
Reviewed By: chandlerc
Subscribers: bollu, grosser, lksbhm, mgorny, llvm-commits
Differential Revision: https://reviews.llvm.org/D35258
llvm-svn: 329273
Diffstat (limited to 'llvm/lib/Passes')
| -rw-r--r-- | llvm/lib/Passes/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | llvm/lib/Passes/PassPlugin.cpp | 50 |
2 files changed, 51 insertions, 0 deletions
diff --git a/llvm/lib/Passes/CMakeLists.txt b/llvm/lib/Passes/CMakeLists.txt index 8fcadcf2c95..cc39dfb798e 100644 --- a/llvm/lib/Passes/CMakeLists.txt +++ b/llvm/lib/Passes/CMakeLists.txt @@ -1,5 +1,6 @@ add_llvm_library(LLVMPasses PassBuilder.cpp + PassPlugin.cpp ADDITIONAL_HEADER_DIRS ${LLVM_MAIN_INCLUDE_DIR}/llvm/Passes diff --git a/llvm/lib/Passes/PassPlugin.cpp b/llvm/lib/Passes/PassPlugin.cpp new file mode 100644 index 00000000000..8f689ee505c --- /dev/null +++ b/llvm/lib/Passes/PassPlugin.cpp @@ -0,0 +1,50 @@ +//===- lib/Passes/PassPluginLoader.cpp - Load Plugins for New PM Passes ---===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Passes/PassPlugin.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; + +Expected<PassPlugin> PassPlugin::Load(const std::string &Filename) { + std::string Error; + auto Library = + sys::DynamicLibrary::getPermanentLibrary(Filename.c_str(), &Error); + if (!Library.isValid()) + return make_error<StringError>(Twine("Could not load library '") + + Filename + "': " + Error, + inconvertibleErrorCode()); + + PassPlugin P{Filename, Library}; + auto *getDetailsFn = + Library.SearchForAddressOfSymbol("llvmGetPassPluginInfo"); + + if (!getDetailsFn) + // If the symbol isn't found, this is probably a legacy plugin, which is an + // error + return make_error<StringError>(Twine("Plugin entry point not found in '") + + Filename + "'. Is this a legacy plugin?", + inconvertibleErrorCode()); + + P.Info = reinterpret_cast<decltype(llvmGetPassPluginInfo) *>(getDetailsFn)(); + + if (P.Info.APIVersion != LLVM_PLUGIN_API_VERSION) + return make_error<StringError>( + Twine("Wrong API version on plugin '") + Filename + "'. Got version " + + Twine(P.Info.APIVersion) + ", supported version is " + + Twine(LLVM_PLUGIN_API_VERSION) + ".", + inconvertibleErrorCode()); + + if (!P.Info.RegisterPassBuilderCallbacks) + return make_error<StringError>(Twine("Empty entry callback in plugin '") + + Filename + "'.'", + inconvertibleErrorCode()); + + return P; +} |

