X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=docs%2FWritingAnLLVMPass.html;h=07e736da691e55ae8a2aa1325e72dc0c9e2205f1;hb=9d2c9bd11377ecac24e5c7c6198153375ac72562;hp=77b059989c8c455b4564157b5ae08ffda3438685;hpb=3e15bf33e024b9df9e89351a165acfdb1dde51ed;p=oota-llvm.git diff --git a/docs/WritingAnLLVMPass.html b/docs/WritingAnLLVMPass.html index 77b059989c8..07e736da691 100644 --- a/docs/WritingAnLLVMPass.html +++ b/docs/WritingAnLLVMPass.html @@ -263,8 +263,8 @@ href="#FunctionPass">FunctionPass's operate a function at a time.

-     static const char ID;
-     Hello() : FunctionPass((intptr_t)&ID) {}
+     static char ID;
+     Hello() : FunctionPass((intptr_t)&ID) {}
 

This declares pass identifier used by LLVM to identify pass. This allows LLVM to @@ -285,20 +285,26 @@ to do our thing, so we just print out our message with the name of each function.

-  const char Hello::ID = 0;
+  char Hello::ID = 0;
 

We initialize pass ID here. LLVM uses ID's address to identify pass so initialization value is not important.

-  RegisterPass<Hello> X("hello", "Hello World Pass");
+  RegisterPass<Hello> X("hello", "Hello World Pass",
+                        false /* Only looks at CFG */,
+                        false /* Analysis Pass */);
 }  // end of anonymous namespace
 

Lastly, we register our class Hello, giving it a command line -argument "hello", and a name "Hello World Pass".

+argument "hello", and a name "Hello World Pass". +Last two RegisterPass arguments are optional. Their default value is false. +If a pass walks CFG without modifying it then third argument is set to true. +If a pass is an analysis pass, for example dominator tree pass, then true +is supplied as fourth argument.

As a whole, the .cpp file looks like:

@@ -311,8 +317,8 @@ argument "hello", and a name "Hello World Pass".

namespace { struct Hello : public FunctionPass { - static const char ID; - Hello() : FunctionPass((intptr_t)&ID) {} + static char ID; + Hello() : FunctionPass((intptr_t)&ID) {} virtual bool runOnFunction(Function &F) { llvm::cerr << "Hello: " << F.getName() << "\n"; @@ -320,6 +326,7 @@ argument "hello", and a name "Hello World Pass".

} }; + char Hello::ID = 0; RegisterPass<Hello> X("hello", "Hello World Pass"); } @@ -347,8 +354,8 @@ use the opt tool to access it, once loaded.

