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

Zhongxing Xu xuzhongxing at gmail.com
Wed Nov 12 23:31:02 PST 2008


Author: zhongxingxu
Date: Thu Nov 13 01:30:58 2008
New Revision: 59229

URL: http://llvm.org/viewvc/llvm-project?rev=59229&view=rev
Log:
Change AllocaRegion to subclass TypedRegion. We need to know ElementRegion's
type when assigning to it.

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=59229&r1=59228&r2=59229&view=diff

==============================================================================
--- cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h (original)
+++ cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h Thu Nov 13 01:30:58 2008
@@ -37,9 +37,9 @@
 class MemRegion : public llvm::FoldingSetNode {
 public:
   enum Kind { MemSpaceRegionKind, SymbolicRegionKind,
-              AllocaRegionKind,
               // Typed regions.
               BEG_TYPED_REGIONS,
+               AllocaRegionKind,
                CompoundLiteralRegionKind,
                StringRegionKind, ElementRegionKind,
                // Decl Regions.
@@ -102,34 +102,6 @@
   }
 };
   
-/// 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
@@ -170,6 +142,42 @@
   }
 };
 
+/// AllocaRegion - A region that represents an untyped blob of bytes created
+///  by a call to 'alloca'.
+class AllocaRegion : public TypedRegion {
+  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;
+
+  QualType T;
+
+  AllocaRegion(const Expr* ex, unsigned cnt, const MemRegion* superRegion)
+    : TypedRegion(superRegion, AllocaRegionKind), Cnt(cnt), Ex(ex) {}
+  
+public:
+  
+  const Expr* getExpr() const { return Ex; }
+
+  void setType(QualType t) { T = t; }
+
+  QualType getType(ASTContext& C) const {
+    return C.getCanonicalType(T);
+  }
+
+  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;
+  }
+};    
+
 /// StringRegion - Region associated with a StringLiteral.
 class StringRegion : public TypedRegion {
   friend class MemRegionManager;

Modified: cfe/trunk/lib/Analysis/MemRegion.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/MemRegion.cpp?rev=59229&r1=59228&r2=59229&view=diff

==============================================================================
--- cfe/trunk/lib/Analysis/MemRegion.cpp (original)
+++ cfe/trunk/lib/Analysis/MemRegion.cpp Thu Nov 13 01:30:58 2008
@@ -105,8 +105,18 @@
 
 QualType ElementRegion::getType(ASTContext& C) const {
   QualType T = cast<TypedRegion>(superRegion)->getType(C);
-  ArrayType* AT = cast<ArrayType>(T.getTypePtr());
-  return AT->getElementType();
+
+  if (isa<ArrayType>(T.getTypePtr())) {
+    ArrayType* AT = cast<ArrayType>(T.getTypePtr());
+    return AT->getElementType();
+  }
+  else if (isa<AllocaRegion>(superRegion)) {
+    PointerType* PtrT = cast<PointerType>(T.getTypePtr());
+    QualType PTy = PtrT->getPointeeType();
+    return C.getCanonicalType(PTy);
+  }
+  else
+    assert(0 && "SuperRegion type unsupported.");
 }
 
 //===----------------------------------------------------------------------===//





More information about the cfe-commits mailing list