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