diff --git a/passes/cmds/plugin.cc b/passes/cmds/plugin.cc index 3a1ae2850..85aae239d 100644 --- a/passes/cmds/plugin.cc +++ b/passes/cmds/plugin.cc @@ -21,12 +21,12 @@ #ifdef YOSYS_ENABLE_PLUGINS # include +# include +# include #endif #ifdef WITH_PYTHON -# include # include -# include #endif YOSYS_NAMESPACE_BEGIN @@ -41,20 +41,18 @@ std::map loaded_plugin_aliases; void load_plugin(std::string filename, std::vector aliases) { std::string orig_filename = filename; + rewrite_filename(filename); + boost::filesystem::path full_path(filename); - if (filename.find('/') == std::string::npos) - filename = "./" + filename; #ifdef WITH_PYTHON - if (!loaded_plugins.count(filename) && !loaded_python_plugins.count(filename)) { + if (!loaded_plugins.count(orig_filename) && !loaded_python_plugins.count(orig_filename)) { #else - if (!loaded_plugins.count(filename)) { + if (!loaded_plugins.count(orig_filename)) { #endif #ifdef WITH_PYTHON - boost::filesystem::path full_path(filename); - if(strcmp(full_path.extension().c_str(), ".py") == 0) { std::string path(full_path.parent_path().c_str()); @@ -75,10 +73,23 @@ void load_plugin(std::string filename, std::vector aliases) #endif void *hdl = dlopen(filename.c_str(), RTLD_LAZY|RTLD_LOCAL); - if (hdl == NULL && orig_filename.find('/') == std::string::npos) - hdl = dlopen((proc_share_dirname() + "plugins/" + orig_filename + ".so").c_str(), RTLD_LAZY|RTLD_LOCAL); + + // We were unable to open the file, try to do so from the plugin directory + if (hdl == NULL && filename.find('/') == std::string::npos) { + hdl = dlopen([filename]() { + std::string new_path = proc_share_dirname() + "plugins/" + filename; + + // Check if we need to append .so + if (new_path.find(".so") == std::string::npos) + new_path.append(".so"); + + return new_path; + }().c_str(), RTLD_LAZY|RTLD_LOCAL); + } + if (hdl == NULL) log_cmd_error("Can't load module `%s': %s\n", filename.c_str(), dlerror()); + loaded_plugins[orig_filename] = hdl; Pass::init_register(); @@ -182,4 +193,3 @@ struct PluginPass : public Pass { } PluginPass; YOSYS_NAMESPACE_END -