blob: ced5741f447d8b569fa5107f2f611d9d6d09f0a9 [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//
10// This files defines SymbolManager, a class that manages symbolic values
11// created for use by GRExprEngine and related classes.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/Analysis/PathSensitive/SymbolManager.h"
16
17using namespace clang;
18
19SymbolID SymbolManager::getSymbol(ParmVarDecl* D) {
20 SymbolID& X = DataToSymbol[getKey(D)];
21
22 if (!X.isInitialized()) {
23 X = SymbolToData.size();
24 SymbolToData.push_back(SymbolDataParmVar(D));
25 }
26
27 return X;
28}
29
30SymbolID SymbolManager::getContentsOfSymbol(SymbolID sym) {
31 SymbolID& X = DataToSymbol[getKey(sym)];
32
33 if (!X.isInitialized()) {
34 X = SymbolToData.size();
35 SymbolToData.push_back(SymbolDataContentsOf(sym));
36 }
37
38 return X;
39}
40
Ted Kremeneka888c982008-02-19 20:51:40 +000041QualType SymbolData::getType(const SymbolManager& SymMgr) const {
Ted Kremenekd70d0b02008-02-16 01:12:31 +000042 switch (getKind()) {
43 default:
44 assert (false && "getType() not implemented for this symbol.");
45
46 case ParmKind:
47 return cast<SymbolDataParmVar>(this)->getDecl()->getType();
48
Ted Kremeneka888c982008-02-19 20:51:40 +000049 case ContentsOfKind: {
50 SymbolID x = cast<SymbolDataContentsOf>(this)->getSymbol();
51 QualType T = SymMgr.getSymbolData(x).getType(SymMgr);
52 return T->getAsPointerType()->getPointeeType();
53 }
Ted Kremenekd70d0b02008-02-16 01:12:31 +000054 }
55}
56
57SymbolManager::SymbolManager() {}
58SymbolManager::~SymbolManager() {}