From: Serge Guelton Date: Thu, 4 Jul 2019 14:03:11 +0000 (+0000) Subject: Document legacy pass manager extension points X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2b94262f2a0ad5465116ae069cf83a838ff0174e;p=llvm Document legacy pass manager extension points Differential Revision: https://reviews.llvm.org/D64093 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@365142 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/docs/ReleaseNotes.rst b/docs/ReleaseNotes.rst index 60a840eccef..2bb58fc17ba 100644 --- a/docs/ReleaseNotes.rst +++ b/docs/ReleaseNotes.rst @@ -45,6 +45,10 @@ Non-comprehensive list of changes in this release the platform's libc) without specifying ``-ffreestanding`` may need to either pass ``-fno-builtin-bcmp``, or provide a ``bcmp`` function. +* Two new extension points, namely ``EP_FullLinkTimeOptimizationEarly`` and + ``EP_FullLinkTimeOptimizationLast`` are available for plugins to specialize + the legacy pass manager full LTO pipeline. + .. NOTE If you would like to document a larger change, then you can add a subsection about it right here. You can copy the following boilerplate diff --git a/docs/WritingAnLLVMPass.rst b/docs/WritingAnLLVMPass.rst index 7e2cabb9e8f..386f3d61d0e 100644 --- a/docs/WritingAnLLVMPass.rst +++ b/docs/WritingAnLLVMPass.rst @@ -178,6 +178,18 @@ without modifying it then the third argument is set to ``true``; if a pass is an analysis pass, for example dominator tree pass, then ``true`` is supplied as the fourth argument. +If we want to register the pass as a step of an existing pipeline, some extension +points are provided, e.g. ``PassManagerBuilder::EP_EarlyAsPossible`` to apply our +pass before any optimization, or ``PassManagerBuilder::EP_FullLinkTimeOptimizationLast`` +to apply it after Link Time Optimizations. + +.. code-block:: c++ + + static llvm::RegisterStandardPasses Y( + llvm::PassManagerBuilder::EP_EarlyAsPossible, + [](const llvm::PassManagerBuilder &Builder, + llvm::legacy::PassManagerBase &PM) { PM.add(new Hello()); }); + As a whole, the ``.cpp`` file looks like: .. code-block:: c++ @@ -185,9 +197,12 @@ As a whole, the ``.cpp`` file looks like: #include "llvm/Pass.h" #include "llvm/IR/Function.h" #include "llvm/Support/raw_ostream.h" - + + #include "llvm/IR/LegacyPassManager.h" + #include "llvm/Transforms/IPO/PassManagerBuilder.h" + using namespace llvm; - + namespace { struct Hello : public FunctionPass { static char ID; @@ -200,12 +215,17 @@ As a whole, the ``.cpp`` file looks like: } }; // end of struct Hello } // end of anonymous namespace - + char Hello::ID = 0; static RegisterPass X("hello", "Hello World Pass", false /* Only looks at CFG */, false /* Analysis Pass */); + static RegisterStandardPasses Y( + PassManagerBuilder::EP_EarlyAsPossible, + [](const PassManagerBuilder &Builder, + legacy::PassManagerBase &PM) { PM.add(new Hello()); }); + Now that it's all together, compile the file with a simple "``gmake``" command from the top level of your build directory and you should get a new file "``lib/LLVMHello.so``". Note that everything in this file is