[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