#include "Support/TypeInfo.h"
#include <stdio.h>
#include <sys/resource.h>
+#include <sys/time.h>
#include <sys/unistd.h>
#include <set>
+// IncludeFile - Stub function used to help linking out.
+IncludeFile::IncludeFile(void*) {}
+
//===----------------------------------------------------------------------===//
// AnalysisID Class Implementation
//
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)
- std::cerr << " " << Set[i]->getPassName();
+ for (unsigned i = 0; i != Set.size(); ++i) {
+ if (i) std::cerr << ",";
+ std::cerr << " " << Set[i]->getPassName();
+ }
std::cerr << "\n";
}
}
print(std::cerr, 0);
}
+//===----------------------------------------------------------------------===//
+// ImmutablePass Implementation
+//
+void ImmutablePass::addToPassManager(PassManagerT<Module> *PM,
+ AnalysisUsage &AU) {
+ PM->addPass(this, AU);
+}
+
+
//===----------------------------------------------------------------------===//
// FunctionPass Implementation
//
// function.
//
bool BasicBlockPass::runOnFunction(Function &F) {
- bool Changed = false;
+ bool Changed = doInitialization(F);
for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
Changed |= runOnBasicBlock(*I);
- return Changed;
+ return Changed | doFinalization(F);
}
// To run directly on the basic block, we initialize, runOnBasicBlock, then
// finalize.
//
bool BasicBlockPass::run(BasicBlock &BB) {
- Module &M = *BB.getParent()->getParent();
- return doInitialization(M) | runOnBasicBlock(BB) | doFinalization(M);
+ Function &F = *BB.getParent();
+ Module &M = *F.getParent();
+ return doInitialization(M) | doInitialization(F) | runOnBasicBlock(BB) |
+ doFinalization(F) | doFinalization(M);
}
void BasicBlockPass::addToPassManager(PassManagerT<Function> *PM,
const std::type_info *Pass, bool isDefault)
: ImplementationInfo(0), isDefaultImplementation(isDefault) {
- std::cerr << "Registering interface: " << Interface.name() << "\n";
-
InterfaceInfo = const_cast<PassInfo*>(Pass::lookupPassInfo(Interface));
if (InterfaceInfo == 0) { // First reference to Interface, add it now.
InterfaceInfo = // Create the new PassInfo for the interface...
"Trying to join an analysis group that is a normal pass!");
if (Pass) {
- std::cerr << "Registering interface impl: " << Pass->name() << "\n";
-
ImplementationInfo = Pass::lookupPassInfo(*Pass);
assert(ImplementationInfo &&
"Must register pass before adding to AnalysisGroup!");
+ // Make sure we keep track of the fact that the implementation implements
+ // the interface.
+ PassInfo *IIPI = const_cast<PassInfo*>(ImplementationInfo);
+ IIPI->addInterfaceImplemented(InterfaceInfo);
+
// Lazily allocate to avoid nasty initialization order dependencies
if (AnalysisGroupInfoMap == 0)
AnalysisGroupInfoMap = new std::map<const PassInfo *,AnalysisGroupInfo>();
}
-// findAnalysisGroupMember - Return an iterator pointing to one of the elements
-// of Map if there is a pass in Map that is a member of the analysis group for
-// the specified AnalysisGroupID.
-//
-static std::map<const PassInfo*, Pass*>::const_iterator
-findAnalysisGroupMember(const PassInfo *AnalysisGroupID,
- const std::map<const PassInfo*, Pass*> &Map) {
- assert(AnalysisGroupID->getPassType() == PassInfo::AnalysisGroup &&
- "AnalysisGroupID is not an analysis group!");
- assert(AnalysisGroupInfoMap && AnalysisGroupInfoMap->count(AnalysisGroupID) &&
- "Analysis Group does not have any registered members!");
-
- // Get the set of all known implementations of this analysis group...
- std::set<const PassInfo *> &Impls =
- (*AnalysisGroupInfoMap)[AnalysisGroupID].Implementations;
-
- // Scan over available passes, checking to see if any is a valid analysis
- for (std::map<const PassInfo*, Pass*>::const_iterator I = Map.begin(),
- E = Map.end(); I != E; ++I)
- if (Impls.count(I->first)) // This is a valid analysis, return it.
- return I;
-
- return Map.end(); // Nothing of use found.
-}
-
-
-
-
//===----------------------------------------------------------------------===//
// PassRegistrationListener implementation
//