[llvm-dev] [RFC] Generalize out-of-tree pass support

Andrzej Warzynski via llvm-dev llvm-dev at lists.llvm.org
Sun Sep 22 05:12:05 PDT 2019


Hello Serge,

Thank you for doing this - that's a lot of great work that makes LLVM 
plugin registration very straightforward to use. The implementation and 
the interface make a lot of sense! I've noticed other people on the 
mailing list asking for similar functionality, so there's definitely 
need for this sort of infrastructure. I do hope that it lands in LLVM 
sooner rather than later.

I have a few questions/remarks:
1. As far as I can tell, this mechanism relies on the plugin being 
located somewhere within LLVM the tree so that everything happens within 
one CMake run. Otherwise the pass registration won't work - at least in 
the case of static linking. IMHO this is fine - AFAIK it's not something 
that could easily be worked around.

2. Does your patch make `PLUGIN_TOOL` obsolete (e.g. 
https://github.com/llvm-mirror/llvm/blob/master/lib/Transforms/Hello/CMakeLists.txt#L18)? 
AFAIK `PLUGIN_TOOL` is only needed to enable dynamically loaded plugins 
on Windows, but from what I can tell you achieved that without using it? 
(sadly I've not been able to test your patch on Windows)

3. At the coming LLVM Dev Meeting I'll be presenting a tutorial on 
writing LLVM passes for beginners and I'd like to advertise this patch. 
Is that OK with you? I think that this is really worthwhile sharing with 
the wider community.

Thanks again for working on this,
-Andrzej


On 20/09/2019 14:56, Serge Guelton via llvm-dev wrote:
> Hi folks,
> 
> I've been working for a few months on a proposal to make it easier to develop
> out-of-tree passes, and have them linked either statically or dynamically,
> within LLVM. This includes automatic integration within clang, opt and bugpoint.
> 
> The goal is to lower the bar for people who develop out-of tree passes: they can
> maintain their code base in a third-party repo, pick it at config time and build
> it statically or dynamically.
> 
> As a side-effect, this provides a generalization of the polly-specific code
> that spread at several locations of the code base (and removes most of the
> explicit mention of Polly itself, without removing the functionality, obviously).
> 
> Both legacy and new pass managers are supported.
> 
>  From the review's documentation:
> 
> 
>      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 sets to ``ON``, turns the project into
>        a statically linked extension
> 
> The review also contains an example of pass plugin, `llvm/examples/Bye/Bye.cpp`.
> 
> The associated review is available at https://reviews.llvm.org/D61446, Michael
> Kruse has already done a lot of review, I think it's time to gather more
> feedback, so if you're interested... jump in!
> 
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> 


More information about the llvm-dev mailing list