<br><br><div class="gmail_quote">On Sun, Nov 2, 2008 at 8:34 AM, Ted Kremenek <span dir="ltr"><<a href="mailto:kremenek@apple.com">kremenek@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Author: kremenek<br>
Date: Sat Nov  1 19:34:33 2008<br>
New Revision: 58551<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=58551&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=58551&view=rev</a><br>
Log:<br>
Added AllocaRegion, which represents regions created by calls to alloca().<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h<br>
    cfe/trunk/lib/Analysis/MemRegion.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h?rev=58551&r1=58550&r2=58551&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Analysis/PathSensitive/MemRegion.h?rev=58551&r1=58550&r2=58551&view=diff</a><br>

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

<br>
==============================================================================<br>
--- cfe/trunk/lib/Analysis/MemRegion.cpp (original)<br>
+++ cfe/trunk/lib/Analysis/MemRegion.cpp Sat Nov  1 19:34:33 2008<br>
@@ -33,6 +33,17 @@<br>
   ID.AddPointer(superRegion);<br>
 }<br>
<br>
+void AllocaRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,<br>
+                                 const Expr* Ex, unsigned cnt) {<br>
+  ID.AddInteger((unsigned) AllocaRegionKind);<br>
+  ID.AddPointer(Ex);<br>
+  ID.AddInteger(cnt);<br>
+}</blockquote><div><br>Do we need to include the superRegion in the profile?<br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><br>

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