diff options
author | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-02-05 06:57:29 +0000 |
---|---|---|
committer | Zhongxing Xu <xuzhongxing@gmail.com> | 2009-02-05 06:57:29 +0000 |
commit | 026c66395b88a09437319139a43b090093f7e1dd (patch) | |
tree | 7955f6fdf8c03de8d27a80ed0adf8d2e898e3e84 /lib/Analysis/MemRegion.cpp | |
parent | cf70177a9cf6c35b27e73cf58f82dd4d6b0fa354 (diff) |
Make SymbolicRegion subclass TypedRegion, for symbols usually have types, so
do the symblic regions associated with them and we need them to be typed.
Current SymbolicRegion::getRValueType() method is very restricting. It may be
modified when we are more clear about what could be the types of symblic
regions.
BasicConstraintManager::Assume() is changed due to that now SymblicRegion is a
subclass of SubRegion.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63844 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/MemRegion.cpp')
-rw-r--r-- | lib/Analysis/MemRegion.cpp | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/lib/Analysis/MemRegion.cpp b/lib/Analysis/MemRegion.cpp index 82f4423541..e41c5f937b 100644 --- a/lib/Analysis/MemRegion.cpp +++ b/lib/Analysis/MemRegion.cpp @@ -107,6 +107,28 @@ void ElementRegion::Profile(llvm::FoldingSetNodeID& ID) const { ElementRegion::ProfileRegion(ID, Index, superRegion); } +//===----------------------------------------------------------------------===// +// getLValueType() and getRValueType() +//===----------------------------------------------------------------------===// + +QualType SymbolicRegion::getRValueType(ASTContext& C) const { + const SymbolData& data = SymMgr.getSymbolData(sym); + + // FIXME: We could use the SymbolManager::getType() directly. But that + // would hide the assumptions we made here. What is the type of a symbolic + // region is unclear for other cases. + + // For now we assume the symbol is a typed region rvalue. + const TypedRegion* R + = cast<TypedRegion>(cast<SymbolRegionRValue>(data).getRegion()); + + // Assume the region rvalue has a pointer type, only then we could have a + // symbolic region associated with it. + PointerType* PTy = cast<PointerType>(R->getRValueType(C).getTypePtr()); + + return PTy->getPointeeType(); +} + QualType ElementRegion::getRValueType(ASTContext& C) const { // Strip off typedefs from the ArrayRegion's RvalueType. QualType T = getArrayRegion()->getRValueType(C)->getDesugaredType(); @@ -119,10 +141,6 @@ QualType ElementRegion::getRValueType(ASTContext& C) const { return T; } -//===----------------------------------------------------------------------===// -// getLValueType() and getRValueType() -//===----------------------------------------------------------------------===// - QualType StringRegion::getRValueType(ASTContext& C) const { return Str->getType(); } @@ -308,7 +326,8 @@ MemRegionManager::getElementRegion(SVal Idx, const TypedRegion* superRegion){ } /// getSymbolicRegion - Retrieve or create a "symbolic" memory region. -SymbolicRegion* MemRegionManager::getSymbolicRegion(const SymbolRef sym) { +SymbolicRegion* MemRegionManager::getSymbolicRegion(const SymbolRef sym, + const SymbolManager& mgr) { llvm::FoldingSetNodeID ID; SymbolicRegion::ProfileRegion(ID, sym); @@ -319,7 +338,8 @@ SymbolicRegion* MemRegionManager::getSymbolicRegion(const SymbolRef sym) { if (!R) { R = (SymbolicRegion*) A.Allocate<SymbolicRegion>(); - new (R) SymbolicRegion(sym); + // SymbolicRegion's storage class is usually unknown. + new (R) SymbolicRegion(sym, mgr, getUnknownRegion()); Regions.InsertNode(R, InsertPos); } |