1//==- DynamicTypeMap.cpp - Dynamic Type Info related APIs ----------*- 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 file defines APIs that track and query dynamic type information. This
11//  information can be used to devirtualize calls during the symbolic exection
12//  or do type checking.
13//
14//===----------------------------------------------------------------------===//
15
16#include "clang/StaticAnalyzer/Core/PathSensitive/DynamicTypeMap.h"
17
18namespace clang {
19namespace ento {
20
21DynamicTypeInfo getDynamicTypeInfo(ProgramStateRef State,
22                                   const MemRegion *Reg) {
23  Reg = Reg->StripCasts();
24
25  // Look up the dynamic type in the GDM.
26  const DynamicTypeInfo *GDMType = State->get<DynamicTypeMap>(Reg);
27  if (GDMType)
28    return *GDMType;
29
30  // Otherwise, fall back to what we know about the region.
31  if (const TypedRegion *TR = dyn_cast<TypedRegion>(Reg))
32    return DynamicTypeInfo(TR->getLocationType(), /*CanBeSubclass=*/false);
33
34  if (const SymbolicRegion *SR = dyn_cast<SymbolicRegion>(Reg)) {
35    SymbolRef Sym = SR->getSymbol();
36    return DynamicTypeInfo(Sym->getType());
37  }
38
39  return DynamicTypeInfo();
40}
41
42ProgramStateRef setDynamicTypeInfo(ProgramStateRef State, const MemRegion *Reg,
43                                   DynamicTypeInfo NewTy) {
44  Reg = Reg->StripCasts();
45  ProgramStateRef NewState = State->set<DynamicTypeMap>(Reg, NewTy);
46  assert(NewState);
47  return NewState;
48}
49
50} // namespace ento
51} // namespace clang
52