summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/docs/ClangPlugins.rst5
-rw-r--r--clang/examples/PrintFunctionNames/PrintFunctionNames.cpp1
-rw-r--r--clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp9
3 files changed, 13 insertions, 2 deletions
diff --git a/clang/docs/ClangPlugins.rst b/clang/docs/ClangPlugins.rst
index 9a5bc142130..1aeff62e2fd 100644
--- a/clang/docs/ClangPlugins.rst
+++ b/clang/docs/ClangPlugins.rst
@@ -37,11 +37,14 @@ Registering a plugin
====================
A plugin is loaded from a dynamic library at runtime by the compiler. To
-register a plugin in a library, use ``FrontendPluginRegistry::Add<>``:
+register a plugin in a library, use ``FrontendPluginRegistry::Add<>``.
+On Windows, you also need to export your plugin registry using
+``LLVM_EXPORT_REGISTRY``. Here is an example:
.. code-block:: c++
static FrontendPluginRegistry::Add<MyPlugin> X("my-plugin-name", "my plugin description");
+ LLVM_EXPORT_REGISTRY(FrontendPluginRegistry)
Putting it all together
=======================
diff --git a/clang/examples/PrintFunctionNames/PrintFunctionNames.cpp b/clang/examples/PrintFunctionNames/PrintFunctionNames.cpp
index 9f8f6e3f050..e2834b9ad23 100644
--- a/clang/examples/PrintFunctionNames/PrintFunctionNames.cpp
+++ b/clang/examples/PrintFunctionNames/PrintFunctionNames.cpp
@@ -121,3 +121,4 @@ protected:
static FrontendPluginRegistry::Add<PrintFunctionNamesAction>
X("print-fns", "print function names");
+LLVM_EXPORT_REGISTRY(FrontendPluginRegistry)
diff --git a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
index 116590e5375..90642abb5d5 100644
--- a/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
+++ b/clang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
@@ -189,9 +189,16 @@ bool clang::ExecuteCompilerInvocation(CompilerInstance *Clang) {
e = Clang->getFrontendOpts().Plugins.size(); i != e; ++i) {
const std::string &Path = Clang->getFrontendOpts().Plugins[i];
std::string Error;
- if (llvm::sys::DynamicLibrary::LoadLibraryPermanently(Path.c_str(), &Error))
+ llvm::sys::DynamicLibrary DL(
+ llvm::sys::DynamicLibrary::getPermanentLibrary(Path.c_str(), &Error));
+ if (DL.isValid()) {
+ // On Windows, we need to import the plugin front-end action
+ // dynamically.
+ LLVM_IMPORT_REGISTRY(FrontendPluginRegistry, DL);
+ } else {
Clang->getDiagnostics().Report(diag::err_fe_unable_to_load_plugin)
<< Path << Error;
+ }
}
// Honor -mllvm.
OpenPOWER on IntegriCloud