blob: 5bf7563dface450d4d4c16ce65f4bb8607170b3a [file] [log] [blame]
//===- ABCPreProcess.cpp - Array Bounds Checking (Omega) ---------------- --////
// The SAFECode Compiler
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This pass was an old hack in the LLVM 1.x days; it grabbed information from
// function passes and placed the information into global variables so that it
// could be used by ModulePass's later on.
//
// LLVM 2.x and latet allow a ModulePass to require a FunctionPass, so most of
// this functionality has been removed. The loop induction variable code still
// remains, however.
//
//===----------------------------------------------------------------------===//
#include "llvm/Pass.h"
#include "llvm/Module.h"
#include "llvm/Function.h"
#include "llvm/BasicBlock.h"
#include "ABCPreProcess.h"
#include "llvm/Support/InstIterator.h"
#include "llvm/Instruction.h"
#include "llvm/Constants.h"
using namespace llvm;
NAMESPACE_SC_BEGIN
char ABCPreProcess::ID = 0;
IndVarMap indMap;
void ABCPreProcess::print(ostream &out, const Module * M) const {
out << " Printing phi nodes which are induction variables ... \n";
IndVarMap::iterator ivCurrent = indMap.begin(), ivEnd = indMap.end();
for (; ivCurrent != ivEnd; ++ivCurrent) {
out << ivCurrent->first;
}
out << " Printing induction variables done ... \n";
}
void ABCPreProcess::indVariables(Loop *L) {
PHINode *PN = L->getCanonicalInductionVariable();
Value *V = L->getTripCount();
if (PN && V) {
indMap[PN] = V;
}
for (Loop::iterator I = L->begin(), E= L->end(); I!= E; ++I) {
indVariables(*I);
}
}
bool ABCPreProcess::runOnFunction(Function &F) {
LoopInfo &LI = getAnalysis<LoopInfo>();
for (LoopInfo::iterator I = LI.begin(), E = LI.end(); I != E; ++I) {
Loop *L = *I;
indVariables(L);
}
return false;
}
static RegisterPass<ABCPreProcess> Y("abcpre",
"Array Bounds Checking Pre-process pass");
Pass *createABCPreProcessPass() { return new ABCPreProcess(); }
NAMESPACE_SC_END