blob: 7385cf5f004d22941bf82f4dd970e0cfd63e7764 [file] [log] [blame]
//===- ConstraintGeneration.h - ----------------------------------------------//
//
// 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.
//
//===----------------------------------------------------------------------===//
//
// Note: This code assumes that ABCPreprocess is run before.
//
//===----------------------------------------------------------------------===//
#ifndef CONSTRAINT_GENERATION
#define CONSTRAINT_GENERATION
#include "llvm/Instruction.h"
#include "llvm/Function.h"
#include "AffineExpressions.h"
#include "BottomUpCallGraph.h"
namespace llvm {
ModulePass *createConstraintGenerationPass();
namespace ABC {
struct ConstraintGeneration : public ModulePass {
public :
static char ID;
ConstraintGeneration () : ModulePass ((intptr_t) &ID) {}
const char *getPassName() const { return "Interprocedural Constraint Generation"; }
virtual bool runOnModule(Module &M);
std::vector<Instruction*> UnsafeGetElemPtrs;
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<DataLayout>();
AU.addRequired<EQTDDataStructures>();
AU.addRequired<BottomUpCallGraph>();
AU.setPreservesAll();
}
private :
EQTDDataStructures *cbudsPass;
BottomUpCallGraph *buCG;
typedef std::map<const Function *,FuncLocalInfo*> InfoMap;
//This is required for getting the names/unique identifiers for variables.
Mangler *Mang;
//for storing local information about a function
InfoMap fMap;
//Known Func Database
std::set<string> KnownFuncDB;
//for storing what control dependent blocks are already dealt with for the current
//array access
std::set<BasicBlock *> DoneList;
//Initializes the KnownFuncDB
void initialize(Module &M);
//This function collects from the branch which controls the current block
//the Successor tells the path
void addBranchConstraints(BranchInst *BI, BasicBlock *Successor, ABCExprTree **rootp);
//This method adds constraints for known trusted functions
ABCExprTree* addConstraintsForKnownFunctions(Function *kf, CallInst *CI);
//Interface for getting constraints for a particular value
void getConstraintsInternal( Value *v, ABCExprTree **rootp);
//adds all the conditions on which the currentblock is control dependent on.
void addControlDependentConditions(BasicBlock *currentBlock, ABCExprTree **rootp);
//Gives the return value constraints interms of its arguments
ABCExprTree* getReturnValueConstraints(Function *f);
void getConstraintsAtCallSite(CallInst *CI,ABCExprTree **rootp);
void addFormalToActual(Function *f, CallInst *CI, ABCExprTree **rootp);
//Get the constraints on the arguments
//This goes and looks at all call sites and ors the corresponding
//constraints
ABCExprTree* getArgumentConstraints(Function &F);
//for simplifying the constraints
LinearExpr* SimplifyExpression( Value *Expr, ABCExprTree **rootp);
string getValueName(const Value *V);
void generateArrayTypeConstraintsGlobal(string var, const ArrayType *T, ABCExprTree **rootp, unsigned int numElem);
void generateArrayTypeConstraints(string var, const ArrayType *T, ABCExprTree **rootp);
public:
void getConstraints( Value *v, ABCExprTree **rootp);
};
}
}
#endif