* Move some code from Pass.cpp to PassManagerT.h

* Implement stuff so that code can declare that they only depend on the CFG of
  a function, not on anything else.  This speeds up GCCAS a lot.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3155 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2002-07-30 16:27:02 +00:00
parent 5fa829c54a
commit 37d66c4dea
2 changed files with 37 additions and 55 deletions

View File

@ -10,7 +10,6 @@
#include "PassManagerT.h" // PassManagerT implementation
#include "llvm/Module.h"
#include "Support/STLExtras.h"
#include "Support/CommandLine.h"
#include "Support/TypeInfo.h"
#include <typeinfo>
#include <iostream>
@ -21,21 +20,11 @@
// AnalysisID Class Implementation
//
static std::vector<AnalysisID> CFGOnlyAnalyses;
#if 0
// Source of unique analysis ID #'s.
unsigned AnalysisID::NextID = 0;
static std::vector<const PassInfo*> CFGOnlyAnalyses;
AnalysisID::AnalysisID(const AnalysisID &AID, bool DependsOnlyOnCFG) {
ID = AID.ID; // Implement the copy ctor part...
Constructor = AID.Constructor;
// If this analysis only depends on the CFG of the function, add it to the CFG
// only list...
if (DependsOnlyOnCFG)
CFGOnlyAnalyses.push_back(AID);
void RegisterPassBase::setPreservesCFG() {
CFGOnlyAnalyses.push_back(PIObj);
}
#endif
//===----------------------------------------------------------------------===//
// AnalysisResolver Class Implementation
@ -137,33 +126,6 @@ TimingInfo::~TimingInfo() {
}
//===----------------------------------------------------------------------===//
// Pass debugging information. Often it is useful to find out what pass is
// running when a crash occurs in a utility. When this library is compiled with
// debugging on, a command line option (--debug-pass) is enabled that causes the
// pass name to be printed before it executes.
//
// Different debug levels that can be enabled...
enum PassDebugLevel {
None, Structure, Executions, Details
};
static cl::opt<enum PassDebugLevel>
PassDebugging("debug-pass", cl::Hidden,
cl::desc("Print PassManager debugging information"),
cl::values(
clEnumVal(None , "disable debug output"),
// TODO: add option to print out pass names "PassOptions"
clEnumVal(Structure , "print pass structure before run()"),
clEnumVal(Executions, "print pass name before it is executed"),
clEnumVal(Details , "print pass details when it is executed"),
0));
void PMDebug::PrintPassStructure(Pass *P) {
if (PassDebugging >= Structure)
P->dumpPassStructure();
}
void PMDebug::PrintPassInformation(unsigned Depth, const char *Action,
Pass *P, Annotable *V) {
@ -190,22 +152,12 @@ void PMDebug::PrintAnalysisSetInfo(unsigned Depth, const char *Msg,
Pass *P, const std::vector<AnalysisID> &Set){
if (PassDebugging >= Details && !Set.empty()) {
std::cerr << (void*)P << std::string(Depth*2+3, ' ') << Msg << " Analyses:";
for (unsigned i = 0; i != Set.size(); ++i) {
// FIXME: This can use the local pass map!
Pass *P = Set[i]->createPass(); // Good thing this is just debug code...
std::cerr << " " << P->getPassName();
delete P;
}
for (unsigned i = 0; i != Set.size(); ++i)
std::cerr << " " << Set[i]->getPassName();
std::cerr << "\n";
}
}
// dumpPassStructure - Implement the -debug-passes=Structure option
void Pass::dumpPassStructure(unsigned Offset) {
std::cerr << std::string(Offset*2, ' ') << getPassName() << "\n";
}
//===----------------------------------------------------------------------===//
// Pass Implementation
//
@ -214,6 +166,10 @@ void Pass::addToPassManager(PassManagerT<Module> *PM, AnalysisUsage &AU) {
PM->addPass(this, AU);
}
// dumpPassStructure - Implement the -debug-passes=Structure option
void Pass::dumpPassStructure(unsigned Offset) {
std::cerr << std::string(Offset*2, ' ') << getPassName() << "\n";
}
// getPassName - Use C++ RTTI to get a SOMEWHAT intelligable name for the pass.
//

View File

@ -16,10 +16,33 @@
#define LLVM_PASSMANAGER_T_H
#include "llvm/Pass.h"
#include <string>
#include "Support/CommandLine.h"
#include <algorithm>
class Annotable;
//===----------------------------------------------------------------------===//
// Pass debugging information. Often it is useful to find out what pass is
// running when a crash occurs in a utility. When this library is compiled with
// debugging on, a command line option (--debug-pass) is enabled that causes the
// pass name to be printed before it executes.
//
// Different debug levels that can be enabled...
enum PassDebugLevel {
None, Structure, Executions, Details
};
static cl::opt<enum PassDebugLevel>
PassDebugging("debug-pass", cl::Hidden,
cl::desc("Print PassManager debugging information"),
cl::values(
clEnumVal(None , "disable debug output"),
// TODO: add option to print out pass names "PassOptions"
clEnumVal(Structure , "print pass structure before run()"),
clEnumVal(Executions, "print pass name before it is executed"),
clEnumVal(Details , "print pass details when it is executed"),
0));
//===----------------------------------------------------------------------===//
// PMDebug class - a set of debugging functions, that are not to be
// instantiated by the template.
@ -28,7 +51,10 @@ struct PMDebug {
// If compiled in debug mode, these functions can be enabled by setting
// -debug-pass on the command line of the tool being used.
//
static void PrintPassStructure(Pass *P);
static void PrintPassStructure(Pass *P) {
if (PassDebugging >= Structure)
P->dumpPassStructure();
}
static void PrintPassInformation(unsigned,const char*,Pass *, Annotable *);
static void PrintAnalysisSetInfo(unsigned,const char*,Pass *P,
const std::vector<AnalysisID> &);