From: Chris Lattner Date: Thu, 18 Oct 2001 20:19:09 +0000 (+0000) Subject: move llvm/Transforms/Pass.h to the top level llvm/Pass.h file X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=986fced5f9b3ef06f514cba66db499acffdc9711;p=oota-llvm.git move llvm/Transforms/Pass.h to the top level llvm/Pass.h file git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@901 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Optimizations/LevelChange.h b/include/llvm/Optimizations/LevelChange.h index 128e9e1b212..b68ed765f2a 100644 --- a/include/llvm/Optimizations/LevelChange.h +++ b/include/llvm/Optimizations/LevelChange.h @@ -9,7 +9,7 @@ #ifndef LLVM_OPT_LEVELCHANGE_H #define LLVM_OPT_LEVELCHANGE_H -#include "llvm/Transforms/Pass.h" +#include "llvm/Pass.h" #include "llvm/Module.h" #include "llvm/Method.h" diff --git a/include/llvm/Pass.h b/include/llvm/Pass.h new file mode 100644 index 00000000000..e357df0037a --- /dev/null +++ b/include/llvm/Pass.h @@ -0,0 +1,126 @@ +//===- llvm/Pass.h - Base class for XForm Passes -----------------*- C++ -*--=// +// +// This file defines a base class that indicates that a specified class is a +// transformation pass implementation. +// +// Pass's are designed this way so that it is possible to apply N passes to a +// module, by first doing N Pass specific initializations for the module, then +// looping over all of the methods in the module, doing method specific work +// N times for each method. Like this: +// +// for_each(Passes.begin(), Passes.end(), doPassInitialization(Module)); +// for_each(Method *M <- Module->begin(), Module->end()) +// for_each(Passes.begin(), Passes.end(), doPerMethodWork(M)); +// +// The other way to do things is like this: +// for_each(Pass *P <- Passes.begin(), Passes.end()) { +// Passes->doPassInitialization(Module) +// for_each(Module->begin(), Module->end(), P->doPerMethodWork); +// } +// +// But this can cause thrashing and poor cache performance, so we don't do it +// that way. +// +// Because a transformation does not see all methods consecutively, it should +// be careful about the state that it maintains... another pass may modify a +// method between two invocatations of doPerMethodWork. +// +// Also, implementations of doMethodWork should not remove any methods from the +// module. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_PASS_H +#define LLVM_PASS_H + +#include "llvm/Module.h" +#include "llvm/Method.h" + +//===----------------------------------------------------------------------===// +// Pass interface - Implemented by all 'passes'. +// +struct Pass { + //===--------------------------------------------------------------------===// + // The externally useful entry points + // + + // runAllPasses - Run a bunch of passes on the specified module, efficiently. + static bool runAllPasses(Module *M, vector &Passes) { + bool MadeChanges = false; + // Run all of the pass initializers + for (unsigned i = 0; i < Passes.size(); ++i) + MadeChanges |= Passes[i]->doPassInitialization(M); + + // Loop over all of the methods, applying all of the passes to them + for (unsigned m = 0; m < M->size(); ++m) + for (unsigned i = 0; i < Passes.size(); ++i) + MadeChanges |= Passes[i]->doPerMethodWork(*(M->begin()+m)); + + // Run all of the pass finalizers... + for (unsigned i = 0; i < Passes.size(); ++i) + MadeChanges |= Passes[i]->doPassFinalization(M); + return MadeChanges; + } + + // runAllPassesAndFree - Run a bunch of passes on the specified module, + // efficiently. When done, delete all of the passes. + // + static bool runAllPassesAndFree(Module *M, vector &Passes) { + // First run all of the passes + bool MadeChanges = runAllPasses(M, Passes); + + // Free all of the passes. + for (unsigned i = 0; i < Passes.size(); ++i) + delete Passes[i]; + return MadeChanges; + } + + + // run(Module*) - Run this pass on a module and all of the methods contained + // within it. Returns true if any of the contained passes returned true. + // + bool run(Module *M) { + bool MadeChanges = doPassInitialization(M); + + // Loop over methods in the module. doPerMethodWork could add a method to + // the Module, so we have to keep checking for end of method list condition. + // + for (unsigned m = 0; m < M->size(); ++m) + MadeChanges |= doPerMethodWork(*(M->begin()+m)); + return MadeChanges | doPassFinalization(M); + } + + // run(Method*) - Run this pass on a module and one specific method. Returns + // false on success. + // + bool run(Method *M) { + return doPassInitialization(M->getParent()) | doPerMethodWork(M) | + doPassFinalization(M->getParent()); + } + + + //===--------------------------------------------------------------------===// + // Functions to be implemented by subclasses + // + + // Destructor - Virtual so we can be subclassed + inline virtual ~Pass() {} + + // doPassInitialization - Virtual method overridden by subclasses to do + // any neccesary per-module initialization. + // + virtual bool doPassInitialization(Module *M) { return false; } + + // doPerMethodWork - Virtual method overriden by subclasses to do the + // per-method processing of the pass. + // + virtual bool doPerMethodWork(Method *M) { return false; } + + // doPassFinalization - Virtual method overriden by subclasses to do any post + // processing needed after all passes have run. + // + virtual bool doPassFinalization(Module *M) { return false; } +}; + +#endif + diff --git a/include/llvm/Transforms/ChangeAllocations.h b/include/llvm/Transforms/ChangeAllocations.h index 46efa26077b..8f53051da34 100644 --- a/include/llvm/Transforms/ChangeAllocations.h +++ b/include/llvm/Transforms/ChangeAllocations.h @@ -10,7 +10,7 @@ #ifndef LLVM_TRANSFORMS_LOWERALLOCATIONS_H #define LLVM_TRANSFORMS_LOWERALLOCATIONS_H -#include "llvm/Transforms/Pass.h" +#include "llvm/Pass.h" class TargetData; class LowerAllocations : public Pass { diff --git a/include/llvm/Transforms/FunctionInlining.h b/include/llvm/Transforms/FunctionInlining.h index 373708d6b0d..520cc7fe6cf 100644 --- a/include/llvm/Transforms/FunctionInlining.h +++ b/include/llvm/Transforms/FunctionInlining.h @@ -7,7 +7,7 @@ #ifndef LLVM_OPT_METHOD_INLINING_H #define LLVM_OPT_METHOD_INLINING_H -#include "llvm/Transforms/Pass.h" +#include "llvm/Pass.h" #include "llvm/BasicBlock.h" class CallInst; diff --git a/include/llvm/Transforms/HoistPHIConstants.h b/include/llvm/Transforms/HoistPHIConstants.h index 931269bc0b1..65bae751a81 100644 --- a/include/llvm/Transforms/HoistPHIConstants.h +++ b/include/llvm/Transforms/HoistPHIConstants.h @@ -9,12 +9,13 @@ #ifndef LLVM_TRANSFORMS_HOISTPHICONSTANTS_H #define LLVM_TRANSFORMS_HOISTPHICONSTANTS_H -#include "llvm/Transforms/Pass.h" +#include "llvm/Pass.h" struct HoistPHIConstants : public Pass { + // doHoistPHIConstants - Hoist constants out of PHI instructions + // static bool doHoistPHIConstants(Method *M); - virtual bool doPerMethodWork(Method *M) { return doHoistPHIConstants(M); } }; diff --git a/include/llvm/Transforms/IPO/ConstantMerge.h b/include/llvm/Transforms/IPO/ConstantMerge.h index e98e375f084..4ebbfd3d930 100644 --- a/include/llvm/Transforms/IPO/ConstantMerge.h +++ b/include/llvm/Transforms/IPO/ConstantMerge.h @@ -17,7 +17,7 @@ #ifndef LLVM_TRANSFORMS_CONSTANTMERGE_H #define LLVM_TRANSFORMS_CONSTANTMERGE_H -#include "llvm/Transforms/Pass.h" +#include "llvm/Pass.h" #include class ConstPoolVal; class GlobalVariable; diff --git a/include/llvm/Transforms/Instrumentation/TraceValues.h b/include/llvm/Transforms/Instrumentation/TraceValues.h index 4f9201b5e8e..d4e2edd5ddd 100644 --- a/include/llvm/Transforms/Instrumentation/TraceValues.h +++ b/include/llvm/Transforms/Instrumentation/TraceValues.h @@ -1,21 +1,14 @@ -// $Id$ -*-c++-*- -//*************************************************************************** -// File: -// TraceValues.h -// -// Purpose: -// Support for inserting LLVM code to print values at basic block -// and method exits. Also exports functions to create a call -// "printf" instruction with one of the signatures listed below. -// -// History: -// 10/11/01 - Vikram Adve - Created -//**************************************************************************/ +//===- llvm/Transforms/Instrumentation/TraceValues.h - Tracing ---*- C++ -*--=// +// +// Support for inserting LLVM code to print values at basic block and method +// exits. +// +//===----------------------------------------------------------------------===// #ifndef LLVM_TRANSFORMS_INSTRUMENTATION_TRACEVALUES_H #define LLVM_TRANSFORMS_INSTRUMENTATION_TRACEVALUES_H -#include "llvm/Transforms/Pass.h" +#include "llvm/Pass.h" class InsertTraceCode : public Pass { bool TraceBasicBlockExits, TraceMethodExits; @@ -30,13 +23,10 @@ public: // // Inserts tracing code for all live values at basic block and/or method exits // as specified by `traceBasicBlockExits' and `traceMethodExits'. - //-------------------------------------------------------------------------- - + // static bool doInsertTraceCode(Method *M, bool traceBasicBlockExits, bool traceMethodExits); - - // doPerMethodWork - This method does the work. Always successful. // bool doPerMethodWork(Method *M) { diff --git a/include/llvm/Transforms/Pass.h b/include/llvm/Transforms/Pass.h deleted file mode 100644 index 259a4326345..00000000000 --- a/include/llvm/Transforms/Pass.h +++ /dev/null @@ -1,126 +0,0 @@ -//===- llvm/Transforms/Pass.h - Base class for XForm Passes ------*- C++ -*--=// -// -// This file defines a marker class that indicates that a specified class is a -// transformation pass implementation. -// -// Pass's are designed this way so that it is possible to apply N passes to a -// module, by first doing N Pass specific initializations for the module, then -// looping over all of the methods in the module, doing method specific work -// N times for each method. Like this: -// -// for_each(Passes.begin(), Passes.end(), doPassInitialization(Module)); -// for_each(Method *M <- Module->begin(), Module->end()) -// for_each(Passes.begin(), Passes.end(), doPerMethodWork(M)); -// -// The other way to do things is like this: -// for_each(Pass *P <- Passes.begin(), Passes.end()) { -// Passes->doPassInitialization(Module) -// for_each(Module->begin(), Module->end(), P->doPerMethodWork); -// } -// -// But this can cause thrashing and poor cache performance, so we don't do it -// that way. -// -// Because a transformation does not see all methods consecutively, it should -// be careful about the state that it maintains... another pass may modify a -// method between two invocatations of doPerMethodWork. -// -// Also, implementations of doMethodWork should not remove any methods from the -// module. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_TRANSFORMS_PASS_H -#define LLVM_TRANSFORMS_PASS_H - -#include "llvm/Module.h" -#include "llvm/Method.h" - -//===----------------------------------------------------------------------===// -// Pass interface - Implemented by all 'passes'. -// -struct Pass { - //===--------------------------------------------------------------------===// - // The externally useful entry points - // - - // runAllPasses - Run a bunch of passes on the specified module, efficiently. - static bool runAllPasses(Module *M, vector &Passes) { - bool MadeChanges = false; - // Run all of the pass initializers - for (unsigned i = 0; i < Passes.size(); ++i) - MadeChanges |= Passes[i]->doPassInitialization(M); - - // Loop over all of the methods, applying all of the passes to them - for (unsigned m = 0; m < M->size(); ++m) - for (unsigned i = 0; i < Passes.size(); ++i) - MadeChanges |= Passes[i]->doPerMethodWork(*(M->begin()+m)); - - // Run all of the pass finalizers... - for (unsigned i = 0; i < Passes.size(); ++i) - MadeChanges |= Passes[i]->doPassFinalization(M); - return MadeChanges; - } - - // runAllPassesAndFree - Run a bunch of passes on the specified module, - // efficiently. When done, delete all of the passes. - // - static bool runAllPassesAndFree(Module *M, vector &Passes) { - // First run all of the passes - bool MadeChanges = runAllPasses(M, Passes); - - // Free all of the passes. - for (unsigned i = 0; i < Passes.size(); ++i) - delete Passes[i]; - return MadeChanges; - } - - - // run(Module*) - Run this pass on a module and all of the methods contained - // within it. Returns true if any of the contained passes returned true. - // - bool run(Module *M) { - bool MadeChanges = doPassInitialization(M); - - // Loop over methods in the module. doPerMethodWork could add a method to - // the Module, so we have to keep checking for end of method list condition. - // - for (unsigned m = 0; m < M->size(); ++m) - MadeChanges |= doPerMethodWork(*(M->begin()+m)); - return MadeChanges | doPassFinalization(M); - } - - // run(Method*) - Run this pass on a module and one specific method. Returns - // false on success. - // - bool run(Method *M) { - return doPassInitialization(M->getParent()) | doPerMethodWork(M) | - doPassFinalization(M->getParent()); - } - - - //===--------------------------------------------------------------------===// - // Functions to be implemented by subclasses - // - - // Destructor - Virtual so we can be subclassed - inline virtual ~Pass() {} - - // doPassInitialization - Virtual method overridden by subclasses to do - // any neccesary per-module initialization. - // - virtual bool doPassInitialization(Module *M) { return false; } - - // doPerMethodWork - Virtual method overriden by subclasses to do the - // per-method processing of the pass. - // - virtual bool doPerMethodWork(Method *M) { return false; } - - // doPassFinalization - Virtual method overriden by subclasses to do any post - // processing needed after all passes have run. - // - virtual bool doPassFinalization(Module *M) { return false; } -}; - -#endif - diff --git a/include/llvm/Transforms/PrintModulePass.h b/include/llvm/Transforms/PrintModulePass.h index 142c2b08d1f..a7a44120768 100644 --- a/include/llvm/Transforms/PrintModulePass.h +++ b/include/llvm/Transforms/PrintModulePass.h @@ -8,7 +8,7 @@ #ifndef LLVM_TRANSFORMS_PRINTMODULE_H #define LLVM_TRANSFORMS_PRINTMODULE_H -#include "llvm/Transforms/Pass.h" +#include "llvm/Pass.h" #include "llvm/Assembly/Writer.h" #include "llvm/Bytecode/Writer.h" @@ -61,6 +61,7 @@ public: bool doPassFinalization(Module *M) { WriteBytecodeToFile(M, *Out); + return false; } }; diff --git a/include/llvm/Transforms/Scalar/ConstantProp.h b/include/llvm/Transforms/Scalar/ConstantProp.h index 918ef07270b..f094ec5496f 100644 --- a/include/llvm/Transforms/Scalar/ConstantProp.h +++ b/include/llvm/Transforms/Scalar/ConstantProp.h @@ -7,7 +7,7 @@ #ifndef LLVM_OPT_CONSTANT_PROPOGATION_H #define LLVM_OPT_CONSTANT_PROPOGATION_H -#include "llvm/Transforms/Pass.h" +#include "llvm/Pass.h" class TerminatorInst; namespace opt { diff --git a/include/llvm/Transforms/Scalar/DCE.h b/include/llvm/Transforms/Scalar/DCE.h index 9a7bd6e77b4..e7a07ec8968 100644 --- a/include/llvm/Transforms/Scalar/DCE.h +++ b/include/llvm/Transforms/Scalar/DCE.h @@ -8,7 +8,7 @@ #ifndef LLVM_OPT_DCE_H #define LLVM_OPT_DCE_H -#include "llvm/Transforms/Pass.h" +#include "llvm/Pass.h" namespace opt { diff --git a/include/llvm/Transforms/Scalar/InductionVars.h b/include/llvm/Transforms/Scalar/InductionVars.h index e0c46d85efa..82ec9fcc75f 100644 --- a/include/llvm/Transforms/Scalar/InductionVars.h +++ b/include/llvm/Transforms/Scalar/InductionVars.h @@ -8,8 +8,7 @@ #ifndef LLVM_OPT_INDUCTION_VARS_H #define LLVM_OPT_INDUCTION_VARS_H -#include "llvm/Transforms/Pass.h" -#include "llvm/Module.h" +#include "llvm/Pass.h" namespace opt { diff --git a/include/llvm/Transforms/Scalar/SymbolStripping.h b/include/llvm/Transforms/Scalar/SymbolStripping.h index a5540f9869f..1feb4381e96 100644 --- a/include/llvm/Transforms/Scalar/SymbolStripping.h +++ b/include/llvm/Transforms/Scalar/SymbolStripping.h @@ -8,9 +8,7 @@ #ifndef LLVM_OPT_SYMBOL_STRIPPING_H #define LLVM_OPT_SYMBOL_STRIPPING_H -class Method; -class Module; -#include "llvm/Transforms/Pass.h" +#include "llvm/Pass.h" namespace opt {