blob: 9e2f925459436a917ee542c6bcebc2446677931a [file] [log] [blame]
//===- Caching.cpp: -------------------------------------------------------===//
//
// 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.
//
//===----------------------------------------------------------------------===//
//
//===----------------------------------------------------------------------===//
#include <set>
#include <map>
#include "llvm/Module.h"
#include "llvm/Pass.h"
#include "llvm/Instructions.h"
using namespace llvm;
namespace {
class PoolCaching : public ModulePass {
std::map<Value*, Value*> PoolSources;
std::set<Value*> Pools;
void findPools(Module& M) {
for (Module::iterator MI = M.begin(), ME = M.end(); MI != ME; ++MI)
if (!MI->isDeclaration())
for (Function::iterator FI = MI->begin(), FE = MI->end(); FI != FE; ++FI)
for (BasicBlock::iterator BI = FI->begin(), BE = FI->end(); BI != BE; ++BI)
if (CallInst* CI = dyn_cast<CallInst>(BI))
if (Function* F = dyn_cast<Function>(CI->getOperand(0))) {
if (F->getName() == "__sc_par_poolcheck") {
Pools.insert(CI->getOperand(1));
} else if (F->getName() == "__sc_par_boundscheck") {
Pools.insert(CI->getOperand(1));
} else if (F->getName() == "__sc_par_poolinit") {
Pools.insert(CI->getOperand(1));
}
}
}
void findPoolSources() {
unsigned numPools;
do {
numPools = Pools.size();
for (std::set<Value*>::iterator ii = Pools.begin(); ii != Pools.end(); ++ii) {
(*ii)->dump();
}
} while (numPools != Pools.size());
}
public:
static char ID;
PoolCaching() : ModulePass((intptr_t)&ID) {}
bool runOnModule(Module& M) {
findPools(M);
findPoolSources();
return true;
}
};
}
char PoolCaching::ID = 0;
static RegisterPass<PoolCaching> X
("sc-par-poolcache", "Use Checking Thread caches");