SimpleConstraintManager.h revision 218893
1139749Simp//== SimpleConstraintManager.h ----------------------------------*- C++ -*--==// 291398Stmm// 391398Stmm// The LLVM Compiler Infrastructure 491398Stmm// 591398Stmm// This file is distributed under the University of Illinois Open Source 691398Stmm// License. See LICENSE.TXT for details. 791398Stmm// 891398Stmm//===----------------------------------------------------------------------===// 991398Stmm// 1091398Stmm// Code shared between BasicConstraintManager and RangeConstraintManager. 1191398Stmm// 1291398Stmm//===----------------------------------------------------------------------===// 1391398Stmm 1491398Stmm#ifndef LLVM_CLANG_GR_SIMPLE_CONSTRAINT_MANAGER_H 1591398Stmm#define LLVM_CLANG_GR_SIMPLE_CONSTRAINT_MANAGER_H 1691398Stmm 1791398Stmm#include "clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h" 1891398Stmm#include "clang/StaticAnalyzer/Core/PathSensitive/GRState.h" 1991398Stmm 2091398Stmmnamespace clang { 2191398Stmm 2291398Stmmnamespace ento { 2391398Stmm 2491398Stmmclass SimpleConstraintManager : public ConstraintManager { 2591398Stmm SubEngine &SU; 2691398Stmmpublic: 27177560Smarius SimpleConstraintManager(SubEngine &subengine) : SU(subengine) {} 2891398Stmm virtual ~SimpleConstraintManager(); 2991398Stmm 3091398Stmm //===------------------------------------------------------------------===// 3191398Stmm // Common implementation for the interface provided by ConstraintManager. 3291398Stmm //===------------------------------------------------------------------===// 3391398Stmm 3491398Stmm bool canReasonAbout(SVal X) const; 35194763Smarius 3691398Stmm const GRState *assume(const GRState *state, DefinedSVal Cond, 37177560Smarius bool Assumption); 38223944Smarius 39177560Smarius const GRState *assume(const GRState *state, Loc Cond, bool Assumption); 40177560Smarius 41177560Smarius const GRState *assume(const GRState *state, NonLoc Cond, bool Assumption); 4291398Stmm 4391398Stmm const GRState *assumeSymRel(const GRState *state, 4491398Stmm const SymExpr *LHS, 45174987Smarius BinaryOperator::Opcode op, 4691398Stmm const llvm::APSInt& Int); 4791398Stmm 4891398Stmmprotected: 49177560Smarius 5091398Stmm //===------------------------------------------------------------------===// 51194763Smarius // Interface that subclasses must implement. 52194763Smarius //===------------------------------------------------------------------===// 5391398Stmm 5491398Stmm // Each of these is of the form "$sym+Adj <> V", where "<>" is the comparison 55194763Smarius // operation for the method being invoked. 56194763Smarius virtual const GRState *assumeSymNE(const GRState *state, SymbolRef sym, 57194763Smarius const llvm::APSInt& V, 58194763Smarius const llvm::APSInt& Adjustment) = 0; 59172334Smarius 60194763Smarius virtual const GRState *assumeSymEQ(const GRState *state, SymbolRef sym, 61172334Smarius const llvm::APSInt& V, 62172334Smarius const llvm::APSInt& Adjustment) = 0; 63194763Smarius 6491398Stmm virtual const GRState *assumeSymLT(const GRState *state, SymbolRef sym, 6591398Stmm const llvm::APSInt& V, 6691398Stmm const llvm::APSInt& Adjustment) = 0; 6791398Stmm 6891398Stmm virtual const GRState *assumeSymGT(const GRState *state, SymbolRef sym, 69194763Smarius const llvm::APSInt& V, 70194763Smarius const llvm::APSInt& Adjustment) = 0; 7191398Stmm 72172334Smarius virtual const GRState *assumeSymLE(const GRState *state, SymbolRef sym, 73174987Smarius const llvm::APSInt& V, 74172334Smarius const llvm::APSInt& Adjustment) = 0; 75172334Smarius 76194763Smarius virtual const GRState *assumeSymGE(const GRState *state, SymbolRef sym, 77194763Smarius const llvm::APSInt& V, 78194763Smarius const llvm::APSInt& Adjustment) = 0; 79194763Smarius 80194763Smarius //===------------------------------------------------------------------===// 81194763Smarius // Internal implementation. 82194763Smarius //===------------------------------------------------------------------===// 83194763Smarius 84194763Smarius const GRState *assumeAux(const GRState *state, Loc Cond,bool Assumption); 85194763Smarius 86194763Smarius const GRState *assumeAux(const GRState *state, NonLoc Cond, bool Assumption); 87194763Smarius}; 88194763Smarius 89172334Smarius} // end GR namespace 9091398Stmm 9191398Stmm} // end clang namespace 92172334Smarius 93172334Smarius#endif 9491398Stmm