1====================
2Writing an LLVM Pass
3====================
4
5.. program:: opt
6
7.. contents::
8    :local:
9
10Introduction --- What is a pass?
11================================
12
13The LLVM Pass Framework is an important part of the LLVM system, because LLVM
14passes are where most of the interesting parts of the compiler exist.  Passes
15perform the transformations and optimizations that make up the compiler, they
16build the analysis results that are used by these transformations, and they
17are, above all, a structuring technique for compiler code.
18
19All LLVM passes are subclasses of the `Pass
20<https://llvm.org/doxygen/classllvm_1_1Pass.html>`_ class, which implement
21functionality by overriding virtual methods inherited from ``Pass``.  Depending
22on how your pass works, you should inherit from the :ref:`ModulePass
23<writing-an-llvm-pass-ModulePass>` , :ref:`CallGraphSCCPass
24<writing-an-llvm-pass-CallGraphSCCPass>`, :ref:`FunctionPass
25<writing-an-llvm-pass-FunctionPass>` , or :ref:`LoopPass
26<writing-an-llvm-pass-LoopPass>`, or :ref:`RegionPass
27<writing-an-llvm-pass-RegionPass>` classes, which gives the system more
28information about what your pass does, and how it can be combined with other
29passes.  One of the main features of the LLVM Pass Framework is that it
30schedules passes to run in an efficient way based on the constraints that your
31pass meets (which are indicated by which class they derive from).
32
33We start by showing you how to construct a pass, everything from setting up the
34code, to compiling, loading, and executing it.  After the basics are down, more
35advanced features are discussed.
36
37.. warning::
38  This document deals with the legacy pass manager. LLVM now uses the new
39  pass manager by default, which has its own way of defining passes. For more
40  details, see :doc:`WritingAnLLVMNewPMPass`. To use the legacy pass manager
41  with ``opt``, pass the ``-enable-new-pm=0`` flag to all ``opt``
42  invocations.
43
44Quick Start --- Writing hello world
45===================================
46
47Here we describe how to write the "hello world" of passes.  The "Hello" pass is
48designed to simply print out the name of non-external functions that exist in
49the program being compiled.  It does not modify the program at all, it just
50inspects it.  The source code and files for this pass are available in the LLVM
51source tree in the ``lib/Transforms/Hello`` directory.
52
53.. _writing-an-llvm-pass-makefile:
54
55Setting up the build environment
56--------------------------------
57
58First, configure and build LLVM.  Next, you need to create a new directory
59somewhere in the LLVM source base.  For this example, we'll assume that you
60made ``lib/Transforms/Hello``.  Finally, you must set up a build script
61that will compile the source code for the new pass.  To do this,
62copy the following into ``CMakeLists.txt``:
63
64.. code-block:: cmake
65
66  add_llvm_library( LLVMHello MODULE
67    Hello.cpp
68
69    PLUGIN_TOOL
70    opt
71    )
72
73and the following line into ``lib/Transforms/CMakeLists.txt``:
74
75.. code-block:: cmake
76
77  add_subdirectory(Hello)
78
79(Note that there is already a directory named ``Hello`` with a sample "Hello"
80pass; you may play with it -- in which case you don't need to modify any
81``CMakeLists.txt`` files -- or, if you want to create everything from scratch,
82use another name.)
83
84This build script specifies that ``Hello.cpp`` file in the current directory
85is to be compiled and linked into a shared object ``$(LEVEL)/lib/LLVMHello.so`` that
86can be dynamically loaded by the :program:`opt` tool via its :option:`-load`
87option. If your operating system uses a suffix other than ``.so`` (such as
88Windows or macOS), the appropriate extension will be used.
89
90Now that we have the build scripts set up, we just need to write the code for
91the pass itself.
92
93.. _writing-an-llvm-pass-basiccode:
94
95Basic code required
96-------------------
97
98Now that we have a way to compile our new pass, we just have to write it.
99Start out with:
100
101.. code-block:: c++
102
103  #include "llvm/Pass.h"
104  #include "llvm/IR/Function.h"
105  #include "llvm/Support/raw_ostream.h"
106
107Which are needed because we are writing a `Pass
108<https://llvm.org/doxygen/classllvm_1_1Pass.html>`_, we are operating on
109`Function <https://llvm.org/doxygen/classllvm_1_1Function.html>`_\ s, and we will
110be doing some printing.
111
112Next we have:
113
114.. code-block:: c++
115
116  using namespace llvm;
117
118... which is required because the functions from the include files live in the
119llvm namespace.
120
121Next we have:
122
123.. code-block:: c++
124
125  namespace {
126
127... which starts out an anonymous namespace.  Anonymous namespaces are to C++
128what the "``static``" keyword is to C (at global scope).  It makes the things
129declared inside of the anonymous namespace visible only to the current file.
130If you're not familiar with them, consult a decent C++ book for more
131information.
132
133Next, we declare our pass itself:
134
135.. code-block:: c++
136
137  struct Hello : public FunctionPass {
138
139This declares a "``Hello``" class that is a subclass of :ref:`FunctionPass
140<writing-an-llvm-pass-FunctionPass>`.  The different builtin pass subclasses
141are described in detail :ref:`later <writing-an-llvm-pass-pass-classes>`, but
142for now, know that ``FunctionPass`` operates on a function at a time.
143
144.. code-block:: c++
145
146    static char ID;
147    Hello() : FunctionPass(ID) {}
148
149This declares pass identifier used by LLVM to identify pass.  This allows LLVM
150to avoid using expensive C++ runtime information.
151
152.. code-block:: c++
153
154    bool runOnFunction(Function &F) override {
155      errs() << "Hello: ";
156      errs().write_escaped(F.getName()) << '\n';
157      return false;
158    }
159  }; // end of struct Hello
160  }  // end of anonymous namespace
161
162We declare a :ref:`runOnFunction <writing-an-llvm-pass-runOnFunction>` method,
163which overrides an abstract virtual method inherited from :ref:`FunctionPass
164<writing-an-llvm-pass-FunctionPass>`.  This is where we are supposed to do our
165thing, so we just print out our message with the name of each function.
166
167.. code-block:: c++
168
169  char Hello::ID = 0;
170
171We initialize pass ID here.  LLVM uses ID's address to identify a pass, so
172initialization value is not important.
173
174.. code-block:: c++
175
176  static RegisterPass<Hello> X("hello", "Hello World Pass",
177                               false /* Only looks at CFG */,
178                               false /* Analysis Pass */);
179
180Lastly, we :ref:`register our class <writing-an-llvm-pass-registration>`
181``Hello``, giving it a command line argument "``hello``", and a name "Hello
182World Pass".  The last two arguments describe its behavior: if a pass walks CFG
183without modifying it then the third argument is set to ``true``; if a pass is
184an analysis pass, for example dominator tree pass, then ``true`` is supplied as
185the fourth argument.
186
187If we want to register the pass as a step of an existing pipeline, some extension
188points are provided, e.g. ``PassManagerBuilder::EP_EarlyAsPossible`` to apply our
189pass before any optimization, or ``PassManagerBuilder::EP_FullLinkTimeOptimizationLast``
190to apply it after Link Time Optimizations.
191
192.. code-block:: c++
193
194    static llvm::RegisterStandardPasses Y(
195        llvm::PassManagerBuilder::EP_EarlyAsPossible,
196        [](const llvm::PassManagerBuilder &Builder,
197           llvm::legacy::PassManagerBase &PM) { PM.add(new Hello()); });
198
199As a whole, the ``.cpp`` file looks like:
200
201.. code-block:: c++
202
203  #include "llvm/Pass.h"
204  #include "llvm/IR/Function.h"
205  #include "llvm/Support/raw_ostream.h"
206
207  #include "llvm/IR/LegacyPassManager.h"
208  #include "llvm/Transforms/IPO/PassManagerBuilder.h"
209
210  using namespace llvm;
211
212  namespace {
213  struct Hello : public FunctionPass {
214    static char ID;
215    Hello() : FunctionPass(ID) {}
216
217    bool runOnFunction(Function &F) override {
218      errs() << "Hello: ";
219      errs().write_escaped(F.getName()) << '\n';
220      return false;
221    }
222  }; // end of struct Hello
223  }  // end of anonymous namespace
224
225  char Hello::ID = 0;
226  static RegisterPass<Hello> X("hello", "Hello World Pass",
227                               false /* Only looks at CFG */,
228                               false /* Analysis Pass */);
229
230  static RegisterStandardPasses Y(
231      PassManagerBuilder::EP_EarlyAsPossible,
232      [](const PassManagerBuilder &Builder,
233         legacy::PassManagerBase &PM) { PM.add(new Hello()); });
234
235Now that it's all together, compile the file with a simple "``gmake``" command
236from the top level of your build directory and you should get a new file
237"``lib/LLVMHello.so``".  Note that everything in this file is
238contained in an anonymous namespace --- this reflects the fact that passes
239are self contained units that do not need external interfaces (although they
240can have them) to be useful.
241
242Running a pass with ``opt``
243---------------------------
244
245Now that you have a brand new shiny shared object file, we can use the
246:program:`opt` command to run an LLVM program through your pass.  Because you
247registered your pass with ``RegisterPass``, you will be able to use the
248:program:`opt` tool to access it, once loaded.
249
250To test it, follow the example at the end of the :doc:`GettingStarted` to
251compile "Hello World" to LLVM.  We can now run the bitcode file (hello.bc) for
252the program through our transformation like this (or course, any bitcode file
253will work):
254
255.. code-block:: console
256
257  $ opt -load lib/LLVMHello.so -hello < hello.bc > /dev/null
258  Hello: __main
259  Hello: puts
260  Hello: main
261
262The :option:`-load` option specifies that :program:`opt` should load your pass
263as a shared object, which makes "``-hello``" a valid command line argument
264(which is one reason you need to :ref:`register your pass
265<writing-an-llvm-pass-registration>`).  Because the Hello pass does not modify
266the program in any interesting way, we just throw away the result of
267:program:`opt` (sending it to ``/dev/null``).
268
269To see what happened to the other string you registered, try running
270:program:`opt` with the :option:`-help` option:
271
272.. code-block:: console
273
274  $ opt -load lib/LLVMHello.so -help
275  OVERVIEW: llvm .bc -> .bc modular optimizer and analysis printer
276
277  USAGE: opt [subcommand] [options] <input bitcode file>
278
279  OPTIONS:
280    Optimizations available:
281  ...
282      -guard-widening           - Widen guards
283      -gvn                      - Global Value Numbering
284      -gvn-hoist                - Early GVN Hoisting of Expressions
285      -hello                    - Hello World Pass
286      -indvars                  - Induction Variable Simplification
287      -inferattrs               - Infer set function attributes
288  ...
289
290The pass name gets added as the information string for your pass, giving some
291documentation to users of :program:`opt`.  Now that you have a working pass,
292you would go ahead and make it do the cool transformations you want.  Once you
293get it all working and tested, it may become useful to find out how fast your
294pass is.  The :ref:`PassManager <writing-an-llvm-pass-passmanager>` provides a
295nice command line option (:option:`-time-passes`) that allows you to get
296information about the execution time of your pass along with the other passes
297you queue up.  For example:
298
299.. code-block:: console
300
301  $ opt -load lib/LLVMHello.so -hello -time-passes < hello.bc > /dev/null
302  Hello: __main
303  Hello: puts
304  Hello: main
305  ===-------------------------------------------------------------------------===
306                        ... Pass execution timing report ...
307  ===-------------------------------------------------------------------------===
308    Total Execution Time: 0.0007 seconds (0.0005 wall clock)
309
310     ---User Time---   --User+System--   ---Wall Time---  --- Name ---
311     0.0004 ( 55.3%)   0.0004 ( 55.3%)   0.0004 ( 75.7%)  Bitcode Writer
312     0.0003 ( 44.7%)   0.0003 ( 44.7%)   0.0001 ( 13.6%)  Hello World Pass
313     0.0000 (  0.0%)   0.0000 (  0.0%)   0.0001 ( 10.7%)  Module Verifier
314     0.0007 (100.0%)   0.0007 (100.0%)   0.0005 (100.0%)  Total
315
316As you can see, our implementation above is pretty fast.  The additional
317passes listed are automatically inserted by the :program:`opt` tool to verify
318that the LLVM emitted by your pass is still valid and well formed LLVM, which
319hasn't been broken somehow.
320
321Now that you have seen the basics of the mechanics behind passes, we can talk
322about some more details of how they work and how to use them.
323
324.. _writing-an-llvm-pass-pass-classes:
325
326Pass classes and requirements
327=============================
328
329One of the first things that you should do when designing a new pass is to
330decide what class you should subclass for your pass.  The :ref:`Hello World
331<writing-an-llvm-pass-basiccode>` example uses the :ref:`FunctionPass
332<writing-an-llvm-pass-FunctionPass>` class for its implementation, but we did
333not discuss why or when this should occur.  Here we talk about the classes
334available, from the most general to the most specific.
335
336When choosing a superclass for your ``Pass``, you should choose the **most
337specific** class possible, while still being able to meet the requirements
338listed.  This gives the LLVM Pass Infrastructure information necessary to
339optimize how passes are run, so that the resultant compiler isn't unnecessarily
340slow.
341
342The ``ImmutablePass`` class
343---------------------------
344
345The most plain and boring type of pass is the "`ImmutablePass
346<https://llvm.org/doxygen/classllvm_1_1ImmutablePass.html>`_" class.  This pass
347type is used for passes that do not have to be run, do not change state, and
348never need to be updated.  This is not a normal type of transformation or
349analysis, but can provide information about the current compiler configuration.
350
351Although this pass class is very infrequently used, it is important for
352providing information about the current target machine being compiled for, and
353other static information that can affect the various transformations.
354
355``ImmutablePass``\ es never invalidate other transformations, are never
356invalidated, and are never "run".
357
358.. _writing-an-llvm-pass-ModulePass:
359
360The ``ModulePass`` class
361------------------------
362
363The `ModulePass <https://llvm.org/doxygen/classllvm_1_1ModulePass.html>`_ class
364is the most general of all superclasses that you can use.  Deriving from
365``ModulePass`` indicates that your pass uses the entire program as a unit,
366referring to function bodies in no predictable order, or adding and removing
367functions.  Because nothing is known about the behavior of ``ModulePass``
368subclasses, no optimization can be done for their execution.
369
370A module pass can use function level passes (e.g. dominators) using the
371``getAnalysis`` interface ``getAnalysis<DominatorTree>(llvm::Function *)`` to
372provide the function to retrieve analysis result for, if the function pass does
373not require any module or immutable passes.  Note that this can only be done
374for functions for which the analysis ran, e.g. in the case of dominators you
375should only ask for the ``DominatorTree`` for function definitions, not
376declarations.
377
378To write a correct ``ModulePass`` subclass, derive from ``ModulePass`` and
379overload the ``runOnModule`` method with the following signature:
380
381The ``runOnModule`` method
382^^^^^^^^^^^^^^^^^^^^^^^^^^
383
384.. code-block:: c++
385
386  virtual bool runOnModule(Module &M) = 0;
387
388The ``runOnModule`` method performs the interesting work of the pass.  It
389should return ``true`` if the module was modified by the transformation and
390``false`` otherwise.
391
392.. _writing-an-llvm-pass-CallGraphSCCPass:
393
394The ``CallGraphSCCPass`` class
395------------------------------
396
397The `CallGraphSCCPass
398<https://llvm.org/doxygen/classllvm_1_1CallGraphSCCPass.html>`_ is used by
399passes that need to traverse the program bottom-up on the call graph (callees
400before callers).  Deriving from ``CallGraphSCCPass`` provides some mechanics
401for building and traversing the ``CallGraph``, but also allows the system to
402optimize execution of ``CallGraphSCCPass``\ es.  If your pass meets the
403requirements outlined below, and doesn't meet the requirements of a
404:ref:`FunctionPass <writing-an-llvm-pass-FunctionPass>`, you should derive from
405``CallGraphSCCPass``.
406
407``TODO``: explain briefly what SCC, Tarjan's algo, and B-U mean.
408
409To be explicit, CallGraphSCCPass subclasses are:
410
411#. ... *not allowed* to inspect or modify any ``Function``\ s other than those
412   in the current SCC and the direct callers and direct callees of the SCC.
413#. ... *required* to preserve the current ``CallGraph`` object, updating it to
414   reflect any changes made to the program.
415#. ... *not allowed* to add or remove SCC's from the current Module, though
416   they may change the contents of an SCC.
417#. ... *allowed* to add or remove global variables from the current Module.
418#. ... *allowed* to maintain state across invocations of :ref:`runOnSCC
419   <writing-an-llvm-pass-runOnSCC>` (including global data).
420
421Implementing a ``CallGraphSCCPass`` is slightly tricky in some cases because it
422has to handle SCCs with more than one node in it.  All of the virtual methods
423described below should return ``true`` if they modified the program, or
424``false`` if they didn't.
425
426The ``doInitialization(CallGraph &)`` method
427^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
428
429.. code-block:: c++
430
431  virtual bool doInitialization(CallGraph &CG);
432
433The ``doInitialization`` method is allowed to do most of the things that
434``CallGraphSCCPass``\ es are not allowed to do.  They can add and remove
435functions, get pointers to functions, etc.  The ``doInitialization`` method is
436designed to do simple initialization type of stuff that does not depend on the
437SCCs being processed.  The ``doInitialization`` method call is not scheduled to
438overlap with any other pass executions (thus it should be very fast).
439
440.. _writing-an-llvm-pass-runOnSCC:
441
442The ``runOnSCC`` method
443^^^^^^^^^^^^^^^^^^^^^^^
444
445.. code-block:: c++
446
447  virtual bool runOnSCC(CallGraphSCC &SCC) = 0;
448
449The ``runOnSCC`` method performs the interesting work of the pass, and should
450return ``true`` if the module was modified by the transformation, ``false``
451otherwise.
452
453The ``doFinalization(CallGraph &)`` method
454^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
455
456.. code-block:: c++
457
458  virtual bool doFinalization(CallGraph &CG);
459
460The ``doFinalization`` method is an infrequently used method that is called
461when the pass framework has finished calling :ref:`runOnSCC
462<writing-an-llvm-pass-runOnSCC>` for every SCC in the program being compiled.
463
464.. _writing-an-llvm-pass-FunctionPass:
465
466The ``FunctionPass`` class
467--------------------------
468
469In contrast to ``ModulePass`` subclasses, `FunctionPass
470<https://llvm.org/doxygen/classllvm_1_1Pass.html>`_ subclasses do have a
471predictable, local behavior that can be expected by the system.  All
472``FunctionPass`` execute on each function in the program independent of all of
473the other functions in the program.  ``FunctionPass``\ es do not require that
474they are executed in a particular order, and ``FunctionPass``\ es do not modify
475external functions.
476
477To be explicit, ``FunctionPass`` subclasses are not allowed to:
478
479#. Inspect or modify a ``Function`` other than the one currently being processed.
480#. Add or remove ``Function``\ s from the current ``Module``.
481#. Add or remove global variables from the current ``Module``.
482#. Maintain state across invocations of :ref:`runOnFunction
483   <writing-an-llvm-pass-runOnFunction>` (including global data).
484
485Implementing a ``FunctionPass`` is usually straightforward (See the :ref:`Hello
486World <writing-an-llvm-pass-basiccode>` pass for example).
487``FunctionPass``\ es may overload three virtual methods to do their work.  All
488of these methods should return ``true`` if they modified the program, or
489``false`` if they didn't.
490
491.. _writing-an-llvm-pass-doInitialization-mod:
492
493The ``doInitialization(Module &)`` method
494^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
495
496.. code-block:: c++
497
498  virtual bool doInitialization(Module &M);
499
500The ``doInitialization`` method is allowed to do most of the things that
501``FunctionPass``\ es are not allowed to do.  They can add and remove functions,
502get pointers to functions, etc.  The ``doInitialization`` method is designed to
503do simple initialization type of stuff that does not depend on the functions
504being processed.  The ``doInitialization`` method call is not scheduled to
505overlap with any other pass executions (thus it should be very fast).
506
507A good example of how this method should be used is the `LowerAllocations
508<https://llvm.org/doxygen/LowerAllocations_8cpp-source.html>`_ pass.  This pass
509converts ``malloc`` and ``free`` instructions into platform dependent
510``malloc()`` and ``free()`` function calls.  It uses the ``doInitialization``
511method to get a reference to the ``malloc`` and ``free`` functions that it
512needs, adding prototypes to the module if necessary.
513
514.. _writing-an-llvm-pass-runOnFunction:
515
516The ``runOnFunction`` method
517^^^^^^^^^^^^^^^^^^^^^^^^^^^^
518
519.. code-block:: c++
520
521  virtual bool runOnFunction(Function &F) = 0;
522
523The ``runOnFunction`` method must be implemented by your subclass to do the
524transformation or analysis work of your pass.  As usual, a ``true`` value
525should be returned if the function is modified.
526
527.. _writing-an-llvm-pass-doFinalization-mod:
528
529The ``doFinalization(Module &)`` method
530^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
531
532.. code-block:: c++
533
534  virtual bool doFinalization(Module &M);
535
536The ``doFinalization`` method is an infrequently used method that is called
537when the pass framework has finished calling :ref:`runOnFunction
538<writing-an-llvm-pass-runOnFunction>` for every function in the program being
539compiled.
540
541.. _writing-an-llvm-pass-LoopPass:
542
543The ``LoopPass`` class
544----------------------
545
546All ``LoopPass`` execute on each :ref:`loop <loop-terminology>` in the function
547independent of all of the other loops in the function.  ``LoopPass`` processes
548loops in loop nest order such that outer most loop is processed last.
549
550``LoopPass`` subclasses are allowed to update loop nest using ``LPPassManager``
551interface.  Implementing a loop pass is usually straightforward.
552``LoopPass``\ es may overload three virtual methods to do their work.  All
553these methods should return ``true`` if they modified the program, or ``false``
554if they didn't.
555
556A ``LoopPass`` subclass which is intended to run as part of the main loop pass
557pipeline needs to preserve all of the same *function* analyses that the other
558loop passes in its pipeline require. To make that easier,
559a ``getLoopAnalysisUsage`` function is provided by ``LoopUtils.h``. It can be
560called within the subclass's ``getAnalysisUsage`` override to get consistent
561and correct behavior. Analogously, ``INITIALIZE_PASS_DEPENDENCY(LoopPass)``
562will initialize this set of function analyses.
563
564The ``doInitialization(Loop *, LPPassManager &)`` method
565^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
566
567.. code-block:: c++
568
569  virtual bool doInitialization(Loop *, LPPassManager &LPM);
570
571The ``doInitialization`` method is designed to do simple initialization type of
572stuff that does not depend on the functions being processed.  The
573``doInitialization`` method call is not scheduled to overlap with any other
574pass executions (thus it should be very fast).  ``LPPassManager`` interface
575should be used to access ``Function`` or ``Module`` level analysis information.
576
577.. _writing-an-llvm-pass-runOnLoop:
578
579The ``runOnLoop`` method
580^^^^^^^^^^^^^^^^^^^^^^^^
581
582.. code-block:: c++
583
584  virtual bool runOnLoop(Loop *, LPPassManager &LPM) = 0;
585
586The ``runOnLoop`` method must be implemented by your subclass to do the
587transformation or analysis work of your pass.  As usual, a ``true`` value
588should be returned if the function is modified.  ``LPPassManager`` interface
589should be used to update loop nest.
590
591The ``doFinalization()`` method
592^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
593
594.. code-block:: c++
595
596  virtual bool doFinalization();
597
598The ``doFinalization`` method is an infrequently used method that is called
599when the pass framework has finished calling :ref:`runOnLoop
600<writing-an-llvm-pass-runOnLoop>` for every loop in the program being compiled.
601
602.. _writing-an-llvm-pass-RegionPass:
603
604The ``RegionPass`` class
605------------------------
606
607``RegionPass`` is similar to :ref:`LoopPass <writing-an-llvm-pass-LoopPass>`,
608but executes on each single entry single exit region in the function.
609``RegionPass`` processes regions in nested order such that the outer most
610region is processed last.
611
612``RegionPass`` subclasses are allowed to update the region tree by using the
613``RGPassManager`` interface.  You may overload three virtual methods of
614``RegionPass`` to implement your own region pass.  All these methods should
615return ``true`` if they modified the program, or ``false`` if they did not.
616
617The ``doInitialization(Region *, RGPassManager &)`` method
618^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
619
620.. code-block:: c++
621
622  virtual bool doInitialization(Region *, RGPassManager &RGM);
623
624The ``doInitialization`` method is designed to do simple initialization type of
625stuff that does not depend on the functions being processed.  The
626``doInitialization`` method call is not scheduled to overlap with any other
627pass executions (thus it should be very fast).  ``RPPassManager`` interface
628should be used to access ``Function`` or ``Module`` level analysis information.
629
630.. _writing-an-llvm-pass-runOnRegion:
631
632The ``runOnRegion`` method
633^^^^^^^^^^^^^^^^^^^^^^^^^^
634
635.. code-block:: c++
636
637  virtual bool runOnRegion(Region *, RGPassManager &RGM) = 0;
638
639The ``runOnRegion`` method must be implemented by your subclass to do the
640transformation or analysis work of your pass.  As usual, a true value should be
641returned if the region is modified.  ``RGPassManager`` interface should be used to
642update region tree.
643
644The ``doFinalization()`` method
645^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
646
647.. code-block:: c++
648
649  virtual bool doFinalization();
650
651The ``doFinalization`` method is an infrequently used method that is called
652when the pass framework has finished calling :ref:`runOnRegion
653<writing-an-llvm-pass-runOnRegion>` for every region in the program being
654compiled.
655
656
657The ``MachineFunctionPass`` class
658---------------------------------
659
660A ``MachineFunctionPass`` is a part of the LLVM code generator that executes on
661the machine-dependent representation of each LLVM function in the program.
662
663Code generator passes are registered and initialized specially by
664``TargetMachine::addPassesToEmitFile`` and similar routines, so they cannot
665generally be run from the :program:`opt` or :program:`bugpoint` commands.
666
667A ``MachineFunctionPass`` is also a ``FunctionPass``, so all the restrictions
668that apply to a ``FunctionPass`` also apply to it.  ``MachineFunctionPass``\ es
669also have additional restrictions.  In particular, ``MachineFunctionPass``\ es
670are not allowed to do any of the following:
671
672#. Modify or create any LLVM IR ``Instruction``\ s, ``BasicBlock``\ s,
673   ``Argument``\ s, ``Function``\ s, ``GlobalVariable``\ s,
674   ``GlobalAlias``\ es, or ``Module``\ s.
675#. Modify a ``MachineFunction`` other than the one currently being processed.
676#. Maintain state across invocations of :ref:`runOnMachineFunction
677   <writing-an-llvm-pass-runOnMachineFunction>` (including global data).
678
679.. _writing-an-llvm-pass-runOnMachineFunction:
680
681The ``runOnMachineFunction(MachineFunction &MF)`` method
682^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
683
684.. code-block:: c++
685
686  virtual bool runOnMachineFunction(MachineFunction &MF) = 0;
687
688``runOnMachineFunction`` can be considered the main entry point of a
689``MachineFunctionPass``; that is, you should override this method to do the
690work of your ``MachineFunctionPass``.
691
692The ``runOnMachineFunction`` method is called on every ``MachineFunction`` in a
693``Module``, so that the ``MachineFunctionPass`` may perform optimizations on
694the machine-dependent representation of the function.  If you want to get at
695the LLVM ``Function`` for the ``MachineFunction`` you're working on, use
696``MachineFunction``'s ``getFunction()`` accessor method --- but remember, you
697may not modify the LLVM ``Function`` or its contents from a
698``MachineFunctionPass``.
699
700.. _writing-an-llvm-pass-registration:
701
702Pass registration
703-----------------
704
705In the :ref:`Hello World <writing-an-llvm-pass-basiccode>` example pass we
706illustrated how pass registration works, and discussed some of the reasons that
707it is used and what it does.  Here we discuss how and why passes are
708registered.
709
710As we saw above, passes are registered with the ``RegisterPass`` template.  The
711template parameter is the name of the pass that is to be used on the command
712line to specify that the pass should be added to a program (for example, with
713:program:`opt` or :program:`bugpoint`).  The first argument is the name of the
714pass, which is to be used for the :option:`-help` output of programs, as well
715as for debug output generated by the `--debug-pass` option.
716
717If you want your pass to be easily dumpable, you should implement the virtual
718print method:
719
720The ``print`` method
721^^^^^^^^^^^^^^^^^^^^
722
723.. code-block:: c++
724
725  virtual void print(llvm::raw_ostream &O, const Module *M) const;
726
727The ``print`` method must be implemented by "analyses" in order to print a
728human readable version of the analysis results.  This is useful for debugging
729an analysis itself, as well as for other people to figure out how an analysis
730works.  Use the opt ``-analyze`` argument to invoke this method.
731
732The ``llvm::raw_ostream`` parameter specifies the stream to write the results
733on, and the ``Module`` parameter gives a pointer to the top level module of the
734program that has been analyzed.  Note however that this pointer may be ``NULL``
735in certain circumstances (such as calling the ``Pass::dump()`` from a
736debugger), so it should only be used to enhance debug output, it should not be
737depended on.
738
739.. _writing-an-llvm-pass-interaction:
740
741Specifying interactions between passes
742--------------------------------------
743
744One of the main responsibilities of the ``PassManager`` is to make sure that
745passes interact with each other correctly.  Because ``PassManager`` tries to
746:ref:`optimize the execution of passes <writing-an-llvm-pass-passmanager>` it
747must know how the passes interact with each other and what dependencies exist
748between the various passes.  To track this, each pass can declare the set of
749passes that are required to be executed before the current pass, and the passes
750which are invalidated by the current pass.
751
752Typically this functionality is used to require that analysis results are
753computed before your pass is run.  Running arbitrary transformation passes can
754invalidate the computed analysis results, which is what the invalidation set
755specifies.  If a pass does not implement the :ref:`getAnalysisUsage
756<writing-an-llvm-pass-getAnalysisUsage>` method, it defaults to not having any
757prerequisite passes, and invalidating **all** other passes.
758
759.. _writing-an-llvm-pass-getAnalysisUsage:
760
761The ``getAnalysisUsage`` method
762^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
763
764.. code-block:: c++
765
766  virtual void getAnalysisUsage(AnalysisUsage &Info) const;
767
768By implementing the ``getAnalysisUsage`` method, the required and invalidated
769sets may be specified for your transformation.  The implementation should fill
770in the `AnalysisUsage
771<https://llvm.org/doxygen/classllvm_1_1AnalysisUsage.html>`_ object with
772information about which passes are required and not invalidated.  To do this, a
773pass may call any of the following methods on the ``AnalysisUsage`` object:
774
775The ``AnalysisUsage::addRequired<>`` and ``AnalysisUsage::addRequiredTransitive<>`` methods
776^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
777
778If your pass requires a previous pass to be executed (an analysis for example),
779it can use one of these methods to arrange for it to be run before your pass.
780LLVM has many different types of analyses and passes that can be required,
781spanning the range from ``DominatorSet`` to ``BreakCriticalEdges``.  Requiring
782``BreakCriticalEdges``, for example, guarantees that there will be no critical
783edges in the CFG when your pass has been run.
784
785Some analyses chain to other analyses to do their job.  For example, an
786`AliasAnalysis <AliasAnalysis>` implementation is required to :ref:`chain
787<aliasanalysis-chaining>` to other alias analysis passes.  In cases where
788analyses chain, the ``addRequiredTransitive`` method should be used instead of
789the ``addRequired`` method.  This informs the ``PassManager`` that the
790transitively required pass should be alive as long as the requiring pass is.
791
792The ``AnalysisUsage::addPreserved<>`` method
793^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
794
795One of the jobs of the ``PassManager`` is to optimize how and when analyses are
796run.  In particular, it attempts to avoid recomputing data unless it needs to.
797For this reason, passes are allowed to declare that they preserve (i.e., they
798don't invalidate) an existing analysis if it's available.  For example, a
799simple constant folding pass would not modify the CFG, so it can't possibly
800affect the results of dominator analysis.  By default, all passes are assumed
801to invalidate all others.
802
803The ``AnalysisUsage`` class provides several methods which are useful in
804certain circumstances that are related to ``addPreserved``.  In particular, the
805``setPreservesAll`` method can be called to indicate that the pass does not
806modify the LLVM program at all (which is true for analyses), and the
807``setPreservesCFG`` method can be used by transformations that change
808instructions in the program but do not modify the CFG or terminator
809instructions.
810
811``addPreserved`` is particularly useful for transformations like
812``BreakCriticalEdges``.  This pass knows how to update a small set of loop and
813dominator related analyses if they exist, so it can preserve them, despite the
814fact that it hacks on the CFG.
815
816Example implementations of ``getAnalysisUsage``
817^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
818
819.. code-block:: c++
820
821  // This example modifies the program, but does not modify the CFG
822  void LICM::getAnalysisUsage(AnalysisUsage &AU) const {
823    AU.setPreservesCFG();
824    AU.addRequired<LoopInfoWrapperPass>();
825  }
826
827.. _writing-an-llvm-pass-getAnalysis:
828
829The ``getAnalysis<>`` and ``getAnalysisIfAvailable<>`` methods
830^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
831
832The ``Pass::getAnalysis<>`` method is automatically inherited by your class,
833providing you with access to the passes that you declared that you required
834with the :ref:`getAnalysisUsage <writing-an-llvm-pass-getAnalysisUsage>`
835method.  It takes a single template argument that specifies which pass class
836you want, and returns a reference to that pass.  For example:
837
838.. code-block:: c++
839
840  bool LICM::runOnFunction(Function &F) {
841    LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
842    //...
843  }
844
845This method call returns a reference to the pass desired.  You may get a
846runtime assertion failure if you attempt to get an analysis that you did not
847declare as required in your :ref:`getAnalysisUsage
848<writing-an-llvm-pass-getAnalysisUsage>` implementation.  This method can be
849called by your ``run*`` method implementation, or by any other local method
850invoked by your ``run*`` method.
851
852A module level pass can use function level analysis info using this interface.
853For example:
854
855.. code-block:: c++
856
857  bool ModuleLevelPass::runOnModule(Module &M) {
858    //...
859    DominatorTree &DT = getAnalysis<DominatorTree>(Func);
860    //...
861  }
862
863In above example, ``runOnFunction`` for ``DominatorTree`` is called by pass
864manager before returning a reference to the desired pass.
865
866If your pass is capable of updating analyses if they exist (e.g.,
867``BreakCriticalEdges``, as described above), you can use the
868``getAnalysisIfAvailable`` method, which returns a pointer to the analysis if
869it is active.  For example:
870
871.. code-block:: c++
872
873  if (DominatorSet *DS = getAnalysisIfAvailable<DominatorSet>()) {
874    // A DominatorSet is active.  This code will update it.
875  }
876
877Implementing Analysis Groups
878----------------------------
879
880Now that we understand the basics of how passes are defined, how they are used,
881and how they are required from other passes, it's time to get a little bit
882fancier.  All of the pass relationships that we have seen so far are very
883simple: one pass depends on one other specific pass to be run before it can
884run.  For many applications, this is great, for others, more flexibility is
885required.
886
887In particular, some analyses are defined such that there is a single simple
888interface to the analysis results, but multiple ways of calculating them.
889Consider alias analysis for example.  The most trivial alias analysis returns
890"may alias" for any alias query.  The most sophisticated analysis a
891flow-sensitive, context-sensitive interprocedural analysis that can take a
892significant amount of time to execute (and obviously, there is a lot of room
893between these two extremes for other implementations).  To cleanly support
894situations like this, the LLVM Pass Infrastructure supports the notion of
895Analysis Groups.
896
897Analysis Group Concepts
898^^^^^^^^^^^^^^^^^^^^^^^
899
900An Analysis Group is a single simple interface that may be implemented by
901multiple different passes.  Analysis Groups can be given human readable names
902just like passes, but unlike passes, they need not derive from the ``Pass``
903class.  An analysis group may have one or more implementations, one of which is
904the "default" implementation.
905
906Analysis groups are used by client passes just like other passes are: the
907``AnalysisUsage::addRequired()`` and ``Pass::getAnalysis()`` methods.  In order
908to resolve this requirement, the :ref:`PassManager
909<writing-an-llvm-pass-passmanager>` scans the available passes to see if any
910implementations of the analysis group are available.  If none is available, the
911default implementation is created for the pass to use.  All standard rules for
912:ref:`interaction between passes <writing-an-llvm-pass-interaction>` still
913apply.
914
915Although :ref:`Pass Registration <writing-an-llvm-pass-registration>` is
916optional for normal passes, all analysis group implementations must be
917registered, and must use the :ref:`INITIALIZE_AG_PASS
918<writing-an-llvm-pass-RegisterAnalysisGroup>` template to join the
919implementation pool.  Also, a default implementation of the interface **must**
920be registered with :ref:`RegisterAnalysisGroup
921<writing-an-llvm-pass-RegisterAnalysisGroup>`.
922
923As a concrete example of an Analysis Group in action, consider the
924`AliasAnalysis <https://llvm.org/doxygen/classllvm_1_1AliasAnalysis.html>`_
925analysis group.  The default implementation of the alias analysis interface
926(the `basic-aa <https://llvm.org/doxygen/structBasicAliasAnalysis.html>`_ pass)
927just does a few simple checks that don't require significant analysis to
928compute (such as: two different globals can never alias each other, etc).
929Passes that use the `AliasAnalysis
930<https://llvm.org/doxygen/classllvm_1_1AliasAnalysis.html>`_ interface (for
931example the `gvn <https://llvm.org/doxygen/classllvm_1_1GVN.html>`_ pass), do not
932care which implementation of alias analysis is actually provided, they just use
933the designated interface.
934
935From the user's perspective, commands work just like normal.  Issuing the
936command ``opt -gvn ...`` will cause the ``basic-aa`` class to be instantiated
937and added to the pass sequence.  Issuing the command ``opt -somefancyaa -gvn
938...`` will cause the ``gvn`` pass to use the ``somefancyaa`` alias analysis
939(which doesn't actually exist, it's just a hypothetical example) instead.
940
941.. _writing-an-llvm-pass-RegisterAnalysisGroup:
942
943Using ``RegisterAnalysisGroup``
944^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
945
946The ``RegisterAnalysisGroup`` template is used to register the analysis group
947itself, while the ``INITIALIZE_AG_PASS`` is used to add pass implementations to
948the analysis group.  First, an analysis group should be registered, with a
949human readable name provided for it.  Unlike registration of passes, there is
950no command line argument to be specified for the Analysis Group Interface
951itself, because it is "abstract":
952
953.. code-block:: c++
954
955  static RegisterAnalysisGroup<AliasAnalysis> A("Alias Analysis");
956
957Once the analysis is registered, passes can declare that they are valid
958implementations of the interface by using the following code:
959
960.. code-block:: c++
961
962  namespace {
963    // Declare that we implement the AliasAnalysis interface
964    INITIALIZE_AG_PASS(FancyAA, AliasAnalysis , "somefancyaa",
965        "A more complex alias analysis implementation",
966        false,  // Is CFG Only?
967        true,   // Is Analysis?
968        false); // Is default Analysis Group implementation?
969  }
970
971This just shows a class ``FancyAA`` that uses the ``INITIALIZE_AG_PASS`` macro
972both to register and to "join" the `AliasAnalysis
973<https://llvm.org/doxygen/classllvm_1_1AliasAnalysis.html>`_ analysis group.
974Every implementation of an analysis group should join using this macro.
975
976.. code-block:: c++
977
978  namespace {
979    // Declare that we implement the AliasAnalysis interface
980    INITIALIZE_AG_PASS(BasicAA, AliasAnalysis, "basic-aa",
981        "Basic Alias Analysis (default AA impl)",
982        false, // Is CFG Only?
983        true,  // Is Analysis?
984        true); // Is default Analysis Group implementation?
985  }
986
987Here we show how the default implementation is specified (using the final
988argument to the ``INITIALIZE_AG_PASS`` template).  There must be exactly one
989default implementation available at all times for an Analysis Group to be used.
990Only default implementation can derive from ``ImmutablePass``.  Here we declare
991that the `BasicAliasAnalysis
992<https://llvm.org/doxygen/structBasicAliasAnalysis.html>`_ pass is the default
993implementation for the interface.
994
995Pass Statistics
996===============
997
998The `Statistic <https://llvm.org/doxygen/Statistic_8h_source.html>`_ class is
999designed to be an easy way to expose various success metrics from passes.
1000These statistics are printed at the end of a run, when the :option:`-stats`
1001command line option is enabled on the command line.  See the :ref:`Statistics
1002section <Statistic>` in the Programmer's Manual for details.
1003
1004.. _writing-an-llvm-pass-passmanager:
1005
1006What PassManager does
1007---------------------
1008
1009The `PassManager <https://llvm.org/doxygen/PassManager_8h_source.html>`_ `class
1010<https://llvm.org/doxygen/classllvm_1_1PassManager.html>`_ takes a list of
1011passes, ensures their :ref:`prerequisites <writing-an-llvm-pass-interaction>`
1012are set up correctly, and then schedules passes to run efficiently.  All of the
1013LLVM tools that run passes use the PassManager for execution of these passes.
1014
1015The PassManager does two main things to try to reduce the execution time of a
1016series of passes:
1017
1018#. **Share analysis results.**  The ``PassManager`` attempts to avoid
1019   recomputing analysis results as much as possible.  This means keeping track
1020   of which analyses are available already, which analyses get invalidated, and
1021   which analyses are needed to be run for a pass.  An important part of work
1022   is that the ``PassManager`` tracks the exact lifetime of all analysis
1023   results, allowing it to :ref:`free memory
1024   <writing-an-llvm-pass-releaseMemory>` allocated to holding analysis results
1025   as soon as they are no longer needed.
1026
1027#. **Pipeline the execution of passes on the program.**  The ``PassManager``
1028   attempts to get better cache and memory usage behavior out of a series of
1029   passes by pipelining the passes together.  This means that, given a series
1030   of consecutive :ref:`FunctionPass <writing-an-llvm-pass-FunctionPass>`, it
1031   will execute all of the :ref:`FunctionPass
1032   <writing-an-llvm-pass-FunctionPass>` on the first function, then all of the
1033   :ref:`FunctionPasses <writing-an-llvm-pass-FunctionPass>` on the second
1034   function, etc... until the entire program has been run through the passes.
1035
1036   This improves the cache behavior of the compiler, because it is only
1037   touching the LLVM program representation for a single function at a time,
1038   instead of traversing the entire program.  It reduces the memory consumption
1039   of compiler, because, for example, only one `DominatorSet
1040   <https://llvm.org/doxygen/classllvm_1_1DominatorSet.html>`_ needs to be
1041   calculated at a time.  This also makes it possible to implement some
1042   :ref:`interesting enhancements <writing-an-llvm-pass-SMP>` in the future.
1043
1044The effectiveness of the ``PassManager`` is influenced directly by how much
1045information it has about the behaviors of the passes it is scheduling.  For
1046example, the "preserved" set is intentionally conservative in the face of an
1047unimplemented :ref:`getAnalysisUsage <writing-an-llvm-pass-getAnalysisUsage>`
1048method.  Not implementing when it should be implemented will have the effect of
1049not allowing any analysis results to live across the execution of your pass.
1050
1051The ``PassManager`` class exposes a ``--debug-pass`` command line options that
1052is useful for debugging pass execution, seeing how things work, and diagnosing
1053when you should be preserving more analyses than you currently are.  (To get
1054information about all of the variants of the ``--debug-pass`` option, just type
1055"``opt -help-hidden``").
1056
1057By using the --debug-pass=Structure option, for example, we can see how our
1058:ref:`Hello World <writing-an-llvm-pass-basiccode>` pass interacts with other
1059passes.  Lets try it out with the gvn and licm passes:
1060
1061.. code-block:: console
1062
1063  $ opt -load lib/LLVMHello.so -gvn -licm --debug-pass=Structure < hello.bc > /dev/null
1064  ModulePass Manager
1065    FunctionPass Manager
1066      Dominator Tree Construction
1067      Basic Alias Analysis (stateless AA impl)
1068      Function Alias Analysis Results
1069      Memory Dependence Analysis
1070      Global Value Numbering
1071      Natural Loop Information
1072      Canonicalize natural loops
1073      Loop-Closed SSA Form Pass
1074      Basic Alias Analysis (stateless AA impl)
1075      Function Alias Analysis Results
1076      Scalar Evolution Analysis
1077      Loop Pass Manager
1078        Loop Invariant Code Motion
1079      Module Verifier
1080    Bitcode Writer
1081
1082This output shows us when passes are constructed.
1083Here we see that GVN uses dominator tree information to do its job.  The LICM pass
1084uses natural loop information, which uses dominator tree as well.
1085
1086After the LICM pass, the module verifier runs (which is automatically added by
1087the :program:`opt` tool), which uses the dominator tree to check that the
1088resultant LLVM code is well formed. Note that the dominator tree is computed
1089once, and shared by three passes.
1090
1091Lets see how this changes when we run the :ref:`Hello World
1092<writing-an-llvm-pass-basiccode>` pass in between the two passes:
1093
1094.. code-block:: console
1095
1096  $ opt -load lib/LLVMHello.so -gvn -hello -licm --debug-pass=Structure < hello.bc > /dev/null
1097  ModulePass Manager
1098    FunctionPass Manager
1099      Dominator Tree Construction
1100      Basic Alias Analysis (stateless AA impl)
1101      Function Alias Analysis Results
1102      Memory Dependence Analysis
1103      Global Value Numbering
1104      Hello World Pass
1105      Dominator Tree Construction
1106      Natural Loop Information
1107      Canonicalize natural loops
1108      Loop-Closed SSA Form Pass
1109      Basic Alias Analysis (stateless AA impl)
1110      Function Alias Analysis Results
1111      Scalar Evolution Analysis
1112      Loop Pass Manager
1113        Loop Invariant Code Motion
1114      Module Verifier
1115    Bitcode Writer
1116  Hello: __main
1117  Hello: puts
1118  Hello: main
1119
1120Here we see that the :ref:`Hello World <writing-an-llvm-pass-basiccode>` pass
1121has killed the Dominator Tree pass, even though it doesn't modify the code at
1122all!  To fix this, we need to add the following :ref:`getAnalysisUsage
1123<writing-an-llvm-pass-getAnalysisUsage>` method to our pass:
1124
1125.. code-block:: c++
1126
1127  // We don't modify the program, so we preserve all analyses
1128  void getAnalysisUsage(AnalysisUsage &AU) const override {
1129    AU.setPreservesAll();
1130  }
1131
1132Now when we run our pass, we get this output:
1133
1134.. code-block:: console
1135
1136  $ opt -load lib/LLVMHello.so -gvn -hello -licm --debug-pass=Structure < hello.bc > /dev/null
1137  Pass Arguments:  -gvn -hello -licm
1138  ModulePass Manager
1139    FunctionPass Manager
1140      Dominator Tree Construction
1141      Basic Alias Analysis (stateless AA impl)
1142      Function Alias Analysis Results
1143      Memory Dependence Analysis
1144      Global Value Numbering
1145      Hello World Pass
1146      Natural Loop Information
1147      Canonicalize natural loops
1148      Loop-Closed SSA Form Pass
1149      Basic Alias Analysis (stateless AA impl)
1150      Function Alias Analysis Results
1151      Scalar Evolution Analysis
1152      Loop Pass Manager
1153        Loop Invariant Code Motion
1154      Module Verifier
1155    Bitcode Writer
1156  Hello: __main
1157  Hello: puts
1158  Hello: main
1159
1160Which shows that we don't accidentally invalidate dominator information
1161anymore, and therefore do not have to compute it twice.
1162
1163.. _writing-an-llvm-pass-releaseMemory:
1164
1165The ``releaseMemory`` method
1166^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1167
1168.. code-block:: c++
1169
1170  virtual void releaseMemory();
1171
1172The ``PassManager`` automatically determines when to compute analysis results,
1173and how long to keep them around for.  Because the lifetime of the pass object
1174itself is effectively the entire duration of the compilation process, we need
1175some way to free analysis results when they are no longer useful.  The
1176``releaseMemory`` virtual method is the way to do this.
1177
1178If you are writing an analysis or any other pass that retains a significant
1179amount of state (for use by another pass which "requires" your pass and uses
1180the :ref:`getAnalysis <writing-an-llvm-pass-getAnalysis>` method) you should
1181implement ``releaseMemory`` to, well, release the memory allocated to maintain
1182this internal state.  This method is called after the ``run*`` method for the
1183class, before the next call of ``run*`` in your pass.
1184
1185Building pass plugins
1186=====================
1187
1188As an alternative to using ``PLUGIN_TOOL``, LLVM provides a mechanism to
1189automatically register pass plugins within ``clang``, ``opt`` and ``bugpoint``.
1190One first needs to create an independent project and add it to either ``tools/``
1191or, using the MonoRepo layout, at the root of the repo alongside other projects.
1192This project must contain the following minimal ``CMakeLists.txt``:
1193
1194.. code-block:: cmake
1195
1196    add_llvm_pass_plugin(Name source0.cpp)
1197
1198The pass must provide two entry points for the new pass manager, one for static
1199registration and one for dynamically loaded plugins:
1200
1201- ``llvm::PassPluginLibraryInfo get##Name##PluginInfo();``
1202- ``extern "C" ::llvm::PassPluginLibraryInfo llvmGetPassPluginInfo() LLVM_ATTRIBUTE_WEAK;``
1203
1204Pass plugins are compiled and link dynamically by default, but it's
1205possible to set the following variables to change this behavior:
1206
1207- ``LLVM_${NAME}_LINK_INTO_TOOLS``, when set to ``ON``, turns the project into
1208  a statically linked extension
1209
1210
1211When building a tool that uses the new pass manager, one can use the following snippet to
1212include statically linked pass plugins:
1213
1214.. code-block:: c++
1215
1216    // fetch the declaration
1217    #define HANDLE_EXTENSION(Ext) llvm::PassPluginLibraryInfo get##Ext##PluginInfo();
1218    #include "llvm/Support/Extension.def"
1219
1220    [...]
1221
1222    // use them, PB is an llvm::PassBuilder instance
1223    #define HANDLE_EXTENSION(Ext) get##Ext##PluginInfo().RegisterPassBuilderCallbacks(PB);
1224    #include "llvm/Support/Extension.def"
1225
1226
1227
1228
1229
1230Registering dynamically loaded passes
1231=====================================
1232
1233*Size matters* when constructing production quality tools using LLVM, both for
1234the purposes of distribution, and for regulating the resident code size when
1235running on the target system.  Therefore, it becomes desirable to selectively
1236use some passes, while omitting others and maintain the flexibility to change
1237configurations later on.  You want to be able to do all this, and, provide
1238feedback to the user.  This is where pass registration comes into play.
1239
1240The fundamental mechanisms for pass registration are the
1241``MachinePassRegistry`` class and subclasses of ``MachinePassRegistryNode``.
1242
1243An instance of ``MachinePassRegistry`` is used to maintain a list of
1244``MachinePassRegistryNode`` objects.  This instance maintains the list and
1245communicates additions and deletions to the command line interface.
1246
1247An instance of ``MachinePassRegistryNode`` subclass is used to maintain
1248information provided about a particular pass.  This information includes the
1249command line name, the command help string and the address of the function used
1250to create an instance of the pass.  A global static constructor of one of these
1251instances *registers* with a corresponding ``MachinePassRegistry``, the static
1252destructor *unregisters*.  Thus a pass that is statically linked in the tool
1253will be registered at start up.  A dynamically loaded pass will register on
1254load and unregister at unload.
1255
1256Using existing registries
1257-------------------------
1258
1259There are predefined registries to track instruction scheduling
1260(``RegisterScheduler``) and register allocation (``RegisterRegAlloc``) machine
1261passes.  Here we will describe how to *register* a register allocator machine
1262pass.
1263
1264Implement your register allocator machine pass.  In your register allocator
1265``.cpp`` file add the following include:
1266
1267.. code-block:: c++
1268
1269  #include "llvm/CodeGen/RegAllocRegistry.h"
1270
1271Also in your register allocator ``.cpp`` file, define a creator function in the
1272form:
1273
1274.. code-block:: c++
1275
1276  FunctionPass *createMyRegisterAllocator() {
1277    return new MyRegisterAllocator();
1278  }
1279
1280Note that the signature of this function should match the type of
1281``RegisterRegAlloc::FunctionPassCtor``.  In the same file add the "installing"
1282declaration, in the form:
1283
1284.. code-block:: c++
1285
1286  static RegisterRegAlloc myRegAlloc("myregalloc",
1287                                     "my register allocator help string",
1288                                     createMyRegisterAllocator);
1289
1290Note the two spaces prior to the help string produces a tidy result on the
1291:option:`-help` query.
1292
1293.. code-block:: console
1294
1295  $ llc -help
1296    ...
1297    -regalloc                    - Register allocator to use (default=linearscan)
1298      =linearscan                -   linear scan register allocator
1299      =local                     -   local register allocator
1300      =simple                    -   simple register allocator
1301      =myregalloc                -   my register allocator help string
1302    ...
1303
1304And that's it.  The user is now free to use ``-regalloc=myregalloc`` as an
1305option.  Registering instruction schedulers is similar except use the
1306``RegisterScheduler`` class.  Note that the
1307``RegisterScheduler::FunctionPassCtor`` is significantly different from
1308``RegisterRegAlloc::FunctionPassCtor``.
1309
1310To force the load/linking of your register allocator into the
1311:program:`llc`/:program:`lli` tools, add your creator function's global
1312declaration to ``Passes.h`` and add a "pseudo" call line to
1313``llvm/Codegen/LinkAllCodegenComponents.h``.
1314
1315Creating new registries
1316-----------------------
1317
1318The easiest way to get started is to clone one of the existing registries; we
1319recommend ``llvm/CodeGen/RegAllocRegistry.h``.  The key things to modify are
1320the class name and the ``FunctionPassCtor`` type.
1321
1322Then you need to declare the registry.  Example: if your pass registry is
1323``RegisterMyPasses`` then define:
1324
1325.. code-block:: c++
1326
1327  MachinePassRegistry RegisterMyPasses::Registry;
1328
1329And finally, declare the command line option for your passes.  Example:
1330
1331.. code-block:: c++
1332
1333  cl::opt<RegisterMyPasses::FunctionPassCtor, false,
1334          RegisterPassParser<RegisterMyPasses> >
1335  MyPassOpt("mypass",
1336            cl::init(&createDefaultMyPass),
1337            cl::desc("my pass option help"));
1338
1339Here the command option is "``mypass``", with ``createDefaultMyPass`` as the
1340default creator.
1341
1342Using GDB with dynamically loaded passes
1343----------------------------------------
1344
1345Unfortunately, using GDB with dynamically loaded passes is not as easy as it
1346should be.  First of all, you can't set a breakpoint in a shared object that
1347has not been loaded yet, and second of all there are problems with inlined
1348functions in shared objects.  Here are some suggestions to debugging your pass
1349with GDB.
1350
1351For sake of discussion, I'm going to assume that you are debugging a
1352transformation invoked by :program:`opt`, although nothing described here
1353depends on that.
1354
1355Setting a breakpoint in your pass
1356^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1357
1358First thing you do is start gdb on the opt process:
1359
1360.. code-block:: console
1361
1362  $ gdb opt
1363  GNU gdb 5.0
1364  Copyright 2000 Free Software Foundation, Inc.
1365  GDB is free software, covered by the GNU General Public License, and you are
1366  welcome to change it and/or distribute copies of it under certain conditions.
1367  Type "show copying" to see the conditions.
1368  There is absolutely no warranty for GDB.  Type "show warranty" for details.
1369  This GDB was configured as "sparc-sun-solaris2.6"...
1370  (gdb)
1371
1372Note that :program:`opt` has a lot of debugging information in it, so it takes
1373time to load.  Be patient.  Since we cannot set a breakpoint in our pass yet
1374(the shared object isn't loaded until runtime), we must execute the process,
1375and have it stop before it invokes our pass, but after it has loaded the shared
1376object.  The most foolproof way of doing this is to set a breakpoint in
1377``PassManager::run`` and then run the process with the arguments you want:
1378
1379.. code-block:: console
1380
1381  $ (gdb) break llvm::PassManager::run
1382  Breakpoint 1 at 0x2413bc: file Pass.cpp, line 70.
1383  (gdb) run test.bc -load $(LLVMTOP)/llvm/Debug+Asserts/lib/[libname].so -[passoption]
1384  Starting program: opt test.bc -load $(LLVMTOP)/llvm/Debug+Asserts/lib/[libname].so -[passoption]
1385  Breakpoint 1, PassManager::run (this=0xffbef174, M=@0x70b298) at Pass.cpp:70
1386  70      bool PassManager::run(Module &M) { return PM->run(M); }
1387  (gdb)
1388
1389Once the :program:`opt` stops in the ``PassManager::run`` method you are now
1390free to set breakpoints in your pass so that you can trace through execution or
1391do other standard debugging stuff.
1392
1393Miscellaneous Problems
1394^^^^^^^^^^^^^^^^^^^^^^
1395
1396Once you have the basics down, there are a couple of problems that GDB has,
1397some with solutions, some without.
1398
1399* Inline functions have bogus stack information.  In general, GDB does a pretty
1400  good job getting stack traces and stepping through inline functions.  When a
1401  pass is dynamically loaded however, it somehow completely loses this
1402  capability.  The only solution I know of is to de-inline a function (move it
1403  from the body of a class to a ``.cpp`` file).
1404
1405* Restarting the program breaks breakpoints.  After following the information
1406  above, you have succeeded in getting some breakpoints planted in your pass.
1407  Next thing you know, you restart the program (i.e., you type "``run``" again),
1408  and you start getting errors about breakpoints being unsettable.  The only
1409  way I have found to "fix" this problem is to delete the breakpoints that are
1410  already set in your pass, run the program, and re-set the breakpoints once
1411  execution stops in ``PassManager::run``.
1412
1413Hopefully these tips will help with common case debugging situations.  If you'd
1414like to contribute some tips of your own, just contact `Chris
1415<mailto:[email protected]>`_.
1416
1417Future extensions planned
1418-------------------------
1419
1420Although the LLVM Pass Infrastructure is very capable as it stands, and does
1421some nifty stuff, there are things we'd like to add in the future.  Here is
1422where we are going:
1423
1424.. _writing-an-llvm-pass-SMP:
1425
1426Multithreaded LLVM
1427^^^^^^^^^^^^^^^^^^
1428
1429Multiple CPU machines are becoming more common and compilation can never be
1430fast enough: obviously we should allow for a multithreaded compiler.  Because
1431of the semantics defined for passes above (specifically they cannot maintain
1432state across invocations of their ``run*`` methods), a nice clean way to
1433implement a multithreaded compiler would be for the ``PassManager`` class to
1434create multiple instances of each pass object, and allow the separate instances
1435to be hacking on different parts of the program at the same time.
1436
1437This implementation would prevent each of the passes from having to implement
1438multithreaded constructs, requiring only the LLVM core to have locking in a few
1439places (for global resources).  Although this is a simple extension, we simply
1440haven't had time (or multiprocessor machines, thus a reason) to implement this.
1441Despite that, we have kept the LLVM passes SMP ready, and you should too.
1442
1443