blob: 278399bb901e2b991dfdf5fa68d20ef1807a1815 [file] [log] [blame]
//===- llvm/ArrayBoundChecks/AffineExpressions.h - Expression Analysis Utils ---*- C++ -*--=//
//
// This file defines a package of expression analysis utilties:
//
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_C_EXPRESSIONS_H
#define LLVM_C_EXPRESSIONS_H
#include <assert.h>
#include <map>
#include <list>
#include <string>
#include "llvm/Instruction.h"
#include "llvm/Instructions.h"
#include "llvm/InstrTypes.h"
#include "llvm/Constants.h"
#include "llvm/Analysis/PostDominators.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/Mangler.h"
#include "llvm/DerivedTypes.h"
using namespace std;
namespace llvm {
namespace cfg { class LoopInfo; }
typedef std::map<const PHINode *, Value *> IndVarMap;
typedef std::map<const Function *,BasicBlock *> ExitNodeMap;
typedef std::map<const Function *, PostDominanceFrontier *> PostDominanceFrontierMap;
typedef std::map<const Value*,int> CoefficientMap;
typedef std::map<const Value*,string> ValStringMap;
typedef std::list<const Value*> VarList;
typedef std::list<const Value*>::const_iterator VarListIt;
typedef std::list<const CallInst*> CallInstList;
typedef std::list<const CallInst*>::const_iterator CallInstListIt;
typedef std::map<Instruction*, bool> MemAccessInstListType;
typedef std::map<Instruction*, bool>::const_iterator MemAccessInstListIt;
// LinearExpr - Represent an expression of the form CONST*VAR1+CONST*VAR2+ .....
// or simpler.
class LinearExpr {
int offSet;
VarList* vList;
CoefficientMap* cMap;
ValStringMap* vsMap;
public:
enum ExpressionType {
Linear, // Expr is linear
Unknown
} exprTy;
inline int getOffSet() { return offSet; };
inline void setOffSet(int offset) { offSet = offset; };
inline ExpressionType getExprType() { return exprTy; };
inline VarList* getVarList() { return vList; };
inline CoefficientMap* getCMap() { return cMap; };
inline ValStringMap* getVSMap() { return vsMap; };
LinearExpr(const Value *Val,Mangler *Mang); // Create a linear expression
void negate();
void addLinearExpr(LinearExpr *);
LinearExpr * mulLinearExpr(LinearExpr *);
void mulByConstant(int);
void print(ostream &out);
void printOmegaSymbols(ostream &out);
};
class Constraint {
string var;
LinearExpr *le;
string rel; // can be < , >, <=, >= for now
bool leConstant_; //is the left value constant
public :
Constraint(string v, LinearExpr *l, string r, bool leConstant = false ) {
assert(l != 0 && "the rhs for this constraint is null");
var = v;
le = l;
rel = r;
leConstant_ = leConstant;
}
void print(ostream &out);
void printOmegaSymbols(ostream &out);
};
//This holds a set of ABCExprs
class ABCExprTree {
Constraint *constraint;
ABCExprTree *right;
ABCExprTree *left;
string logOp; // can be && or || or
public:
ABCExprTree(Constraint *c) {
constraint = c;
left = 0;
right = 0;
logOp = "&&";
};
ABCExprTree(ABCExprTree *l, ABCExprTree *r, string op) {
constraint = 0;
// r->dump();
assert( l && " l is null \n");
assert( r && " r is null \n");
left = l;
right = r;
logOp = op;
}
void dump();
void print(ostream &out);
void printOmegaSymbols(ostream &out);
};
typedef std::map<const Value *, ABCExprTree *> InstConstraintMapType;
//This holds the local information of a function
class FuncLocalInfo {
//Local cache for constraints
InstConstraintMapType FuncLocalConstraints;
//Storing all constraints which need proving
InstConstraintMapType FuncSafetyConstraints;
//All array accesses in a function
MemAccessInstListType maiList;
//This stores the Or of the arguments at
//various call sites, so that can be computed only once for
//different array accesses.
ABCExprTree *argConstraints;
public :
FuncLocalInfo() {
argConstraints = 0;
}
inline void addMemAccessInst(Instruction *MAI, bool reqArg) {
maiList[MAI] = reqArg;
}
inline void addLocalConstraint(const Value *v, ABCExprTree *aet) {
FuncLocalConstraints[v] = aet;
}
inline bool inLocalConstraints(const Value *v) {
return (FuncLocalConstraints.count(v) > 0);
}
inline ABCExprTree * getLocalConstraint(const Value *v) {
if (FuncLocalConstraints.count(v)) return FuncLocalConstraints[v];
else return 0;
}
inline void addSafetyConstraint(const Value *v, ABCExprTree *aet) {
FuncSafetyConstraints[v] = aet;
}
inline ABCExprTree* getSafetyConstraint(const Value *v) {
return (FuncSafetyConstraints[v]);
}
inline MemAccessInstListType getMemAccessInstList() {
return maiList;
}
inline void addArgumentConstraints(ABCExprTree *aet) {
argConstraints = aet;
}
inline ABCExprTree * getArgumentConstraints() {
return argConstraints;
}
};
// We dont want identifier names with ., space, - in them.
// So we replace them with _
static inline string makeNameProper(string x) {
string tmp;
int len = 0;
for (string::iterator sI = x.begin(), sEnd = x.end(); sI != sEnd; sI++) {
if (len > 18) return tmp; //have to do something more meaningful
len++;
switch (*sI) {
case '.': tmp += "d_"; len++;break;
case ' ': tmp += "s_"; len++;break;
case '-': tmp += "D_"; len++;break;
case '_': tmp += "l_"; len++;break;
default: tmp += *sI;
}
}
if (tmp == "in") return "in__1";
return tmp;
}
/*
static string getValueNames(const Value *V, Mangler *Mang) {
if (const Constant *CPI = dyn_cast<Constant>(V)) {
if (const ConstantSInt *CPI = dyn_cast<ConstantSInt>(V)) {
return itostr(CPI->getValue());
} else if (const ConstantUInt *CPI = dyn_cast<ConstantUInt>(V)) {
return utostr(CPI->getValue());
}
}
if (V->hasName()) {
return makeNameProper(V->getName());
}
else {
return Mang->getValueName(V);
}
};
*/
}
#endif