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