clang 17.0.0git
StorageLocation.h
Go to the documentation of this file.
1//===-- StorageLocation.h ---------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines classes that represent elements of the local variable store
10// and of the heap during dataflow analysis.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_STORAGELOCATION_H
15#define LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_STORAGELOCATION_H
16
17#include "clang/AST/Decl.h"
18#include "clang/AST/Type.h"
19#include "llvm/ADT/DenseMap.h"
20
21namespace clang {
22namespace dataflow {
23
24/// Base class for elements of the local variable store and of the heap.
25///
26/// Each storage location holds a value. The mapping from storage locations to
27/// values is stored in the environment.
29public:
30 enum class Kind { Scalar, Aggregate };
31
32 StorageLocation(Kind LocKind, QualType Type) : LocKind(LocKind), Type(Type) {}
33
34 // Non-copyable because addresses of storage locations are used as their
35 // identities throughout framework and user code. The framework is responsible
36 // for construction and destruction of storage locations.
39
40 virtual ~StorageLocation() = default;
41
42 Kind getKind() const { return LocKind; }
43
44 QualType getType() const { return Type; }
45
46private:
47 Kind LocKind;
49};
50
51/// A storage location that is not subdivided further for the purposes of
52/// abstract interpretation. For example: `int`, `int*`, `int&`.
54public:
57
58 static bool classof(const StorageLocation *Loc) {
59 return Loc->getKind() == Kind::Scalar;
60 }
61};
62
63/// A storage location which is subdivided into smaller storage locations that
64/// can be traced independently by abstract interpretation. For example: a
65/// struct with public members. The child map is flat, so when used for a struct
66/// or class type, all accessible members of base struct and class types are
67/// directly accesible as children of this location.
68/// FIXME: Currently, the storage location of unions is modelled the same way as
69/// that of structs or classes. Eventually, we need to change this modelling so
70/// that all of the members of a given union have the same storage location.
72public:
75 Type, llvm::DenseMap<const ValueDecl *, StorageLocation *>()) {}
76
79 llvm::DenseMap<const ValueDecl *, StorageLocation *> Children)
80 : StorageLocation(Kind::Aggregate, Type), Children(std::move(Children)) {}
81
82 static bool classof(const StorageLocation *Loc) {
83 return Loc->getKind() == Kind::Aggregate;
84 }
85
86 /// Returns the child storage location for `D`.
88 auto It = Children.find(&D);
89 assert(It != Children.end());
90 return *It->second;
91 }
92
93private:
94 llvm::DenseMap<const ValueDecl *, StorageLocation *> Children;
95};
96
97} // namespace dataflow
98} // namespace clang
99
100#endif // LLVM_CLANG_ANALYSIS_FLOWSENSITIVE_STORAGELOCATION_H
C Language Family Type Representation.
A (possibly-)qualified type.
Definition: Type.h:736
The base class of the type hierarchy.
Definition: Type.h:1568
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:701
A storage location which is subdivided into smaller storage locations that can be traced independentl...
AggregateStorageLocation(QualType Type, llvm::DenseMap< const ValueDecl *, StorageLocation * > Children)
StorageLocation & getChild(const ValueDecl &D) const
Returns the child storage location for D.
static bool classof(const StorageLocation *Loc)
A storage location that is not subdivided further for the purposes of abstract interpretation.
static bool classof(const StorageLocation *Loc)
Base class for elements of the local variable store and of the heap.
virtual ~StorageLocation()=default
StorageLocation(Kind LocKind, QualType Type)
StorageLocation & operator=(const StorageLocation &)=delete
StorageLocation(const StorageLocation &)=delete
YAML serialization mapping.
Definition: Dominators.h:30
Definition: Format.h:4756