To test it, follow the example at the end of the Getting Started Guide to compile "Hello World" to -LLVM. We can now run the bytecode file (hello.bc) for the program -through our transformation like this (or course, any bytecode file will +LLVM. We can now run the bitcode file (hello.bc) for the program +through our transformation like this (or course, any bitcode file will work):

@@ -372,7 +379,7 @@ interesting way, we just throw away the result of opt (sending it to
 $ opt -load ../../../Debug/lib/Hello.so --help
 OVERVIEW: llvm .bc -> .bc modular optimizer
 
-USAGE: opt [options] <input bytecode>
+USAGE: opt [options] <input bitcode>
 
 OPTIONS:
   Optimizations available:
@@ -407,7 +414,7 @@ Hello: main
   Total Execution Time: 0.02 seconds (0.0479059 wall clock)
 
    ---User Time---   --System Time--   --User+System--   ---Wall Time---  --- Pass Name ---
-   0.0100 (100.0%)   0.0000 (  0.0%)   0.0100 ( 50.0%)   0.0402 ( 84.0%)  Bytecode Writer
+   0.0100 (100.0%)   0.0000 (  0.0%)   0.0100 ( 50.0%)   0.0402 ( 84.0%)  Bitcode Writer
    0.0000 (  0.0%)   0.0100 (100.0%)   0.0100 ( 50.0%)   0.0031 (  6.4%)  Dominator Set Construction
    0.0000 (  0.0%)   0.0000 (  0.0%)   0.0000 (  0.0%)   0.0013 (  2.7%)  Module Verifier
    0.0000 (  0.0%)   0.0000 (  0.0%)   0.0000 (  0.0%)   0.0033 (  6.9%)  Hello World Pass
@@ -485,7 +492,7 @@ refering to function bodies in no predictable order, or adding and removing
 functions.  Because nothing is known about the behavior of ModulePass
 subclasses, no optimization can be done for their execution. A module pass
 can use function level passes (e.g. dominators) using getAnalysis interface
- getAnalysis(Function). 

+ getAnalysis<DominatorTree>(Function).

To write a correct ModulePass subclass, derive from ModulePass and overload the runOnModule method with the @@ -537,7 +544,7 @@ href="#BasicBlockPass">BasicBlockPass, you should derive from

  • ... not allowed to modify any Functions that are not in the current SCC.
  • -
  • ... allowed to inspect any Function's other than those in the +
  • ... not allowed to inspect any Function's other than those in the current SCC and the direct callees of the SCC.
  • ... required to preserve the current CallGraph object, updating it @@ -746,7 +753,7 @@ program, or false if they didn't.

    virtual bool doInitialization(Loop *, LPPassManager &LPM);
  • -The doInitialization method is designed to do simple initialization +

    The doInitialization method is designed to do simple initialization type of stuff that does not depend on the functions being processed. The doInitialization method call is not scheduled to overlap with any other pass executions (thus it should be very fast). LPPassManager @@ -995,7 +1002,7 @@ depended on.

    -

    One of the main responsibilities of the PassManager is the make sure +

    One of the main responsibilities of the PassManager is to make sure that passes interact with each other correctly. Because PassManager tries to optimize the execution of passes it must know how the passes interact with each other and what dependencies exist between @@ -1159,7 +1166,7 @@ For example:

    }
    -In above example, runOnFunction for DominatorTree is called by pass manager +

    In above example, runOnFunction for DominatorTree is called by pass manager before returning a reference to the desired pass.

    @@ -1186,7 +1193,7 @@ it is active. For example:

    -

    Now that we understand the basics of how passes are defined, how the are +

    Now that we understand the basics of how passes are defined, how they are used, and how they are required from other passes, it's time to get a little bit fancier. All of the pass relationships that we have seen so far are very simple: one pass depends on one other specific pass to be run before it can run. @@ -1308,8 +1315,9 @@ no problem.

    Here we show how the default implementation is specified (using the extra argument to the RegisterAnalysisGroup template). There must be exactly one default implementation available at all times for an Analysis Group to be -used. Here we declare that the BasicAliasAnalysis +used. Only default implementation can derive from ImmutablePass. +Here we declare that the + BasicAliasAnalysis pass is the default implementation for the interface.

    @@ -1374,7 +1382,8 @@ the LLVM program representation for a single function at a time, instead of traversing the entire program. It reduces the memory consumption of compiler, because, for example, only one DominatorSet -needs to be calculated at a time. This also makes it possible some interesting enhancements in the future.

    @@ -1412,8 +1421,8 @@ Module Pass Manager Module Verifier -- Dominator Set Construction -- Module Verifier - Bytecode Writer ---Bytecode Writer + Bitcode Writer +--Bitcode Writer

    This output shows us when passes are constructed and when the analysis @@ -1453,8 +1462,8 @@ Module Pass Manager Module Verifier -- Dominator Set Construction -- Module Verifier - Bytecode Writer ---Bytecode Writer + Bitcode Writer +--Bitcode Writer Hello: __main Hello: puts Hello: main @@ -1493,8 +1502,8 @@ Module Pass Manager Module Verifier -- Dominator Set Construction -- Module Verifier - Bytecode Writer ---Bytecode Writer + Bitcode Writer +--Bitcode Writer Hello: __main Hello: puts Hello: main @@ -1797,6 +1806,8 @@ places (for global resources). Although this is a simple extension, we simply haven't had time (or multiprocessor machines, thus a reason) to implement this. Despite that, we have kept the LLVM passes SMP ready, and you should too.

    + +