1366982aa941f949a0770d714de0de4d104f436bcTed Kremenek// BlkExprDeclBitVector.h - Dataflow types for Bitvector Analysis --*- C++ --*--
2aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek//
3aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek//                     The LLVM Compiler Infrastructure
4aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
7aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek//
8aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek//===----------------------------------------------------------------------===//
9aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek//
10aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek// This file provides definition of dataflow types used by analyses such
11aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek// as LiveVariables and UninitializedValues.  The underlying dataflow values
12aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek// are implemented as bitvectors, but the definitions in this file include
13aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek// the necessary boilerplate to use with our dataflow framework.
14aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek//
15aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek//===----------------------------------------------------------------------===//
16aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek
17366982aa941f949a0770d714de0de4d104f436bcTed Kremenek#ifndef LLVM_CLANG_STMTDECLBVDVAL_H
18366982aa941f949a0770d714de0de4d104f436bcTed Kremenek#define LLVM_CLANG_STMTDECLBVDVAL_H
19aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek
20e41611aa2237d06a0ef61db4528fb2883a8defcdTed Kremenek#include "clang/Analysis/CFG.h"
214afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor#include "clang/AST/Decl.h" // for Decl* -> NamedDecl* conversion
22aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek#include "llvm/ADT/BitVector.h"
23aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek#include "llvm/ADT/DenseMap.h"
24aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek
25aead1539e7481fde73725d8eadeea82087982bf3Ted Kremeneknamespace clang {
261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
27366982aa941f949a0770d714de0de4d104f436bcTed Kremenek  class Stmt;
28e0dbda136444b2f3550a421f4436d438230c732fTed Kremenek  class ASTContext;
298e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor
30ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenekstruct DeclBitVector_Types {
311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
327cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek  class Idx {
337cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek    unsigned I;
347cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek  public:
35259dfdc79126a957e56e55e3e3788031b99be12fChris Lattner    explicit Idx(unsigned i) : I(i) {}
36259dfdc79126a957e56e55e3e3788031b99be12fChris Lattner    Idx() : I(~0U) {}
371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
387cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek    bool isValid() const {
397cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek      return I != ~0U;
407cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek    }
417cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek    operator unsigned() const {
427cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek      assert (isValid());
437cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek      return I;
447cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek    }
451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  };
461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
47aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  //===--------------------------------------------------------------------===//
48aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  // AnalysisDataTy - Whole-function meta data.
49aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  //===--------------------------------------------------------------------===//
501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
51aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  class AnalysisDataTy {
52cb152a7e8718324ef7c2f2f01c18049319078041Ted Kremenek  public:
538e9bebdea69c590dedfbf27374114cb76fe12fbdDouglas Gregor    typedef llvm::DenseMap<const NamedDecl*, unsigned > DMapTy;
54cb152a7e8718324ef7c2f2f01c18049319078041Ted Kremenek    typedef DMapTy::const_iterator decl_iterator;
551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
56cb152a7e8718324ef7c2f2f01c18049319078041Ted Kremenek  protected:
571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    DMapTy DMap;
58aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    unsigned NDecls;
591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
60aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  public:
611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
62ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    AnalysisDataTy() : NDecls(0) {}
63aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    virtual ~AnalysisDataTy() {}
641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
659c378f705405d37f49795d5e915989de774fe11fTed Kremenek    bool isTracked(const NamedDecl *SD) { return DMap.find(SD) != DMap.end(); }
661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
679c378f705405d37f49795d5e915989de774fe11fTed Kremenek    Idx getIdx(const NamedDecl *SD) const {
68aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek      DMapTy::const_iterator I = DMap.find(SD);
697cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek      return I == DMap.end() ? Idx() : Idx(I->second);
70aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    }
71ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek
72aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    unsigned getNumDecls() const { return NDecls; }
731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
749c378f705405d37f49795d5e915989de774fe11fTed Kremenek    void Register(const NamedDecl *SD) {
75aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek      if (!isTracked(SD)) DMap[SD] = NDecls++;
76aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    }
77ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek
78cb152a7e8718324ef7c2f2f01c18049319078041Ted Kremenek    decl_iterator begin_decl() const { return DMap.begin(); }
79cb152a7e8718324ef7c2f2f01c18049319078041Ted Kremenek    decl_iterator end_decl() const { return DMap.end(); }
80aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  };
811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
82aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  //===--------------------------------------------------------------------===//
83aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  // ValTy - Dataflow value.
84aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  //===--------------------------------------------------------------------===//
851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
86aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  class ValTy {
87aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    llvm::BitVector DeclBV;
88aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  public:
891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
907fdee87c203f8e9b6feed63e85256a8f8bc2bbc0Ted Kremenek    void resetDeclValues(AnalysisDataTy& AD) {
911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      DeclBV.resize(AD.getNumDecls());
92aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek      DeclBV.reset();
93aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    }
947fdee87c203f8e9b6feed63e85256a8f8bc2bbc0Ted Kremenek
957fdee87c203f8e9b6feed63e85256a8f8bc2bbc0Ted Kremenek    void setDeclValues(AnalysisDataTy& AD) {
961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      DeclBV.resize(AD.getNumDecls());
977fdee87c203f8e9b6feed63e85256a8f8bc2bbc0Ted Kremenek      DeclBV.set();
987fdee87c203f8e9b6feed63e85256a8f8bc2bbc0Ted Kremenek    }
991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1007fdee87c203f8e9b6feed63e85256a8f8bc2bbc0Ted Kremenek    void resetValues(AnalysisDataTy& AD) {
1017fdee87c203f8e9b6feed63e85256a8f8bc2bbc0Ted Kremenek      resetDeclValues(AD);
1021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
1031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    bool operator==(const ValTy& RHS) const {
105aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek      assert (sizesEqual(RHS));
106ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      return DeclBV == RHS.DeclBV;
107aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    }
1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
109ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    void copyValues(const ValTy& RHS) { DeclBV = RHS.DeclBV; }
1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1117cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek    llvm::BitVector::reference getBit(unsigned i) {
1127cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek      return DeclBV[i];
1137cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek    }
1141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
115e0def7589a8afa8a6acef13476bb3f882c104b91Chris Lattner    bool getBit(unsigned i) const {
1167cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek      return DeclBV[i];
1177cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek    }
1181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
119aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    llvm::BitVector::reference
1209c378f705405d37f49795d5e915989de774fe11fTed Kremenek    operator()(const NamedDecl *ND, const AnalysisDataTy& AD) {
1214afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor      return getBit(AD.getIdx(ND));
122aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    }
1237cb15939e08ea31f0fadcd24c974dbc9e4b61c01Ted Kremenek
1249c378f705405d37f49795d5e915989de774fe11fTed Kremenek    bool operator()(const NamedDecl *ND, const AnalysisDataTy& AD) const {
1254afa39deaa245592977136d367251ee2c173dd8dDouglas Gregor      return getBit(AD.getIdx(ND));
126aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    }
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1281eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    llvm::BitVector::reference getDeclBit(unsigned i) { return DeclBV[i]; }
129ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    const llvm::BitVector::reference getDeclBit(unsigned i) const {
130ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      return const_cast<llvm::BitVector&>(DeclBV)[i];
131ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    }
1321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
133ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    ValTy& operator|=(const ValTy& RHS) {
134ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      assert (sizesEqual(RHS));
135ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      DeclBV |= RHS.DeclBV;
136ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      return *this;
137ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    }
1381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
139ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    ValTy& operator&=(const ValTy& RHS) {
140ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      assert (sizesEqual(RHS));
141ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      DeclBV &= RHS.DeclBV;
142ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      return *this;
143ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    }
1441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
145fa59f1f053235e9adf32425f2b6049185771246dTed Kremenek    ValTy& OrDeclBits(const ValTy& RHS) {
146fa59f1f053235e9adf32425f2b6049185771246dTed Kremenek      return operator|=(RHS);
147fa59f1f053235e9adf32425f2b6049185771246dTed Kremenek    }
1481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
149fa59f1f053235e9adf32425f2b6049185771246dTed Kremenek    ValTy& AndDeclBits(const ValTy& RHS) {
150fa59f1f053235e9adf32425f2b6049185771246dTed Kremenek      return operator&=(RHS);
151fa59f1f053235e9adf32425f2b6049185771246dTed Kremenek    }
1521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
153ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    bool sizesEqual(const ValTy& RHS) const {
154ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      return DeclBV.size() == RHS.DeclBV.size();
155ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    }
156ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  };
1571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
158ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  //===--------------------------------------------------------------------===//
159ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  // Some useful merge operations.
160ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  //===--------------------------------------------------------------------===//
1611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
162ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  struct Union { void operator()(ValTy& Dst, ValTy& Src) { Dst |= Src; } };
163ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  struct Intersect { void operator()(ValTy& Dst, ValTy& Src) { Dst &= Src; } };
164ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek};
165ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek
166ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek
167366982aa941f949a0770d714de0de4d104f436bcTed Kremenekstruct StmtDeclBitVector_Types {
1681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
169ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  //===--------------------------------------------------------------------===//
170ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  // AnalysisDataTy - Whole-function meta data.
171ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  //===--------------------------------------------------------------------===//
172ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek
173ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  class AnalysisDataTy : public DeclBitVector_Types::AnalysisDataTy {
1749c378f705405d37f49795d5e915989de774fe11fTed Kremenek    ASTContext *ctx;
17511e7218db51efc825ec24e80d5b071892ca268bdTed Kremenek    CFG* cfg;
176ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  public:
177e0dbda136444b2f3550a421f4436d438230c732fTed Kremenek    AnalysisDataTy() : ctx(0), cfg(0) {}
178ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    virtual ~AnalysisDataTy() {}
17911e7218db51efc825ec24e80d5b071892ca268bdTed Kremenek
1809c378f705405d37f49795d5e915989de774fe11fTed Kremenek    void setContext(ASTContext &c) { ctx = &c; }
1819c378f705405d37f49795d5e915989de774fe11fTed Kremenek    ASTContext &getContext() {
1821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      assert(ctx && "ASTContext should not be NULL.");
183e0dbda136444b2f3550a421f4436d438230c732fTed Kremenek      return *ctx;
184e0dbda136444b2f3550a421f4436d438230c732fTed Kremenek    }
185e0dbda136444b2f3550a421f4436d438230c732fTed Kremenek
186e0dbda136444b2f3550a421f4436d438230c732fTed Kremenek    void setCFG(CFG& c) { cfg = &c; }
18711e7218db51efc825ec24e80d5b071892ca268bdTed Kremenek    CFG& getCFG() { assert(cfg && "CFG should not be NULL."); return *cfg; }
1881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
1899c378f705405d37f49795d5e915989de774fe11fTed Kremenek    bool isTracked(const Stmt *S) { return cfg->isBlkExpr(S); }
190ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    using DeclBitVector_Types::AnalysisDataTy::isTracked;
191ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek
1929c378f705405d37f49795d5e915989de774fe11fTed Kremenek    unsigned getIdx(const Stmt *S) const {
19386946745225096243f6969dc745267b78fc211a6Ted Kremenek      CFG::BlkExprNumTy I = cfg->getBlkExprNum(S);
194366982aa941f949a0770d714de0de4d104f436bcTed Kremenek      assert(I && "Stmtession not tracked for bitvector.");
19511e7218db51efc825ec24e80d5b071892ca268bdTed Kremenek      return I;
19611e7218db51efc825ec24e80d5b071892ca268bdTed Kremenek    }
197ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    using DeclBitVector_Types::AnalysisDataTy::getIdx;
1981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
199366982aa941f949a0770d714de0de4d104f436bcTed Kremenek    unsigned getNumBlkExprs() const { return cfg->getNumBlkExprs(); }
200ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  };
201ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek
202ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  //===--------------------------------------------------------------------===//
203ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  // ValTy - Dataflow value.
204ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  //===--------------------------------------------------------------------===//
205ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek
206ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  class ValTy : public DeclBitVector_Types::ValTy {
207366982aa941f949a0770d714de0de4d104f436bcTed Kremenek    llvm::BitVector BlkExprBV;
208ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    typedef DeclBitVector_Types::ValTy ParentTy;
2091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
210ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    static inline ParentTy& ParentRef(ValTy& X) {
211ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      return static_cast<ParentTy&>(X);
212ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    }
2131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
214ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    static inline const ParentTy& ParentRef(const ValTy& X) {
215ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      return static_cast<const ParentTy&>(X);
216ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    }
2171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
218ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek  public:
219bf98c99600017bfcdde2a7966c47a6beb15a96dcTed Kremenek
220366982aa941f949a0770d714de0de4d104f436bcTed Kremenek    void resetBlkExprValues(AnalysisDataTy& AD) {
221366982aa941f949a0770d714de0de4d104f436bcTed Kremenek      BlkExprBV.resize(AD.getNumBlkExprs());
222366982aa941f949a0770d714de0de4d104f436bcTed Kremenek      BlkExprBV.reset();
223ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    }
2241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
225366982aa941f949a0770d714de0de4d104f436bcTed Kremenek    void setBlkExprValues(AnalysisDataTy& AD) {
226366982aa941f949a0770d714de0de4d104f436bcTed Kremenek      BlkExprBV.resize(AD.getNumBlkExprs());
227366982aa941f949a0770d714de0de4d104f436bcTed Kremenek      BlkExprBV.set();
2287fdee87c203f8e9b6feed63e85256a8f8bc2bbc0Ted Kremenek    }
2291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2307fdee87c203f8e9b6feed63e85256a8f8bc2bbc0Ted Kremenek    void resetValues(AnalysisDataTy& AD) {
2317fdee87c203f8e9b6feed63e85256a8f8bc2bbc0Ted Kremenek      resetDeclValues(AD);
232366982aa941f949a0770d714de0de4d104f436bcTed Kremenek      resetBlkExprValues(AD);
2337fdee87c203f8e9b6feed63e85256a8f8bc2bbc0Ted Kremenek    }
2341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
235bf98c99600017bfcdde2a7966c47a6beb15a96dcTed Kremenek    void setValues(AnalysisDataTy& AD) {
236bf98c99600017bfcdde2a7966c47a6beb15a96dcTed Kremenek      setDeclValues(AD);
237bf98c99600017bfcdde2a7966c47a6beb15a96dcTed Kremenek      setBlkExprValues(AD);
238bf98c99600017bfcdde2a7966c47a6beb15a96dcTed Kremenek    }
2391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    bool operator==(const ValTy& RHS) const {
2411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return ParentRef(*this) == ParentRef(RHS)
242366982aa941f949a0770d714de0de4d104f436bcTed Kremenek          && BlkExprBV == RHS.BlkExprBV;
243ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    }
2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
245ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    void copyValues(const ValTy& RHS) {
246ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      ParentRef(*this).copyValues(ParentRef(RHS));
247366982aa941f949a0770d714de0de4d104f436bcTed Kremenek      BlkExprBV = RHS.BlkExprBV;
248ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    }
2491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
250aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    llvm::BitVector::reference
2519c378f705405d37f49795d5e915989de774fe11fTed Kremenek    operator()(const Stmt *S, const AnalysisDataTy& AD) {
2521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return BlkExprBV[AD.getIdx(S)];
2531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    }
254aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    const llvm::BitVector::reference
2559c378f705405d37f49795d5e915989de774fe11fTed Kremenek    operator()(const Stmt *S, const AnalysisDataTy& AD) const {
25686946745225096243f6969dc745267b78fc211a6Ted Kremenek      return const_cast<ValTy&>(*this)(S,AD);
257aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    }
2581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
259ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek    using DeclBitVector_Types::ValTy::operator();
260ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek
2611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
2621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    llvm::BitVector::reference getStmtBit(unsigned i) { return BlkExprBV[i]; }
263366982aa941f949a0770d714de0de4d104f436bcTed Kremenek    const llvm::BitVector::reference getStmtBit(unsigned i) const {
264366982aa941f949a0770d714de0de4d104f436bcTed Kremenek      return const_cast<llvm::BitVector&>(BlkExprBV)[i];
265cb152a7e8718324ef7c2f2f01c18049319078041Ted Kremenek    }
2661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
267366982aa941f949a0770d714de0de4d104f436bcTed Kremenek    ValTy& OrBlkExprBits(const ValTy& RHS) {
268366982aa941f949a0770d714de0de4d104f436bcTed Kremenek      BlkExprBV |= RHS.BlkExprBV;
269fa59f1f053235e9adf32425f2b6049185771246dTed Kremenek      return *this;
270fa59f1f053235e9adf32425f2b6049185771246dTed Kremenek    }
2711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
272366982aa941f949a0770d714de0de4d104f436bcTed Kremenek    ValTy& AndBlkExprBits(const ValTy& RHS) {
273366982aa941f949a0770d714de0de4d104f436bcTed Kremenek      BlkExprBV &= RHS.BlkExprBV;
274fa59f1f053235e9adf32425f2b6049185771246dTed Kremenek      return *this;
275fa59f1f053235e9adf32425f2b6049185771246dTed Kremenek    }
2761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
277aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    ValTy& operator|=(const ValTy& RHS) {
278aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek      assert (sizesEqual(RHS));
279ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      ParentRef(*this) |= ParentRef(RHS);
280366982aa941f949a0770d714de0de4d104f436bcTed Kremenek      BlkExprBV |= RHS.BlkExprBV;
281aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek      return *this;
282aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    }
2831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
284aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    ValTy& operator&=(const ValTy& RHS) {
285aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek      assert (sizesEqual(RHS));
286ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      ParentRef(*this) &= ParentRef(RHS);
287366982aa941f949a0770d714de0de4d104f436bcTed Kremenek      BlkExprBV &= RHS.BlkExprBV;
288aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek      return *this;
289aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    }
2901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
291aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    bool sizesEqual(const ValTy& RHS) const {
292ca64cef65c2fcc3d22908b121bc101993604c286Ted Kremenek      return ParentRef(*this).sizesEqual(ParentRef(RHS))
293366982aa941f949a0770d714de0de4d104f436bcTed Kremenek          && BlkExprBV.size() == RHS.BlkExprBV.size();
294aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek    }
295aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  };
2961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
297aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  //===--------------------------------------------------------------------===//
298aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  // Some useful merge operations.
299aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  //===--------------------------------------------------------------------===//
3001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
301aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  struct Union { void operator()(ValTy& Dst, ValTy& Src) { Dst |= Src; } };
302aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek  struct Intersect { void operator()(ValTy& Dst, ValTy& Src) { Dst &= Src; } };
3031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
304aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek};
305aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek} // end namespace clang
306aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek
307aead1539e7481fde73725d8eadeea82087982bf3Ted Kremenek#endif
308