X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=docs%2FProgrammersManual.html;h=be40ba32f1b59bc0d975d647e7536e03b0dcc974;hb=72af6b8e5d7548a4a6805b156169d240cef7d0db;hp=2709b2298d8353e4078ec8eae91e1fa1b96a74a5;hpb=6b121f1c434fb0771ba4447e0551a4f1bc004b4b;p=oota-llvm.git diff --git a/docs/ProgrammersManual.html b/docs/ProgrammersManual.html index 2709b2298d8..be40ba32f1b 100644 --- a/docs/ProgrammersManual.html +++ b/docs/ProgrammersManual.html @@ -12,8 +12,28 @@
  • General Information +
  • Important and useful LLVM APIs +
  • Helpful Hints for Common Operations
  • Making simple changes - -
  • The Core LLVM Class Hierarchy Reference @@ -158,9 +165,15 @@ the subject that you can get, so it will not be discussed in this document.

    Here are some useful links:

      -
    1. Dinkumware C++ +
    2. Dinkumware C++ Library reference - an excellent reference for the STL and other parts of -the standard C++ library.
      +the standard C++ library. + +
    3. C++ In a Nutshell - This is an +O'Reilly book in the making. It has a decent Standard Library +Reference that rivals Dinkumware's, and is actually free until the book is +published.
    4. C++ Frequently Asked Questions @@ -180,6 +193,16 @@ href="CodingStandards.html">LLVM Coding Standards guide which focuses on how to write maintainable code more than where to put your curly braces.

      + + +
      +Important and useful LLVM APIs +

        + + +Here we highlight some LLVM APIs that are generally useful and good to know +about when writing transformations.

        +

         @@ -221,7 +244,7 @@ static bool isLoopInvariant(const Value *V, const Loop *L) return true; // Otherwise, it must be an instruction... - return !L->contains(cast<Instruction>(V)->getParent()); + return !L->contains(cast<Instruction>(V)->getParent());

      Note that you should not use an isa<> test followed by a @@ -252,8 +275,8 @@ Another common example is:

         // Loop over all of the phi nodes in a basic block
      -  BasicBlock::iterator BBI = BB->begin();
      -  for (; PHINode *PN = dyn_cast<PHINode>(&*BBI); ++BBI)
      +  BasicBlock::iterator BBI = BB->begin();
      +  for (; PHINode *PN = dyn_cast<PHINode>(BBI); ++BBI)
           cerr << *PN;
       

      @@ -269,7 +292,7 @@ dispatch over the instruction type directly.

      The cast_or_null<> operator works just like the cast<> operator, except that it allows for a null pointer as an -argument (which it then propogates). This can sometimes be useful, allowing you +argument (which it then propagates). This can sometimes be useful, allowing you to combine several null checks into one.

      @@ -277,7 +300,7 @@ to combine several null checks into one.

      The dyn_cast_or_null<> operator works just like the dyn_cast<> operator, except that it allows for a null pointer as -an argument (which it then propogates). This can sometimes be useful, allowing +an argument (which it then propagates). This can sometimes be useful, allowing you to combine several null checks into one.

      @@ -286,16 +309,206 @@ These five templates can be used with any classes, whether they have a v-table or not. To add support for these templates, you simply need to add classof static methods to the class you are interested casting to. Describing this is currently outside the scope of this document, but there are -lots of examples in the LLVM sourcebase.

      +lots of examples in the LLVM source base.

      + + +
         + +The DEBUG() macro & -debug option +

        + +Often when working on your pass you will put a bunch of debugging printouts and +other code into your pass. After you get it working, you want to remove +it... but you may need it again in the future (to work out new bugs that you run +across).

        + +Naturally, because of this, you don't want to delete the debug printouts, but +you don't want them to always be noisy. A standard compromise is to comment +them out, allowing you to enable them if you need them in the future.

        + +The "Support/Debug.h" file +provides a macro named DEBUG() that is a much nicer solution to this +problem. Basically, you can put arbitrary code into the argument of the +DEBUG macro, and it is only executed if 'opt' (or any other +tool) is run with the '-debug' command line argument: + +

        +     ... 
        +     DEBUG(std::cerr << "I am here!\n");
        +     ...
        +

        + +Then you can run your pass like this:

        + +

        +  $ opt < a.bc > /dev/null -mypass
        +    <no output>
        +  $ opt < a.bc > /dev/null -mypass -debug
        +    I am here!
        +  $
        +

        + +Using the DEBUG() macro instead of a home-brewed solution allows you to +now have to create "yet another" command line option for the debug output for +your pass. Note that DEBUG() macros are disabled for optimized builds, +so they do not cause a performance impact at all (for the same reason, they +should also not contain side-effects!).

        + +One additional nice thing about the DEBUG() macro is that you can +enable or disable it directly in gdb. Just use "set DebugFlag=0" or +"set DebugFlag=1" from the gdb if the program is running. If the +program hasn't been started yet, you can always just run it with +-debug.

        + + +


      Fine grained debug info with + DEBUG_TYPE() and the -debug-only option

        + +Sometimes you may find yourself in a situation where enabling -debug +just turns on too much information (such as when working on the code +generator). If you want to enable debug information with more fine-grained +control, you define the DEBUG_TYPE macro and the -debug only +option as follows:

        + +

        +     ...
        +     DEBUG(std::cerr << "No debug type\n");
        +     #undef  DEBUG_TYPE
        +     #define DEBUG_TYPE "foo"
        +     DEBUG(std::cerr << "'foo' debug type\n");
        +     #undef  DEBUG_TYPE
        +     #define DEBUG_TYPE "bar"
        +     DEBUG(std::cerr << "'bar' debug type\n");
        +     #undef  DEBUG_TYPE
        +     #define DEBUG_TYPE ""
        +     DEBUG(std::cerr << "No debug type (2)\n");
        +     ...
        +

        + +Then you can run your pass like this:

        + +

        +  $ opt < a.bc > /dev/null -mypass
        +    <no output>
        +  $ opt < a.bc > /dev/null -mypass -debug
        +    No debug type
        +    'foo' debug type
        +    'bar' debug type
        +    No debug type (2)
        +  $ opt < a.bc > /dev/null -mypass -debug-only=foo
        +    'foo' debug type
        +  $ opt < a.bc > /dev/null -mypass -debug-only=bar
        +    'bar' debug type
        +  $
        +

        + +Of course, in practice, you should only set DEBUG_TYPE at the top of a +file, to specify the debug type for the entire module (if you do this before you +#include "Support/Debug.h", you don't have to insert the ugly +#undef's). Also, you should use names more meaningful that "foo" and +"bar", because there is no system in place to ensure that names do not conflict: +if two different modules use the same string, they will all be turned on when +the name is specified. This allows all, say, instruction scheduling, debug +information to be enabled with -debug-type=InstrSched, even if the +source lives in multiple files.

        + + + +

      +
         + +The Statistic template & -stats +option +
        + +The "Support/Statistic.h" +file provides a template named Statistic that is used as a unified way +to keeping track of what the LLVM compiler is doing and how effective various +optimizations are. It is useful to see what optimizations are contributing to +making a particular program run faster.

        + +Often you may run your pass on some big program, and you're interested to see +how many times it makes a certain transformation. Although you can do this with +hand inspection, or some ad-hoc method, this is a real pain and not very useful +for big programs. Using the Statistic template makes it very easy to +keep track of this information, and the calculated information is presented in a +uniform manner with the rest of the passes being executed.

        + +There are many examples of Statistic users, but this basics of using it +are as follows:

        + +

          +
        1. Define your statistic like this:

          + +

          +static Statistic<> NumXForms("mypassname", "The # of times I did stuff");
          +

          + +The Statistic template can emulate just about any data-type, but if you +do not specify a template argument, it defaults to acting like an unsigned int +counter (this is usually what you want).

          + +

        2. Whenever you make a transformation, bump the counter:

          + +

          +   ++NumXForms;   // I did stuff
          +

          + +

        + +That's all you have to do. To get 'opt' to print out the statistics +gathered, use the '-stats' option:

        + +

        +   $ opt -stats -mypassname < program.bc > /dev/null
        +    ... statistic output ...
        +

        + +When running gccas on a C file from the SPEC benchmark suite, it gives +a report that looks like this:

        + +

        +   7646 bytecodewriter  - Number of normal instructions
        +    725 bytecodewriter  - Number of oversized instructions
        + 129996 bytecodewriter  - Number of bytecode bytes written
        +   2817 raise           - Number of insts DCEd or constprop'd
        +   3213 raise           - Number of cast-of-self removed
        +   5046 raise           - Number of expression trees converted
        +     75 raise           - Number of other getelementptr's formed
        +    138 raise           - Number of load/store peepholes
        +     42 deadtypeelim    - Number of unused typenames removed from symtab
        +    392 funcresolve     - Number of varargs functions resolved
        +     27 globaldce       - Number of global variables removed
        +      2 adce            - Number of basic blocks removed
        +    134 cee             - Number of branches revectored
        +     49 cee             - Number of setcc instruction eliminated
        +    532 gcse            - Number of loads removed
        +   2919 gcse            - Number of instructions removed
        +     86 indvars         - Number of cannonical indvars added
        +     87 indvars         - Number of aux indvars removed
        +     25 instcombine     - Number of dead inst eliminate
        +    434 instcombine     - Number of insts combined
        +    248 licm            - Number of load insts hoisted
        +   1298 licm            - Number of insts hoisted to a loop pre-header
        +      3 licm            - Number of insts hoisted to multiple loop preds (bad, no loop pre-header)
        +     75 mem2reg         - Number of alloca's promoted
        +   1444 cfgsimplify     - Number of blocks simplified
        +

        + +Obviously, with so many optimizations, having a unified framework for this stuff +is very nice. Making your pass fit well into the framework makes it more +maintainable and useful.

        +

      Helpful Hints for Common Operations -
        - +