blob: 1672af8c611c776c0797a3dd12a2c85817f3715c [file] [log] [blame]
Ted Kremenekd70d0b02008-02-16 01:12:31 +00001//== SymbolManager.h - Management of Symbolic Values ------------*- C++ -*--==//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Gabor Greif843e9342008-03-06 10:40:09 +000010// This file defines SymbolManager, a class that manages symbolic values
Ted Kremenekd70d0b02008-02-16 01:12:31 +000011// created for use by GRExprEngine and related classes.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/Analysis/PathSensitive/SymbolManager.h"
Zhongxing Xu4193eca2008-12-20 06:32:12 +000016#include "clang/Analysis/PathSensitive/MemRegion.h"
Ted Kremenek562731e2008-12-05 02:45:20 +000017#include "llvm/Support/raw_ostream.h"
Ted Kremenekd70d0b02008-02-16 01:12:31 +000018
19using namespace clang;
20
Ted Kremenek562731e2008-12-05 02:45:20 +000021void SymbolRef::print(llvm::raw_ostream& os) const {
22 os << getNumber();
23}
24
Ted Kremenek9ab6b9c2009-01-22 18:23:34 +000025SymbolRef SymbolManager::getRegionRValueSymbol(const MemRegion* R) {
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000026 llvm::FoldingSetNodeID profile;
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000027
Ted Kremenek9ab6b9c2009-01-22 18:23:34 +000028 SymbolRegionRValue::Profile(profile, R);
29 void* InsertPos;
30 SymbolData* SD = DataSet.FindNodeOrInsertPos(profile, InsertPos);
31 if (SD) return SD->getSymbol();
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000032
Ted Kremenek9ab6b9c2009-01-22 18:23:34 +000033 SD = (SymbolData*) BPAlloc.Allocate<SymbolRegionRValue>();
34 new (SD) SymbolRegionRValue(SymbolCounter, R);
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000035 DataSet.InsertNode(SD, InsertPos);
Ted Kremenek9ab6b9c2009-01-22 18:23:34 +000036 DataMap[SymbolCounter] = SD;
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000037 return SymbolCounter++;
Zhongxing Xueabf7762008-11-19 11:03:17 +000038
Zhongxing Xueabf7762008-11-19 11:03:17 +000039}
40
Ted Kremenek9ab6b9c2009-01-22 18:23:34 +000041SymbolRef SymbolManager::getConjuredSymbol(Stmt* E, QualType T, unsigned Count){
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000042
43 llvm::FoldingSetNodeID profile;
Ted Kremenek60a6e0c2008-10-01 00:21:14 +000044 SymbolConjured::Profile(profile, E, T, Count);
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000045 void* InsertPos;
46
47 SymbolData* SD = DataSet.FindNodeOrInsertPos(profile, InsertPos);
48
49 if (SD)
50 return SD->getSymbol();
51
Ted Kremenek361fa8e2008-03-12 21:45:47 +000052 SD = (SymbolData*) BPAlloc.Allocate<SymbolConjured>();
Ted Kremenek60a6e0c2008-10-01 00:21:14 +000053 new (SD) SymbolConjured(SymbolCounter, E, T, Count);
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000054
55 DataSet.InsertNode(SD, InsertPos);
56 DataMap[SymbolCounter] = SD;
57
58 return SymbolCounter++;
59}
60
Ted Kremenek2dabd432008-12-05 02:27:51 +000061const SymbolData& SymbolManager::getSymbolData(SymbolRef Sym) const {
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000062 DataMapTy::const_iterator I = DataMap.find(Sym);
63 assert (I != DataMap.end());
64 return *I->second;
65}
66
Ted Kremenekd70d0b02008-02-16 01:12:31 +000067
Ted Kremenek9ab6b9c2009-01-22 18:23:34 +000068QualType SymbolConjured::getType(ASTContext&) const {
69 return T;
70}
Ted Kremenekd763eb92008-02-26 02:15:56 +000071
Ted Kremenek9ab6b9c2009-01-22 18:23:34 +000072QualType SymbolRegionRValue::getType(ASTContext& C) const {
73 if (const TypedRegion* TR = dyn_cast<TypedRegion>(R))
74 return TR->getRValueType(C);
75
76 return QualType();
Ted Kremenekd70d0b02008-02-16 01:12:31 +000077}
78
Ted Kremenekd70d0b02008-02-16 01:12:31 +000079SymbolManager::~SymbolManager() {}
Ted Kremenek241677a2009-01-21 22:26:05 +000080
81void SymbolReaper::markLive(SymbolRef sym) {
82 TheLiving = F.Add(TheLiving, sym);
83 TheDead = F.Remove(TheDead, sym);
84}
85
86bool SymbolReaper::maybeDead(SymbolRef sym) {
87 if (isLive(sym))
88 return false;
89
90 TheDead = F.Add(TheDead, sym);
91 return true;
92}
93
Ted Kremenek9ab6b9c2009-01-22 18:23:34 +000094bool SymbolReaper::isLive(SymbolRef sym) {
Ted Kremenekdcb6a262009-01-22 18:51:33 +000095 if (TheLiving.contains(sym))
96 return true;
97
98 // Interogate the symbol. It may derive from an input value to
99 // the analyzed function/method.
100 return isa<SymbolRegionRValue>(SymMgr.getSymbolData(sym));
Ted Kremenek241677a2009-01-21 22:26:05 +0000101}
102