xref: /llvm-project/mlir/lib/Tools/Plugins/PassPlugin.cpp (revision eb3409dc77752253b18224ed11ec738db4fe91a3)
15e2afe5cSFabian Mora //===- lib/Tools/Plugins/PassPlugin.cpp - Load Plugins for PR Passes ------===//
25e2afe5cSFabian Mora //
35e2afe5cSFabian Mora // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45e2afe5cSFabian Mora // See https://llvm.org/LICENSE.txt for license information.
55e2afe5cSFabian Mora // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65e2afe5cSFabian Mora //
75e2afe5cSFabian Mora //===----------------------------------------------------------------------===//
85e2afe5cSFabian Mora 
95e2afe5cSFabian Mora #include "mlir/Tools/Plugins/PassPlugin.h"
105e2afe5cSFabian Mora #include "llvm/Support/raw_ostream.h"
115e2afe5cSFabian Mora 
125e2afe5cSFabian Mora #include <cstdint>
135e2afe5cSFabian Mora 
145e2afe5cSFabian Mora using namespace mlir;
155e2afe5cSFabian Mora 
load(const std::string & filename)165e2afe5cSFabian Mora llvm::Expected<PassPlugin> PassPlugin::load(const std::string &filename) {
17*eb3409dcSMehdi Amini   std::string error;
185e2afe5cSFabian Mora   auto library =
19*eb3409dcSMehdi Amini       llvm::sys::DynamicLibrary::getPermanentLibrary(filename.c_str(), &error);
205e2afe5cSFabian Mora   if (!library.isValid())
215e2afe5cSFabian Mora     return llvm::make_error<llvm::StringError>(
22*eb3409dcSMehdi Amini         Twine("Could not load library '") + filename + "': " + error,
235e2afe5cSFabian Mora         llvm::inconvertibleErrorCode());
245e2afe5cSFabian Mora 
255e2afe5cSFabian Mora   PassPlugin plugin{filename, library};
265e2afe5cSFabian Mora 
275e2afe5cSFabian Mora   // mlirGetPassPluginInfo should be resolved to the definition from the plugin
285e2afe5cSFabian Mora   // we are currently loading.
295e2afe5cSFabian Mora   intptr_t getDetailsFn =
305e2afe5cSFabian Mora       (intptr_t)library.getAddressOfSymbol("mlirGetPassPluginInfo");
315e2afe5cSFabian Mora 
325e2afe5cSFabian Mora   if (!getDetailsFn)
335e2afe5cSFabian Mora     return llvm::make_error<llvm::StringError>(
345e2afe5cSFabian Mora         Twine("Plugin entry point not found in '") + filename,
355e2afe5cSFabian Mora         llvm::inconvertibleErrorCode());
365e2afe5cSFabian Mora 
375e2afe5cSFabian Mora   plugin.info =
385e2afe5cSFabian Mora       reinterpret_cast<decltype(mlirGetPassPluginInfo) *>(getDetailsFn)();
395e2afe5cSFabian Mora 
405e2afe5cSFabian Mora   if (plugin.info.apiVersion != MLIR_PLUGIN_API_VERSION)
415e2afe5cSFabian Mora     return llvm::make_error<llvm::StringError>(
425e2afe5cSFabian Mora         Twine("Wrong API version on plugin '") + filename + "'. Got version " +
435e2afe5cSFabian Mora             Twine(plugin.info.apiVersion) + ", supported version is " +
445e2afe5cSFabian Mora             Twine(MLIR_PLUGIN_API_VERSION) + ".",
455e2afe5cSFabian Mora         llvm::inconvertibleErrorCode());
465e2afe5cSFabian Mora 
475e2afe5cSFabian Mora   if (!plugin.info.registerPassRegistryCallbacks)
485e2afe5cSFabian Mora     return llvm::make_error<llvm::StringError>(
495e2afe5cSFabian Mora         Twine("Empty entry callback in plugin '") + filename + "'.'",
505e2afe5cSFabian Mora         llvm::inconvertibleErrorCode());
515e2afe5cSFabian Mora 
525e2afe5cSFabian Mora   return plugin;
535e2afe5cSFabian Mora }
54