clang: include/clang/Interpreter/Value.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33#ifndef LLVM_CLANG_INTERPRETER_VALUE_H
34#define LLVM_CLANG_INTERPRETER_VALUE_H
35
36#include "llvm/Config/llvm-config.h"
37#include "llvm/Support/Compiler.h"
38#include
39
40
41
42
43
44
45namespace llvm {
46class raw_ostream;
47
48}
49
51
52class ASTContext;
53class Interpreter;
54class QualType;
55
56#if defined(_WIN32)
57
58
59
60
61
62
63
64
65#define REPL_EXTERNAL_VISIBILITY __declspec(dllexport)
66#elif __has_attribute(visibility)
67#if defined(LLVM_BUILD_LLVM_DYLIB) || defined(LLVM_BUILD_SHARED_LIBS)
68#define REPL_EXTERNAL_VISIBILITY __attribute__((visibility("default")))
69#else
70#define REPL_EXTERNAL_VISIBILITY
71#endif
72#else
73#define REPL_EXTERNAL_VISIBILITY
74#endif
75
76#define REPL_BUILTIN_TYPES \
77 X(bool, Bool) \
78 X(char, Char_S) \
79 X(signed char, SChar) \
80 X(unsigned char, Char_U) \
81 X(unsigned char, UChar) \
82 X(short, Short) \
83 X(unsigned short, UShort) \
84 X(int, Int) \
85 X(unsigned int, UInt) \
86 X(long, Long) \
87 X(unsigned long, ULong) \
88 X(long long, LongLong) \
89 X(unsigned long long, ULongLong) \
90 X(float, Float) \
91 X(double, Double) \
92 X(long double, LongDouble)
93
95 union Storage {
96#define X(type, name) type m_##name;
98#undef X
99 void *m_Ptr;
100 };
101
102public:
104#define X(type, name) K_##name,
106#undef X
107
110 K_Unspecified
112
118 Value &operator=(Value &&RHS) noexcept;
120
121 void printType(llvm::raw_ostream &Out) const;
122 void printData(llvm::raw_ostream &Out) const;
123 void print(llvm::raw_ostream &Out) const;
124 void dump() const;
125 void clear();
126
128 const ASTContext &getASTContext() const;
130 const Interpreter &getInterpreter() const;
132
133 bool isValid() const { return ValueKind != K_Unspecified; }
134 bool isVoid() const { return ValueKind == K_Void; }
135 bool hasValue() const { return isValid() && !isVoid(); }
140
141 void *getPtr() const;
143
144#define X(type, name) \
145 void set##name(type Val) { Data.m_##name = Val; } \
146 type get##name() const { return Data.m_##name; }
148#undef X
149
150
151
152
153
154
157 }
158
159protected:
161
162
163
165 switch (ValueKind) {
166 default:
167 return T();
168#define X(type, name) \
169 case Value::K_##name: \
170 return (T)Data.m_##name;
172#undef X
173 }
174 }
175
176
179 if (V.isPointerOrObjectType())
181 if (.isValid() || V.isVoid()) {
182 return T();
183 }
185 }
186 };
187
190 if (V.isPointerOrObjectType())
192 return nullptr;
193 }
194 };
195
197 void *OpaqueType = nullptr;
199 Kind ValueKind = K_Unspecified;
200 bool IsManuallyAlloc = false;
201};
202
205 return Data.m_Ptr;
206 return (void *)as<uintptr_t>();
207}
208
209}
210#endif
static void dump(llvm::raw_ostream &OS, StringRef FunctionName, ArrayRef< CounterExpression > Expressions, ArrayRef< CounterMappingRegion > Regions)
static void print(llvm::raw_ostream &OS, const T &V, ASTContext &ASTCtx, QualType Ty)
#define REPL_EXTERNAL_VISIBILITY
#define REPL_BUILTIN_TYPES
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Provides top-level interfaces for incremental compilation and execution.
A (possibly-)qualified type.
bool isManuallyAlloc() const
bool isPointerOrObjectType() const
REPL_BUILTIN_TYPES T convertTo() const
Get the value with cast.
T as() const
Get to the value with type checking casting the underlying stored value to T.
void setOpaqueType(void *Ty)
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
Diagnostic wrappers for TextAPI types for error reporting.
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
static T * cast(const Value &V)
static T cast(const Value &V)