]> granicus.if.org Git - clang/commitdiff
Change AllocaRegion to subclass TypedRegion. We need to know ElementRegion's
authorZhongxing Xu <xuzhongxing@gmail.com>
Thu, 13 Nov 2008 07:30:58 +0000 (07:30 +0000)
committerZhongxing Xu <xuzhongxing@gmail.com>
Thu, 13 Nov 2008 07:30:58 +0000 (07:30 +0000)
type when assigning to it.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@59229 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/PathSensitive/MemRegion.h
lib/Analysis/MemRegion.cpp

index 04d904623e2b0d9cb261ffb295041c6282cb5f3f..2de2a3ed14a8f21e813d90db87d6e1e07071c743 100644 (file)
@@ -37,9 +37,9 @@ class MemRegionManager;
 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 @@ public:
   }
 };
   
-/// 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 @@ public:
   }
 };
 
+/// 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;
index ae575f116469e0ac89d4278dac8d1d315a1d06a3..a292d98e60525b6c5b9137e07e881a7a74e97ff9 100644 (file)
@@ -105,8 +105,18 @@ void ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const {
 
 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.");
 }
 
 //===----------------------------------------------------------------------===//