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