Index: llvm/CMakeLists.txt =================================================================== --- llvm/CMakeLists.txt +++ llvm/CMakeLists.txt @@ -669,6 +669,10 @@ endif() option(LLVM_ENABLE_PLUGINS "Enable plugin support" ${LLVM_ENABLE_PLUGINS_default}) +set(LLVM_AUTOLOAD_PLUGINS "" CACHE STRING + "List of plugin paths to attempt autoloading") +mark_as_advanced(LLVM_AUTOLOAD_PLUGINS) + include(HandleLLVMOptions) if(CMAKE_VERSION VERSION_LESS 3.12) Index: llvm/include/llvm/Config/config.h.cmake =================================================================== --- llvm/include/llvm/Config/config.h.cmake +++ llvm/include/llvm/Config/config.h.cmake @@ -344,4 +344,7 @@ /* Whether Timers signpost passes in Xcode Instruments */ #cmakedefine01 LLVM_SUPPORT_XCODE_SIGNPOSTS +/* Define to the list of plugins to autoload */ +#define LLVM_AUTOLOAD_PLUGINS "${LLVM_AUTOLOAD_PLUGINS}" + #endif Index: llvm/lib/Support/PluginLoader.cpp =================================================================== --- llvm/lib/Support/PluginLoader.cpp +++ llvm/lib/Support/PluginLoader.cpp @@ -12,6 +12,7 @@ #define DONT_GET_PLUGIN_LOADER_OPTION #include "llvm/Support/PluginLoader.h" +#include "llvm/Config/config.h" #include "llvm/Support/DynamicLibrary.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/Mutex.h" @@ -44,3 +45,22 @@ "Asking for an out of bounds plugin"); return (*Plugins)[num]; } + +struct PluginAutoLoader { + PluginAutoLoader() { + SmallVector PluginList; + StringRef(LLVM_AUTOLOAD_PLUGINS).split(PluginList, ';', -1, false); + + for (auto &Val : PluginList) { + sys::SmartScopedLock Lock(*PluginsLock); + std::string Filename = Val.str(); + std::string Error; + if (!sys::DynamicLibrary::LoadLibraryPermanently(Filename.c_str(), + &Error)) { + Plugins->push_back(Filename); + } + } + } +}; + +static PluginAutoLoader AutoPlugins;