SimpleConstraintManager.h revision 243830
1218887Sdim//== SimpleConstraintManager.h ----------------------------------*- C++ -*--==// 2218887Sdim// 3218887Sdim// The LLVM Compiler Infrastructure 4218887Sdim// 5218887Sdim// This file is distributed under the University of Illinois Open Source 6218887Sdim// License. See LICENSE.TXT for details. 7218887Sdim// 8218887Sdim//===----------------------------------------------------------------------===// 9218887Sdim// 10218887Sdim// Code shared between BasicConstraintManager and RangeConstraintManager. 11218887Sdim// 12218887Sdim//===----------------------------------------------------------------------===// 13218887Sdim 14218887Sdim#ifndef LLVM_CLANG_GR_SIMPLE_CONSTRAINT_MANAGER_H 15218887Sdim#define LLVM_CLANG_GR_SIMPLE_CONSTRAINT_MANAGER_H 16218887Sdim 17218887Sdim#include "clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h" 18226633Sdim#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h" 19218887Sdim 20218887Sdimnamespace clang { 21218887Sdim 22218887Sdimnamespace ento { 23218887Sdim 24218887Sdimclass SimpleConstraintManager : public ConstraintManager { 25243830Sdim SubEngine *SU; 26239462Sdim BasicValueFactory &BVF; 27218887Sdimpublic: 28243830Sdim SimpleConstraintManager(SubEngine *subengine, BasicValueFactory &BV) 29239462Sdim : SU(subengine), BVF(BV) {} 30218887Sdim virtual ~SimpleConstraintManager(); 31218887Sdim 32218887Sdim //===------------------------------------------------------------------===// 33218887Sdim // Common implementation for the interface provided by ConstraintManager. 34218887Sdim //===------------------------------------------------------------------===// 35218887Sdim 36234353Sdim ProgramStateRef assume(ProgramStateRef state, DefinedSVal Cond, 37218887Sdim bool Assumption); 38218887Sdim 39234353Sdim ProgramStateRef assume(ProgramStateRef state, Loc Cond, bool Assumption); 40218887Sdim 41234353Sdim ProgramStateRef assume(ProgramStateRef state, NonLoc Cond, bool Assumption); 42218887Sdim 43234353Sdim ProgramStateRef assumeSymRel(ProgramStateRef state, 44218887Sdim const SymExpr *LHS, 45218887Sdim BinaryOperator::Opcode op, 46218887Sdim const llvm::APSInt& Int); 47218887Sdim 48218887Sdimprotected: 49218887Sdim 50218887Sdim //===------------------------------------------------------------------===// 51218887Sdim // Interface that subclasses must implement. 52218887Sdim //===------------------------------------------------------------------===// 53218887Sdim 54218887Sdim // Each of these is of the form "$sym+Adj <> V", where "<>" is the comparison 55218887Sdim // operation for the method being invoked. 56234353Sdim virtual ProgramStateRef assumeSymNE(ProgramStateRef state, SymbolRef sym, 57218887Sdim const llvm::APSInt& V, 58218887Sdim const llvm::APSInt& Adjustment) = 0; 59218887Sdim 60234353Sdim virtual ProgramStateRef assumeSymEQ(ProgramStateRef state, SymbolRef sym, 61218887Sdim const llvm::APSInt& V, 62218887Sdim const llvm::APSInt& Adjustment) = 0; 63218887Sdim 64234353Sdim virtual ProgramStateRef assumeSymLT(ProgramStateRef state, SymbolRef sym, 65218887Sdim const llvm::APSInt& V, 66218887Sdim const llvm::APSInt& Adjustment) = 0; 67218887Sdim 68234353Sdim virtual ProgramStateRef assumeSymGT(ProgramStateRef state, SymbolRef sym, 69218887Sdim const llvm::APSInt& V, 70218887Sdim const llvm::APSInt& Adjustment) = 0; 71218887Sdim 72234353Sdim virtual ProgramStateRef assumeSymLE(ProgramStateRef state, SymbolRef sym, 73218887Sdim const llvm::APSInt& V, 74218887Sdim const llvm::APSInt& Adjustment) = 0; 75218887Sdim 76234353Sdim virtual ProgramStateRef assumeSymGE(ProgramStateRef state, SymbolRef sym, 77218887Sdim const llvm::APSInt& V, 78218887Sdim const llvm::APSInt& Adjustment) = 0; 79218887Sdim 80218887Sdim //===------------------------------------------------------------------===// 81218887Sdim // Internal implementation. 82218887Sdim //===------------------------------------------------------------------===// 83218887Sdim 84239462Sdim BasicValueFactory &getBasicVals() const { return BVF; } 85239462Sdim 86234353Sdim bool canReasonAbout(SVal X) const; 87218887Sdim 88234353Sdim ProgramStateRef assumeAux(ProgramStateRef state, 89234353Sdim Loc Cond, 90234353Sdim bool Assumption); 91234353Sdim 92234353Sdim ProgramStateRef assumeAux(ProgramStateRef state, 93234353Sdim NonLoc Cond, 94234353Sdim bool Assumption); 95234353Sdim 96234353Sdim ProgramStateRef assumeAuxForSymbol(ProgramStateRef State, 97234353Sdim SymbolRef Sym, 98234353Sdim bool Assumption); 99218887Sdim}; 100218887Sdim 101218887Sdim} // end GR namespace 102218887Sdim 103218887Sdim} // end clang namespace 104218887Sdim 105218887Sdim#endif 106