]> CyberLeo.Net >> Repos - FreeBSD/releng/9.0.git/blob - contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/SimpleConstraintManager.h
Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
[FreeBSD/releng/9.0.git] / contrib / llvm / tools / clang / lib / StaticAnalyzer / Core / SimpleConstraintManager.h
1 //== SimpleConstraintManager.h ----------------------------------*- C++ -*--==//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  Code shared between BasicConstraintManager and RangeConstraintManager.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_CLANG_GR_SIMPLE_CONSTRAINT_MANAGER_H
15 #define LLVM_CLANG_GR_SIMPLE_CONSTRAINT_MANAGER_H
16
17 #include "clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h"
18 #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
19
20 namespace clang {
21
22 namespace ento {
23
24 class SimpleConstraintManager : public ConstraintManager {
25   SubEngine &SU;
26 public:
27   SimpleConstraintManager(SubEngine &subengine) : SU(subengine) {}
28   virtual ~SimpleConstraintManager();
29
30   //===------------------------------------------------------------------===//
31   // Common implementation for the interface provided by ConstraintManager.
32   //===------------------------------------------------------------------===//
33
34   bool canReasonAbout(SVal X) const;
35
36   const ProgramState *assume(const ProgramState *state, DefinedSVal Cond,
37                         bool Assumption);
38
39   const ProgramState *assume(const ProgramState *state, Loc Cond, bool Assumption);
40
41   const ProgramState *assume(const ProgramState *state, NonLoc Cond, bool Assumption);
42
43   const ProgramState *assumeSymRel(const ProgramState *state,
44                               const SymExpr *LHS,
45                               BinaryOperator::Opcode op,
46                               const llvm::APSInt& Int);
47
48 protected:
49
50   //===------------------------------------------------------------------===//
51   // Interface that subclasses must implement.
52   //===------------------------------------------------------------------===//
53
54   // Each of these is of the form "$sym+Adj <> V", where "<>" is the comparison
55   // operation for the method being invoked.
56   virtual const ProgramState *assumeSymNE(const ProgramState *state, SymbolRef sym,
57                                      const llvm::APSInt& V,
58                                      const llvm::APSInt& Adjustment) = 0;
59
60   virtual const ProgramState *assumeSymEQ(const ProgramState *state, SymbolRef sym,
61                                      const llvm::APSInt& V,
62                                      const llvm::APSInt& Adjustment) = 0;
63
64   virtual const ProgramState *assumeSymLT(const ProgramState *state, SymbolRef sym,
65                                      const llvm::APSInt& V,
66                                      const llvm::APSInt& Adjustment) = 0;
67
68   virtual const ProgramState *assumeSymGT(const ProgramState *state, SymbolRef sym,
69                                      const llvm::APSInt& V,
70                                      const llvm::APSInt& Adjustment) = 0;
71
72   virtual const ProgramState *assumeSymLE(const ProgramState *state, SymbolRef sym,
73                                      const llvm::APSInt& V,
74                                      const llvm::APSInt& Adjustment) = 0;
75
76   virtual const ProgramState *assumeSymGE(const ProgramState *state, SymbolRef sym,
77                                      const llvm::APSInt& V,
78                                      const llvm::APSInt& Adjustment) = 0;
79
80   //===------------------------------------------------------------------===//
81   // Internal implementation.
82   //===------------------------------------------------------------------===//
83
84   const ProgramState *assumeAux(const ProgramState *state, Loc Cond,bool Assumption);
85
86   const ProgramState *assumeAux(const ProgramState *state, NonLoc Cond, bool Assumption);
87 };
88
89 } // end GR namespace
90
91 } // end clang namespace
92
93 #endif