]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/clang/include/clang/StaticAnalyzer/Core/PathSensitive/DynamicTypeMap.h
MFV r301238:
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / clang / include / clang / StaticAnalyzer / Core / PathSensitive / DynamicTypeMap.h
1 //== DynamicTypeMap.h - Dynamic type map ----------------------- -*- 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 provides APIs for tracking dynamic type information.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_DYNAMICTYPEMAP_H
15 #define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_DYNAMICTYPEMAP_H
16 #include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h"
17 #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
18 #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h"
19 #include "llvm/ADT/ImmutableMap.h"
20
21 namespace clang {
22 namespace ento {
23
24 /// The GDM component containing the dynamic type info. This is a map from a
25 /// symbol to its most likely type.
26 struct DynamicTypeMap {};
27 typedef llvm::ImmutableMap<const MemRegion *, DynamicTypeInfo>
28     DynamicTypeMapImpl;
29 template <>
30 struct ProgramStateTrait<DynamicTypeMap>
31     : public ProgramStatePartialTrait<DynamicTypeMapImpl> {
32   static void *GDMIndex() {
33     static int index = 0;
34     return &index;
35   }
36 };
37
38 /// \brief Get dynamic type information for a region.
39 DynamicTypeInfo getDynamicTypeInfo(ProgramStateRef State,
40                                    const MemRegion *Reg);
41
42 /// \brief Set dynamic type information of the region; return the new state.
43 ProgramStateRef setDynamicTypeInfo(ProgramStateRef State, const MemRegion *Reg,
44                                    DynamicTypeInfo NewTy);
45
46 /// \brief Set dynamic type information of the region; return the new state.
47 inline ProgramStateRef setDynamicTypeInfo(ProgramStateRef State,
48                                           const MemRegion *Reg, QualType NewTy,
49                                           bool CanBeSubClassed = true) {
50   return setDynamicTypeInfo(State, Reg,
51                             DynamicTypeInfo(NewTy, CanBeSubClassed));
52 }
53
54 } // ento
55 } // clang
56
57 #endif // LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_DYNAMICTYPEMAP_H