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