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