aboutsummaryrefslogtreecommitdiff
path: root/include/clang/Analysis/PathSensitive/SValuator.h
blob: 5a6e6945e7cee9693e7a6f31dab7e416971d7233 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// SValuator.h - Construction of SVals from evaluating expressions -*- C++ -*---
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//  This file defines SValuator, a class that defines the interface for
//  "symbolical evaluators" which construct an SVal from an expression.
//  
//===----------------------------------------------------------------------===//

#ifndef LLVM_CLANG_ANALYSIS_SVALUATOR
#define LLVM_CLANG_ANALYSIS_SVALUATOR

#include "clang/AST/Expr.h"
#include "clang/Analysis/PathSensitive/SVals.h"

namespace clang {

class GRState;
class ValueManager;

class SValuator {
  friend class ValueManager;
protected:
  ValueManager &ValMgr;

  virtual SVal EvalCastNL(NonLoc val, QualType castTy) = 0;  
  
  virtual SVal EvalCastL(Loc val, QualType castTy) = 0;

public:
  SValuator(ValueManager &valMgr) : ValMgr(valMgr) {}
  virtual ~SValuator() {}
  
  class CastResult : public std::pair<const GRState *, SVal> {
  public:
    const GRState *getState() const { return first; }
    SVal getSVal() const { return second; }
    CastResult(const GRState *s, SVal v)
      : std::pair<const GRState*, SVal>(s, v) {}
  };
  
  CastResult EvalCast(SVal val, const GRState *state,
                      QualType castTy, QualType originalType);
  
  virtual SVal EvalMinus(NonLoc val) = 0;
  
  virtual SVal EvalComplement(NonLoc val) = 0;

  virtual SVal EvalBinOpNN(BinaryOperator::Opcode Op, NonLoc lhs,
                           NonLoc rhs, QualType resultTy) = 0;

  virtual SVal EvalBinOpLL(BinaryOperator::Opcode Op, Loc lhs, Loc rhs,
                           QualType resultTy) = 0;

  virtual SVal EvalBinOpLN(const GRState *state, BinaryOperator::Opcode Op,
                           Loc lhs, NonLoc rhs, QualType resultTy) = 0;  
};
  
SValuator* CreateSimpleSValuator(ValueManager &valMgr);
  
} // end clang namespace
#endif