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

164 template T as() const {

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 (V.isValid() || V.isVoid()) {

182 return T();

183 }

184 return V.as<T>();

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)