blob: e63fa93e3a8547be3b92348aad3d854736607c58 [file] [log] [blame]
//===- StackSafety.h - ------------------------------------*- C++ -*---------=//
//
// 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 file defines checks for stack safety.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_STACKSAFETY_H
#define LLVM_STACKSAFETY_H
#include "safecode/PoolHandles.h"
#include "dsa/DataStructure.h"
#include "dsa/DSGraph.h"
#include "dsa/DSNode.h"
#include "llvm/Pass.h"
#include <set>
namespace llvm {
ModulePass* createStackSafetyPass();
namespace CSS {
struct checkStackSafety : public ModulePass {
public :
static char ID;
checkStackSafety() : ModulePass ((intptr_t) &ID) {}
std::set<DSNode *> AllocaNodes;
const char *getPassName() const { return "Stack Safety Check";}
virtual bool runOnModule(Module &M);
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<DataLayout>();
AU.addRequired<EQTDDataStructures>();
AU.setPreservesAll();
}
//
// Method: releaseMemory()
//
// Description:
// This method frees memory used by the pass; it should be called by the
// PassManager before the pass's analysis results are invalidated.
//
virtual void releaseMemory () {
// Clear the set of nodes
AllocaNodes.clear();
// Clear the set of reachable nodes; this may have items from the last
// execution lying around.
reachableAllocaNodes.clear();
}
private :
//
// Tracks the DSNodes that have already been analyzed by an invocation of
// markReachableAllocas().
//
std::set<DSNode *> reachableAllocaNodes;
bool markReachableAllocas(DSNode *DSN, bool start=false);
bool markReachableAllocasInt(DSNode *DSN, bool start=false);
};
}
}
#endif