summaryrefslogtreecommitdiffstats
path: root/clang/lib/Analysis
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-06-22 23:13:13 +0000
committerTed Kremenek <kremenek@apple.com>2009-06-22 23:13:13 +0000
commite5e8b0b09be51823393f3986dcc79b0f5c4a5831 (patch)
treec3a67c8581dbc46514017719bb4e44de6003576f /clang/lib/Analysis
parent975ce637db60bed08c0bd6805f92465b6b5f1a66 (diff)
downloadbcm5719-llvm-e5e8b0b09be51823393f3986dcc79b0f5c4a5831.tar.gz
bcm5719-llvm-e5e8b0b09be51823393f3986dcc79b0f5c4a5831.zip
Refactor some of the logic in MemRegionManager for constructing regions using
member template functions and traits. The idea is to allow MemRegionManager to construct subclasses of MemRegion that aren't declared in MemRegion.h (e.g., checker-specific regions). llvm-svn: 73917
Diffstat (limited to 'clang/lib/Analysis')
-rw-r--r--clang/lib/Analysis/MemRegion.cpp85
1 files changed, 15 insertions, 70 deletions
diff --git a/clang/lib/Analysis/MemRegion.cpp b/clang/lib/Analysis/MemRegion.cpp
index 9e11a263536..68804b141b8 100644
--- a/clang/lib/Analysis/MemRegion.cpp
+++ b/clang/lib/Analysis/MemRegion.cpp
@@ -18,6 +18,9 @@
using namespace clang;
+//===----------------------------------------------------------------------===//
+// Basic methods.
+//===----------------------------------------------------------------------===//
MemRegion::~MemRegion() {}
@@ -87,13 +90,15 @@ void DeclRegion::Profile(llvm::FoldingSetNodeID& ID) const {
DeclRegion::ProfileRegion(ID, D, superRegion, getKind());
}
-void SymbolicRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym) {
+void SymbolicRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SymbolRef sym,
+ const MemRegion *sreg) {
ID.AddInteger((unsigned) MemRegion::SymbolicRegionKind);
ID.Add(sym);
+ ID.AddPointer(sreg);
}
void SymbolicRegion::Profile(llvm::FoldingSetNodeID& ID) const {
- SymbolicRegion::ProfileRegion(ID, sym);
+ SymbolicRegion::ProfileRegion(ID, sym, getSuperRegion());
}
void ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
@@ -230,68 +235,21 @@ bool MemRegionManager::onHeap(const MemRegion* R) {
return (R != 0) && (R == heap);
}
-StringRegion* MemRegionManager::getStringRegion(const StringLiteral* Str) {
- llvm::FoldingSetNodeID ID;
- MemSpaceRegion* GlobalsR = getGlobalsRegion();
-
- StringRegion::ProfileRegion(ID, Str, GlobalsR);
-
- void* InsertPos;
- MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
- StringRegion* R = cast_or_null<StringRegion>(data);
-
- if (!R) {
- R = (StringRegion*) A.Allocate<StringRegion>();
- new (R) StringRegion(Str, GlobalsR);
- Regions.InsertNode(R, InsertPos);
- }
+//===----------------------------------------------------------------------===//
+// Constructing regions.
+//===----------------------------------------------------------------------===//
- return R;
+StringRegion* MemRegionManager::getStringRegion(const StringLiteral* Str) {
+ return getRegion<StringRegion>(Str);
}
VarRegion* MemRegionManager::getVarRegion(const VarDecl* d) {
-
- const MemRegion* superRegion = d->hasLocalStorage() ? getStackRegion()
- : getGlobalsRegion();
-
- llvm::FoldingSetNodeID ID;
- DeclRegion::ProfileRegion(ID, d, superRegion, MemRegion::VarRegionKind);
-
- void* InsertPos;
- MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
- VarRegion* R = cast_or_null<VarRegion>(data);
-
- if (!R) {
- R = (VarRegion*) A.Allocate<VarRegion>();
- new (R) VarRegion(d, superRegion);
- Regions.InsertNode(R, InsertPos);
- }
-
- return R;
+ return getRegion<VarRegion>(d);
}
CompoundLiteralRegion*
MemRegionManager::getCompoundLiteralRegion(const CompoundLiteralExpr* CL) {
- // Is this compound literal allocated on the stack or is part of the
- // global constant pool?
- const MemRegion* superRegion = CL->isFileScope() ?
- getGlobalsRegion() : getStackRegion();
-
- // Profile the compound literal.
- llvm::FoldingSetNodeID ID;
- CompoundLiteralRegion::ProfileRegion(ID, CL, superRegion);
-
- void* InsertPos;
- MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
- CompoundLiteralRegion* R = cast_or_null<CompoundLiteralRegion>(data);
-
- if (!R) {
- R = (CompoundLiteralRegion*) A.Allocate<CompoundLiteralRegion>();
- new (R) CompoundLiteralRegion(CL, superRegion);
- Regions.InsertNode(R, InsertPos);
- }
-
- return R;
+ return getRegion<CompoundLiteralRegion>(CL);
}
ElementRegion*
@@ -351,20 +309,7 @@ CodeTextRegion* MemRegionManager::getCodeTextRegion(SymbolRef sym, QualType t) {
/// getSymbolicRegion - Retrieve or create a "symbolic" memory region.
SymbolicRegion* MemRegionManager::getSymbolicRegion(SymbolRef sym) {
- llvm::FoldingSetNodeID ID;
- SymbolicRegion::ProfileRegion(ID, sym);
- void* InsertPos;
- MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
- SymbolicRegion* R = cast_or_null<SymbolicRegion>(data);
-
- if (!R) {
- R = (SymbolicRegion*) A.Allocate<SymbolicRegion>();
- // SymbolicRegion's storage class is usually unknown.
- new (R) SymbolicRegion(sym, getUnknownRegion());
- Regions.InsertNode(R, InsertPos);
- }
-
- return R;
+ return getRegion<SymbolicRegion>(sym);
}
FieldRegion* MemRegionManager::getFieldRegion(const FieldDecl* d,
OpenPOWER on IntegriCloud