summaryrefslogtreecommitdiffstats
path: root/llvm/docs
diff options
context:
space:
mode:
authorserge_sans_paille <sguelton@redhat.com>2019-06-08 17:37:47 +0200
committerserge-sans-paille <sguelton@redhat.com>2020-01-02 16:45:31 +0100
commit24ab9b537e61b3fe5e6a1019492ff6530d82a3ee (patch)
treea44734fd73e2789f7817cf49b5a30f638a1a4a63 /llvm/docs
parent8d7ecc16291ff415da0d5bfccb6363590a1310ad (diff)
downloadbcm5719-llvm-24ab9b537e61b3fe5e6a1019492ff6530d82a3ee.tar.gz
bcm5719-llvm-24ab9b537e61b3fe5e6a1019492ff6530d82a3ee.zip
Generalize the pass registration mechanism used by Polly to any third-party tool
There's quite a lot of references to Polly in the LLVM CMake codebase. However the registration pattern used by Polly could be useful to other external projects: thanks to that mechanism it would be possible to develop LLVM extension without touching the LLVM code base. This patch has two effects: 1. Remove all code specific to Polly in the llvm/clang codebase, replaicing it with a generic mechanism 2. Provide a generic mechanism to register compiler extensions. A compiler extension is similar to a pass plugin, with the notable difference that the compiler extension can be configured to be built dynamically (like plugins) or statically (like regular passes). As a result, people willing to add extra passes to clang/opt can do it using a separate code repo, but still have their pass be linked in clang/opt as built-in passes. Differential Revision: https://reviews.llvm.org/D61446
Diffstat (limited to 'llvm/docs')
-rw-r--r--llvm/docs/WritingAnLLVMPass.rst45
1 files changed, 45 insertions, 0 deletions
diff --git a/llvm/docs/WritingAnLLVMPass.rst b/llvm/docs/WritingAnLLVMPass.rst
index fae14d8ca32..ecd1db1344d 100644
--- a/llvm/docs/WritingAnLLVMPass.rst
+++ b/llvm/docs/WritingAnLLVMPass.rst
@@ -1175,6 +1175,51 @@ implement ``releaseMemory`` to, well, release the memory allocated to maintain
this internal state. This method is called after the ``run*`` method for the
class, before the next call of ``run*`` in your pass.
+Building pass plugins
+=====================
+
+As an alternative to using ``PLUGIN_TOOL``, LLVM provides a mechanism to
+automatically register pass plugins within ``clang``, ``opt`` and ``bugpoint``.
+One first needs to create an independent project and add it to either ``tools/``
+or, using the MonoRepo layout, at the root of the repo alongside other projects.
+This project must contain the following minimal ``CMakeLists.txt``:
+
+.. code-block:: cmake
+
+ add_llvm_pass_plugin(Name source0.cpp)
+
+The pass must provide two entry points for the new pass manager, one for static
+registration and one for dynamically loaded plugins:
+
+- ``llvm::PassPluginLibraryInfo get##Name##PluginInfo();``
+- ``extern "C" ::llvm::PassPluginLibraryInfo llvmGetPassPluginInfo() LLVM_ATTRIBUTE_WEAK;``
+
+Pass plugins are compiled and link dynamically by default, but it's
+possible to set the following variables to change this behavior:
+
+- ``LLVM_${NAME}_LINK_INTO_TOOLS``, when set to ``ON``, turns the project into
+ a statically linked extension
+
+
+When building a tool that uses the new pass manager, one can use the following snippet to
+include statically linked pass plugins:
+
+.. code-block:: c++
+
+ // fetch the declaration
+ #define HANDLE_EXTENSION(Ext) llvm::PassPluginLibraryInfo get##Ext##PluginInfo();
+ #include "llvm/Support/Extension.def"
+
+ [...]
+
+ // use them, PB is an llvm::PassBuilder instance
+ #define HANDLE_EXTENSION(Ext) get##Ext##PluginInfo().RegisterPassBuilderCallbacks(PB);
+ #include "llvm/Support/Extension.def"
+
+
+
+
+
Registering dynamically loaded passes
=====================================
OpenPOWER on IntegriCloud