[cfe-commits] r58551 - in /cfe/trunk: include/clang/Analysis/PathSensitive/MemRegion.h lib/Analysis/MemRegion.cpp

Zhongxing Xu xuzhongxing at gmail.com
Fri Nov 14 03:54:36 PST 2008


On Sun, Nov 2, 2008 at 8:34 AM, Ted Kremenek <kremenek at apple.com> wrote:

> Author: kremenek
> Date: Sat Nov  1 19:34:33 2008
> New Revision: 58551
>
> URL: http://llvm.org/viewvc/llvm-project?rev=58551&view=rev
> Log:
> Added AllocaRegion, which represents regions created by calls to alloca().
>
> Modified:
>    cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h
>    cfe/trunk/lib/Analysis/MemRegion.cpp
>
> Modified: cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h?rev=58551&r1=58550&r2=58551&view=diff
>
>
> ==============================================================================
> --- cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h (original)
> +++ cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h Sat Nov  1
> 19:34:33 2008
> @@ -37,6 +37,7 @@
>  class MemRegion : public llvm::FoldingSetNode {
>  public:
>   enum Kind { MemSpaceRegionKind, SymbolicRegionKind,
> +              AllocaRegionKind,
>               // Typed regions.
>               BEG_TYPED_REGIONS,
>                CompoundLiteralRegionKind,
> @@ -101,6 +102,34 @@
>   }
>  };
>
> +/// AllocaRegion - A region that represents an untyped blob of bytes
> created
> +///  by a call to 'alloca'.
> +class AllocaRegion : public SubRegion {
> +  friend class MemRegionManager;
> +protected:
> +  unsigned Cnt; // Block counter.  Used to distinguish different pieces of
> +                // memory allocated by alloca at the same call site.
> +  const Expr* Ex;
> +
> +  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion* superRegion)
> +    : SubRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
> +
> +public:
> +
> +  const Expr* getExpr() const { return Ex; }
> +
> +  void Profile(llvm::FoldingSetNodeID& ID) const;
> +
> +  static void ProfileRegion(llvm::FoldingSetNodeID& ID, const Expr* Ex,
> +                            unsigned Cnt);
> +
> +  void print(llvm::raw_ostream& os) const;
> +
> +  static bool classof(const MemRegion* R) {
> +    return R->getKind() == AllocaRegionKind;
> +  }
> +};
> +
>  /// SymbolicRegion - A special, "non-concrete" region. Unlike other region
>  ///  clases, SymbolicRegion represents a region that serves as an alias
> for
>  ///  either a real region, a NULL pointer, etc.  It essentially is used to
> @@ -430,6 +459,9 @@
>     return R == globals;
>   }
>
> +  /// getAllocaRegion - Retrieve a region associated with a call to
> alloca().
> +  AllocaRegion* getAllocaRegion(const Expr* Ex, unsigned Cnt);
> +
>   /// getCompoundLiteralRegion - Retrieve the region associated with a
>   ///  given CompoundLiteral.
>   CompoundLiteralRegion*
>
> Modified: cfe/trunk/lib/Analysis/MemRegion.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/MemRegion.cpp?rev=58551&r1=58550&r2=58551&view=diff
>
>
> ==============================================================================
> --- cfe/trunk/lib/Analysis/MemRegion.cpp (original)
> +++ cfe/trunk/lib/Analysis/MemRegion.cpp Sat Nov  1 19:34:33 2008
> @@ -33,6 +33,17 @@
>   ID.AddPointer(superRegion);
>  }
>
> +void AllocaRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
> +                                 const Expr* Ex, unsigned cnt) {
> +  ID.AddInteger((unsigned) AllocaRegionKind);
> +  ID.AddPointer(Ex);
> +  ID.AddInteger(cnt);
> +}


Do we need to include the superRegion in the profile?


>
> +
> +void AllocaRegion::Profile(llvm::FoldingSetNodeID& ID) const {
> +  ProfileRegion(ID, Ex, Cnt);
> +}
> +
>  void AnonTypedRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, QualType
> T,
>                                     const MemRegion* superRegion) {
>   ID.AddInteger((unsigned) AnonTypedRegionKind);
> @@ -117,6 +128,10 @@
>   os << "<Unknown Region>";
>  }
>
> +void AllocaRegion::print(llvm::raw_ostream& os) const {
> +  os << "alloca{" << (void*) Ex << ',' << Cnt << '}';
> +}
> +
>  void VarRegion::print(llvm::raw_ostream& os) const {
>   os << cast<VarDecl>(D)->getName();
>  }
> @@ -350,13 +365,31 @@
>   return R;
>  }
>
> +AllocaRegion* MemRegionManager::getAllocaRegion(const Expr* E, unsigned
> cnt) {
> +  llvm::FoldingSetNodeID ID;
> +  AllocaRegion::ProfileRegion(ID, E, cnt);
> +
> +  void* InsertPos;
> +  MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
> +  AllocaRegion* R = cast_or_null<AllocaRegion>(data);
> +
> +  if (!R) {
> +    R = (AllocaRegion*) A.Allocate<AllocaRegion>();
> +    new (R) AllocaRegion(E, cnt, getStackRegion());
> +    Regions.InsertNode(R, InsertPos);
> +  }
> +
> +  return R;
> +}
> +
>  bool MemRegionManager::hasStackStorage(const MemRegion* R) {
> -  const SubRegion* SR = dyn_cast<SubRegion>(R);
>
>   // Only subregions can have stack storage.
> +  const SubRegion* SR = dyn_cast<SubRegion>(R);
> +
>   if (!SR)
>     return false;
> -
> +
>   MemSpaceRegion* S = getStackRegion();
>
>   while (SR) {
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20081114/f1a40326/attachment.html>


More information about the cfe-commits mailing list