aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/MemRegion.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2009-05-04 06:18:28 +0000
committerTed Kremenek <kremenek@apple.com>2009-05-04 06:18:28 +0000
commitf936f4568700d799e7d92eecef67b0e2b822ae7e (patch)
tree2889e62f46d3d7af329d6e3d25a786b6534340cc /lib/Analysis/MemRegion.cpp
parent0c6db9417dceeb082296c4e097be5de3ee1c5eb7 (diff)
Per conversations with Zhongxing, add an 'element type' to
ElementRegion. I also removed 'ElementRegion::getArrayRegion', although we may need to add this back. This breaks a few test cases with RegionStore: - 'array-struct.c' triggers an infinite recursion in RegionStoreManager. Need to investigate. - misc-ps.m triggers a failure with RegionStoreManager as we now get the diagnostic: 'Line 159: Uninitialized or undefined return value returned to caller.' There were a bunch of places that needed to be edit RegionStoreManager, and we may not be passing all the correct 'element types' down from GRExprEngine. Zhongxing: When you get a chance, could you review this? I could have easily screwed up something basic in RegionStoreManager. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70830 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/MemRegion.cpp')
-rw-r--r--lib/Analysis/MemRegion.cpp25
1 files changed, 8 insertions, 17 deletions
diff --git a/lib/Analysis/MemRegion.cpp b/lib/Analysis/MemRegion.cpp
index 81855ba61b..78cd8146e4 100644
--- a/lib/Analysis/MemRegion.cpp
+++ b/lib/Analysis/MemRegion.cpp
@@ -96,15 +96,17 @@ void SymbolicRegion::Profile(llvm::FoldingSetNodeID& ID) const {
SymbolicRegion::ProfileRegion(ID, sym);
}
-void ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, SVal Idx,
+void ElementRegion::ProfileRegion(llvm::FoldingSetNodeID& ID,
+ QualType ElementType, SVal Idx,
const MemRegion* superRegion) {
ID.AddInteger(MemRegion::ElementRegionKind);
+ ID.Add(ElementType);
ID.AddPointer(superRegion);
Idx.Profile(ID);
}
void ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const {
- ElementRegion::ProfileRegion(ID, Index, superRegion);
+ ElementRegion::ProfileRegion(ID, ElementType, Index, superRegion);
}
void CodeTextRegion::ProfileRegion(llvm::FoldingSetNodeID& ID, const void* data,
@@ -122,18 +124,6 @@ void CodeTextRegion::Profile(llvm::FoldingSetNodeID& ID) const {
// getLValueType() and getRValueType()
//===----------------------------------------------------------------------===//
-QualType ElementRegion::getRValueType(ASTContext& C) const {
- // Strip off typedefs from the ArrayRegion's RvalueType.
- QualType T = getArrayRegion()->getRValueType(C)->getDesugaredType();
-
- if (ArrayType* AT = dyn_cast<ArrayType>(T.getTypePtr()))
- return AT->getElementType();
-
- // If the RValueType of the array region isn't an ArrayType, then essentially
- // the element's
- return T;
-}
-
QualType StringRegion::getRValueType(ASTContext& C) const {
return Str->getType();
}
@@ -313,10 +303,11 @@ MemRegionManager::getCompoundLiteralRegion(const CompoundLiteralExpr* CL) {
}
ElementRegion*
-MemRegionManager::getElementRegion(SVal Idx, const TypedRegion* superRegion){
+MemRegionManager::getElementRegion(QualType elementType, SVal Idx,
+ const TypedRegion* superRegion){
llvm::FoldingSetNodeID ID;
- ElementRegion::ProfileRegion(ID, Idx, superRegion);
+ ElementRegion::ProfileRegion(ID, elementType, Idx, superRegion);
void* InsertPos;
MemRegion* data = Regions.FindNodeOrInsertPos(ID, InsertPos);
@@ -324,7 +315,7 @@ MemRegionManager::getElementRegion(SVal Idx, const TypedRegion* superRegion){
if (!R) {
R = (ElementRegion*) A.Allocate<ElementRegion>();
- new (R) ElementRegion(Idx, superRegion);
+ new (R) ElementRegion(elementType, Idx, superRegion);
Regions.InsertNode(R, InsertPos);
}