blob: 95fbbb937a5facb7ea10df9089681ef5d587fb8a [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"
16
17using namespace clang;
18
Ted Kremenekd763eb92008-02-26 02:15:56 +000019SymbolID SymbolManager::getSymbol(VarDecl* D) {
20
21 assert (isa<ParmVarDecl>(D) || D->hasGlobalStorage());
22
Ted Kremenekd70d0b02008-02-16 01:12:31 +000023 SymbolID& X = DataToSymbol[getKey(D)];
24
25 if (!X.isInitialized()) {
26 X = SymbolToData.size();
Ted Kremenekd763eb92008-02-26 02:15:56 +000027
28 if (ParmVarDecl* VD = dyn_cast<ParmVarDecl>(D))
29 SymbolToData.push_back(SymbolDataParmVar(VD));
30 else
31 SymbolToData.push_back(SymbolDataGlobalVar(D));
Ted Kremenekd70d0b02008-02-16 01:12:31 +000032 }
33
34 return X;
Ted Kremenekd763eb92008-02-26 02:15:56 +000035}
36
Ted Kremenekd70d0b02008-02-16 01:12:31 +000037SymbolID SymbolManager::getContentsOfSymbol(SymbolID sym) {
38 SymbolID& X = DataToSymbol[getKey(sym)];
39
40 if (!X.isInitialized()) {
41 X = SymbolToData.size();
42 SymbolToData.push_back(SymbolDataContentsOf(sym));
43 }
44
45 return X;
46}
47
Ted Kremeneka888c982008-02-19 20:51:40 +000048QualType SymbolData::getType(const SymbolManager& SymMgr) const {
Ted Kremenekd70d0b02008-02-16 01:12:31 +000049 switch (getKind()) {
50 default:
51 assert (false && "getType() not implemented for this symbol.");
52
53 case ParmKind:
54 return cast<SymbolDataParmVar>(this)->getDecl()->getType();
Ted Kremenekd763eb92008-02-26 02:15:56 +000055
56 case GlobalKind:
57 return cast<SymbolDataGlobalVar>(this)->getDecl()->getType();
Ted Kremenekd70d0b02008-02-16 01:12:31 +000058
Ted Kremeneka888c982008-02-19 20:51:40 +000059 case ContentsOfKind: {
60 SymbolID x = cast<SymbolDataContentsOf>(this)->getSymbol();
61 QualType T = SymMgr.getSymbolData(x).getType(SymMgr);
62 return T->getAsPointerType()->getPointeeType();
63 }
Ted Kremenekd70d0b02008-02-16 01:12:31 +000064 }
65}
66
67SymbolManager::SymbolManager() {}
68SymbolManager::~SymbolManager() {}