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