From 85fc597f26c81a187c5514d47ee997bc2ea87b1c Mon Sep 17 00:00:00 2001 From: Serge Guelton Date: Thu, 4 Jul 2019 14:03:11 +0000 Subject: [PATCH] Document legacy pass manager extension points Differential Revision: https://reviews.llvm.org/D64093 llvm-svn: 365142 --- llvm/docs/ReleaseNotes.rst | 4 ++++ llvm/docs/WritingAnLLVMPass.rst | 26 +++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/llvm/docs/ReleaseNotes.rst b/llvm/docs/ReleaseNotes.rst index 60a840e..2bb58fc 100644 --- a/llvm/docs/ReleaseNotes.rst +++ b/llvm/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/llvm/docs/WritingAnLLVMPass.rst b/llvm/docs/WritingAnLLVMPass.rst index 7e2cabb..386f3d6 100644 --- a/llvm/docs/WritingAnLLVMPass.rst +++ b/llvm/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 -- 2.7.4