blob: f243fa667b33bbe0dbb477785d6b852b6d0252e5 [file] [log] [blame]
Ted Kremenek94e915e2008-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 Greif2224fcb2008-03-06 10:40:09 +000010// This file defines SymbolManager, a class that manages symbolic values
Ted Kremenek94e915e2008-02-16 01:12:31 +000011// created for use by GRExprEngine and related classes.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/Analysis/PathSensitive/SymbolManager.h"
16
17using namespace clang;
18
Ted Kremenekef0007f2008-02-26 02:15:56 +000019SymbolID SymbolManager::getSymbol(VarDecl* D) {
20
21 assert (isa<ParmVarDecl>(D) || D->hasGlobalStorage());
22
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000023 llvm::FoldingSetNodeID profile;
Ted Kremenek94e915e2008-02-16 01:12:31 +000024
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000025 ParmVarDecl* PD = dyn_cast<ParmVarDecl>(D);
26
27 if (PD)
28 SymbolDataParmVar::Profile(profile, PD);
29 else
30 SymbolDataGlobalVar::Profile(profile, D);
31
32 void* InsertPos;
33
34 SymbolData* SD = DataSet.FindNodeOrInsertPos(profile, InsertPos);
35
36 if (SD)
37 return SD->getSymbol();
38
39 if (PD) {
40 SD = (SymbolData*) BPAlloc.Allocate<SymbolDataParmVar>();
41 new (SD) SymbolDataParmVar(SymbolCounter, PD);
42 }
43 else {
44 SD = (SymbolData*) BPAlloc.Allocate<SymbolDataGlobalVar>();
45 new (SD) SymbolDataGlobalVar(SymbolCounter, D);
Ted Kremenek94e915e2008-02-16 01:12:31 +000046 }
47
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000048 DataSet.InsertNode(SD, InsertPos);
49
50 DataMap[SymbolCounter] = SD;
51 return SymbolCounter++;
Ted Kremenekef0007f2008-02-26 02:15:56 +000052}
53
Ted Kremenek94e915e2008-02-16 01:12:31 +000054SymbolID SymbolManager::getContentsOfSymbol(SymbolID sym) {
Ted Kremenek94e915e2008-02-16 01:12:31 +000055
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000056 llvm::FoldingSetNodeID profile;
57 SymbolDataContentsOf::Profile(profile, sym);
58 void* InsertPos;
Ted Kremenek94e915e2008-02-16 01:12:31 +000059
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000060 SymbolData* SD = DataSet.FindNodeOrInsertPos(profile, InsertPos);
61
62 if (SD)
63 return SD->getSymbol();
64
65 SD = (SymbolData*) BPAlloc.Allocate<SymbolDataContentsOf>();
66 new (SD) SymbolDataContentsOf(SymbolCounter, sym);
67
68
69 DataSet.InsertNode(SD, InsertPos);
70 DataMap[SymbolCounter] = SD;
71
72 return SymbolCounter++;
Ted Kremenek94e915e2008-02-16 01:12:31 +000073}
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000074
Ted Kremenekd4676512008-03-12 21:45:47 +000075SymbolID SymbolManager::getConjuredSymbol(Expr* E, unsigned Count) {
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000076
77 llvm::FoldingSetNodeID profile;
Ted Kremenekd4676512008-03-12 21:45:47 +000078 SymbolConjured::Profile(profile, E, Count);
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000079 void* InsertPos;
80
81 SymbolData* SD = DataSet.FindNodeOrInsertPos(profile, InsertPos);
82
83 if (SD)
84 return SD->getSymbol();
85
Ted Kremenekd4676512008-03-12 21:45:47 +000086 SD = (SymbolData*) BPAlloc.Allocate<SymbolConjured>();
87 new (SD) SymbolConjured(SymbolCounter, E, Count);
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000088
89 DataSet.InsertNode(SD, InsertPos);
90 DataMap[SymbolCounter] = SD;
91
92 return SymbolCounter++;
93}
94
95const SymbolData& SymbolManager::getSymbolData(SymbolID Sym) const {
96 DataMapTy::const_iterator I = DataMap.find(Sym);
97 assert (I != DataMap.end());
98 return *I->second;
99}
100
Ted Kremenek94e915e2008-02-16 01:12:31 +0000101
Ted Kremenek962af8b2008-02-19 20:51:40 +0000102QualType SymbolData::getType(const SymbolManager& SymMgr) const {
Ted Kremenek94e915e2008-02-16 01:12:31 +0000103 switch (getKind()) {
104 default:
105 assert (false && "getType() not implemented for this symbol.");
106
107 case ParmKind:
108 return cast<SymbolDataParmVar>(this)->getDecl()->getType();
Ted Kremenekef0007f2008-02-26 02:15:56 +0000109
110 case GlobalKind:
111 return cast<SymbolDataGlobalVar>(this)->getDecl()->getType();
Ted Kremenek94e915e2008-02-16 01:12:31 +0000112
Ted Kremenek962af8b2008-02-19 20:51:40 +0000113 case ContentsOfKind: {
Ted Kremenekce3ed1e2008-03-12 01:21:45 +0000114 SymbolID x = cast<SymbolDataContentsOf>(this)->getContainerSymbol();
Ted Kremenek962af8b2008-02-19 20:51:40 +0000115 QualType T = SymMgr.getSymbolData(x).getType(SymMgr);
116 return T->getAsPointerType()->getPointeeType();
117 }
Ted Kremenekce3ed1e2008-03-12 01:21:45 +0000118
Ted Kremenekd4676512008-03-12 21:45:47 +0000119 case ConjuredKind:
120 return cast<SymbolConjured>(this)->getExpr()->getType();
Ted Kremenek94e915e2008-02-16 01:12:31 +0000121 }
122}
123
Ted Kremenek94e915e2008-02-16 01:12:31 +0000124SymbolManager::~SymbolManager() {}