1*5e2afe5cSFabian Mora //===- lib/Tools/Plugins/DialectPlugin.cpp - Load Dialect Plugins ---------===// 2*5e2afe5cSFabian Mora // 3*5e2afe5cSFabian Mora // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*5e2afe5cSFabian Mora // See https://llvm.org/LICENSE.txt for license information. 5*5e2afe5cSFabian Mora // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*5e2afe5cSFabian Mora // 7*5e2afe5cSFabian Mora //===----------------------------------------------------------------------===// 8*5e2afe5cSFabian Mora 9*5e2afe5cSFabian Mora #include "mlir/Tools/Plugins/DialectPlugin.h" 10*5e2afe5cSFabian Mora #include "llvm/Support/raw_ostream.h" 11*5e2afe5cSFabian Mora 12*5e2afe5cSFabian Mora #include <cstdint> 13*5e2afe5cSFabian Mora 14*5e2afe5cSFabian Mora using namespace mlir; 15*5e2afe5cSFabian Mora load(const std::string & filename)16*5e2afe5cSFabian Morallvm::Expected<DialectPlugin> DialectPlugin::load(const std::string &filename) { 17*5e2afe5cSFabian Mora std::string error; 18*5e2afe5cSFabian Mora auto library = 19*5e2afe5cSFabian Mora llvm::sys::DynamicLibrary::getPermanentLibrary(filename.c_str(), &error); 20*5e2afe5cSFabian Mora if (!library.isValid()) 21*5e2afe5cSFabian Mora return llvm::make_error<llvm::StringError>( 22*5e2afe5cSFabian Mora Twine("Could not load library '") + filename + "': " + error, 23*5e2afe5cSFabian Mora llvm::inconvertibleErrorCode()); 24*5e2afe5cSFabian Mora 25*5e2afe5cSFabian Mora DialectPlugin plugin{filename, library}; 26*5e2afe5cSFabian Mora 27*5e2afe5cSFabian Mora // mlirGetDialectPluginInfo should be resolved to the definition from the 28*5e2afe5cSFabian Mora // plugin we are currently loading. 29*5e2afe5cSFabian Mora intptr_t getDetailsFn = 30*5e2afe5cSFabian Mora (intptr_t)library.getAddressOfSymbol("mlirGetDialectPluginInfo"); 31*5e2afe5cSFabian Mora 32*5e2afe5cSFabian Mora if (!getDetailsFn) 33*5e2afe5cSFabian Mora return llvm::make_error<llvm::StringError>( 34*5e2afe5cSFabian Mora Twine("Plugin entry point not found in '") + filename, 35*5e2afe5cSFabian Mora llvm::inconvertibleErrorCode()); 36*5e2afe5cSFabian Mora 37*5e2afe5cSFabian Mora plugin.info = 38*5e2afe5cSFabian Mora reinterpret_cast<decltype(mlirGetDialectPluginInfo) *>(getDetailsFn)(); 39*5e2afe5cSFabian Mora 40*5e2afe5cSFabian Mora if (plugin.info.apiVersion != MLIR_PLUGIN_API_VERSION) 41*5e2afe5cSFabian Mora return llvm::make_error<llvm::StringError>( 42*5e2afe5cSFabian Mora Twine("Wrong API version on plugin '") + filename + "'. Got version " + 43*5e2afe5cSFabian Mora Twine(plugin.info.apiVersion) + ", supported version is " + 44*5e2afe5cSFabian Mora Twine(MLIR_PLUGIN_API_VERSION) + ".", 45*5e2afe5cSFabian Mora llvm::inconvertibleErrorCode()); 46*5e2afe5cSFabian Mora 47*5e2afe5cSFabian Mora if (!plugin.info.registerDialectRegistryCallbacks) 48*5e2afe5cSFabian Mora return llvm::make_error<llvm::StringError>( 49*5e2afe5cSFabian Mora Twine("Empty entry callback in plugin '") + filename + "'.'", 50*5e2afe5cSFabian Mora llvm::inconvertibleErrorCode()); 51*5e2afe5cSFabian Mora 52*5e2afe5cSFabian Mora return plugin; 53*5e2afe5cSFabian Mora } 54