X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=docs%2FProgrammersManual.html;h=85d53dc25193738170405593ee472d2a83300d8f;hb=9fff7e194a2d8aa3abe92efa506b1fbe83583f53;hp=4f458fac553fa7422ba6508b8ad98169b42d1b96;hpb=72ef35ea5f4d53e94160f21bc8fa0412b7774301;p=oota-llvm.git diff --git a/docs/ProgrammersManual.html b/docs/ProgrammersManual.html index 4f458fac553..85d53dc2519 100644 --- a/docs/ProgrammersManual.html +++ b/docs/ProgrammersManual.html @@ -12,7 +12,24 @@
  • General Information +
  • Important and useful LLVM APIs +
  • Helpful Hints for Common Operations
  • Making simple changes -
  • Useful LLVM APIs - -
  • The Core LLVM Class Hierarchy Reference @@ -70,7 +75,6 @@
  • The Instruction class
  • The GlobalValue class -

    Written by Dinakar Dhurjati - Chris Lattner, and +

    Written by Chris Lattner, + Dinakar Dhurjati, and Joel Stanley

    @@ -157,9 +161,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 @@ -179,14 +189,272 @@ href="CodingStandards.html">LLVM Coding Standards guide which focuses on how to write maintainable code more than where to put your curly braces.

      -
      -Helpful Hints for Common Operations +Important and useful LLVM APIs

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

        + + +

      +
         + +The isa<>, cast<> and dyn_cast<> templates +
        + +The LLVM source-base makes extensive use of a custom form of RTTI. These +templates have many similarities to the C++ dynamic_cast<> +operator, but they don't have some drawbacks (primarily stemming from the fact +that dynamic_cast<> only works on classes that have a v-table). +Because they are used so often, you must know what they do and how they work. +All of these templates are defined in the Support/Casting.h file (note +that you very rarely have to include this file directly).

        + +

        + +
        isa<>: + +
        The isa<> operator works exactly like the Java +"instanceof" operator. It returns true or false depending on whether a +reference or pointer points to an instance of the specified class. This can be +very useful for constraint checking of various sorts (example below).

        + + +

        cast<>: + +
        The cast<> operator is a "checked cast" operation. It +converts a pointer or reference from a base class to a derived cast, causing an +assertion failure if it is not really an instance of the right type. This +should be used in cases where you have some information that makes you believe +that something is of the right type. An example of the isa<> and +cast<> template is:

        + +

        +static bool isLoopInvariant(const Value *V, const Loop *L) {
        +  if (isa<Constant>(V) || isa<Argument>(V) || isa<GlobalValue>(V))
        +    return true;
        +
        +  // Otherwise, it must be an instruction...
        +  return !L->contains(cast<Instruction>(V)->getParent());
        +

        + +Note that you should not use an isa<> test followed by a +cast<>, for that use the dyn_cast<> operator.

        + + +

        dyn_cast<>: + +
        The dyn_cast<> operator is a "checking cast" operation. It +checks to see if the operand is of the specified type, and if so, returns a +pointer to it (this operator does not work with references). If the operand is +not of the correct type, a null pointer is returned. Thus, this works very much +like the dynamic_cast operator in C++, and should be used in the same +circumstances. Typically, the dyn_cast<> operator is used in an +if statement or some other flow control statement like this:

        + +

        +  if (AllocationInst *AI = dyn_cast<AllocationInst>(Val)) {
        +    ...
        +  }
        +

        + +This form of the if statement effectively combines together a call to +isa<> and a call to cast<> into one statement, +which is very convenient.

        + +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)
        +    cerr << *PN;
        +

        + +Note that the dyn_cast<> operator, like C++'s +dynamic_cast or Java's instanceof operator, can be abused. In +particular you should not use big chained if/then/else blocks to check +for lots of different variants of classes. If you find yourself wanting to do +this, it is much cleaner and more efficient to use the InstVisitor class to +dispatch over the instruction type directly.

        + + +

        cast_or_null<>: + +
        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 propagates). This can sometimes be useful, allowing you +to combine several null checks into one.

        + + +

        dyn_cast_or_null<>: + +
        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 propagates). This can sometimes be useful, allowing +you to combine several null checks into one.

        + +

        + +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 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/Statistic.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' 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.

        + + + +

      +
         + +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 +