diff options
Diffstat (limited to 'lib/Analysis/Store.cpp')
| -rw-r--r-- | lib/Analysis/Store.cpp | 43 | 
1 files changed, 23 insertions, 20 deletions
diff --git a/lib/Analysis/Store.cpp b/lib/Analysis/Store.cpp index 8d911b844fc0..1724a9250c25 100644 --- a/lib/Analysis/Store.cpp +++ b/lib/Analysis/Store.cpp @@ -13,6 +13,7 @@  #include "clang/Analysis/PathSensitive/Store.h"  #include "clang/Analysis/PathSensitive/GRState.h" +#include "clang/AST/CharUnits.h"  using namespace clang; @@ -77,6 +78,7 @@ const MemRegion *StoreManager::CastRegion(const MemRegion *R, QualType CastToTy)    // Process region cast according to the kind of the region being cast.    switch (R->getKind()) { +    case MemRegion::CXXThisRegionKind:      case MemRegion::GenericMemSpaceRegionKind:      case MemRegion::StackLocalsSpaceRegionKind:      case MemRegion::StackArgumentsSpaceRegionKind: @@ -137,9 +139,9 @@ const MemRegion *StoreManager::CastRegion(const MemRegion *R, QualType CastToTy)        if (!baseR)          return NULL; -      int64_t off = rawOff.getByteOffset(); +      CharUnits off = CharUnits::fromQuantity(rawOff.getByteOffset()); -      if (off == 0) { +      if (off.isZero()) {          // Edge case: we are at 0 bytes off the beginning of baseR.  We          // check to see if type we are casting to is the same as the base          // region.  If so, just return the base region. @@ -167,7 +169,7 @@ const MemRegion *StoreManager::CastRegion(const MemRegion *R, QualType CastToTy)        // We can only compute sizeof(PointeeTy) if it is a complete type.        if (IsCompleteType(Ctx, PointeeTy)) {          // Compute the size in **bytes**. -        int64_t pointeeTySize = (int64_t) (Ctx.getTypeSize(PointeeTy) / 8); +        CharUnits pointeeTySize = Ctx.getTypeSizeInChars(PointeeTy);          // Is the offset a multiple of the size?  If so, we can layer the          // ElementRegion (with elementType == PointeeTy) directly on top of @@ -181,7 +183,7 @@ const MemRegion *StoreManager::CastRegion(const MemRegion *R, QualType CastToTy)        if (!newSuperR) {          // Create an intermediate ElementRegion to represent the raw byte.          // This will be the super region of the final ElementRegion. -        newSuperR = MakeElementRegion(baseR, Ctx.CharTy, off); +        newSuperR = MakeElementRegion(baseR, Ctx.CharTy, off.getQuantity());        }        return MakeElementRegion(newSuperR, PointeeTy, newIndex); @@ -196,23 +198,29 @@ const MemRegion *StoreManager::CastRegion(const MemRegion *R, QualType CastToTy)  /// CastRetrievedVal - Used by subclasses of StoreManager to implement  ///  implicit casts that arise from loads from regions that are reinterpreted  ///  as another region. -SVal  StoreManager::CastRetrievedVal(SVal V, const TypedRegion *R, -                                     QualType castTy) { +SVal StoreManager::CastRetrievedVal(SVal V, const TypedRegion *R, +                                    QualType castTy, bool performTestOnly) { -#ifndef NDEBUG    if (castTy.isNull())      return V;    ASTContext &Ctx = ValMgr.getContext(); -  QualType T = R->getValueType(Ctx); - -  // Automatically translate references to pointers. -  if (const ReferenceType *RT = T->getAs<ReferenceType>()) -    T = Ctx.getPointerType(RT->getPointeeType()); - -  assert(ValMgr.getContext().hasSameUnqualifiedType(castTy, T)); -#endif +  if (performTestOnly) {   +    // Automatically translate references to pointers. +    QualType T = R->getValueType(Ctx); +    if (const ReferenceType *RT = T->getAs<ReferenceType>()) +      T = Ctx.getPointerType(RT->getPointeeType()); +     +    assert(ValMgr.getContext().hasSameUnqualifiedType(castTy, T)); +    return V; +  } +   +  if (const Loc *L = dyn_cast<Loc>(&V)) +    return ValMgr.getSValuator().EvalCastL(*L, castTy); +  else if (const NonLoc *NL = dyn_cast<NonLoc>(&V)) +    return ValMgr.getSValuator().EvalCastNL(*NL, castTy); +      return V;  } @@ -240,8 +248,3 @@ SVal StoreManager::getLValueCompoundLiteral(const CompoundLiteralExpr* CL,                                              const LocationContext *LC) {    return loc::MemRegionVal(MRMgr.getCompoundLiteralRegion(CL, LC));  } - -Loc StoreManager::getThisObject(QualType T) { -  const CXXObjectRegion *R = MRMgr.getCXXObjectRegion(T); -  return loc::MemRegionVal(R); -}  | 
