diff options
| author | serge_sans_paille <sguelton@redhat.com> | 2019-06-08 17:37:47 +0200 |
|---|---|---|
| committer | serge-sans-paille <sguelton@redhat.com> | 2020-01-02 16:45:31 +0100 |
| commit | 24ab9b537e61b3fe5e6a1019492ff6530d82a3ee (patch) | |
| tree | a44734fd73e2789f7817cf49b5a30f638a1a4a63 /llvm/docs | |
| parent | 8d7ecc16291ff415da0d5bfccb6363590a1310ad (diff) | |
| download | bcm5719-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.rst | 45 |
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 ===================================== |

