1
+ // NOLINTBEGIN()
2
+ #ifndef LLVM_CLANG_C_CXCPPINTEROP_H
3
+ #define LLVM_CLANG_C_CXCPPINTEROP_H
4
+
5
+ #include "clang-c/CXErrorCode.h"
6
+ #include "clang-c/CXString.h"
7
+ #include "clang-c/ExternC.h"
8
+ #include "clang-c/Index.h"
9
+ #include "clang-c/Platform.h"
10
+
11
+ #include <stdbool.h>
12
+ #include <stddef.h>
13
+ #include <stdint.h>
14
+
15
+ LLVM_CLANG_C_EXTERN_C_BEGIN
16
+
17
+ /**
18
+ * \defgroup CPPINTEROP_INTERPRETER_MANIP Interpreter manipulations
19
+ *
20
+ * @{
21
+ */
22
+
23
+ /**
24
+ * An opaque pointer representing an interpreter context.
25
+ */
26
+ typedef struct CXInterpreterImpl * CXInterpreter ;
27
+
28
+ /**
29
+ * Create a Clang interpreter instance from the given arguments.
30
+ *
31
+ * \param argv The arguments that would be passed to the interpreter.
32
+ *
33
+ * \param argc The number of arguments in \c argv.
34
+ *
35
+ * \returns a \c CXInterpreter.
36
+ */
37
+ CXInterpreter clang_createInterpreter (const char * const * argv , int argc );
38
+
39
+ typedef void * TInterp_t ;
40
+
41
+ /**
42
+ * Bridge between C API and C++ API.
43
+ *
44
+ * \returns a \c CXInterpreter.
45
+ */
46
+ CXInterpreter clang_createInterpreterFromRawPtr (TInterp_t I );
47
+
48
+ /**
49
+ * Returns a pointer to the underlying interpreter.
50
+ */
51
+ void * clang_Interpreter_getClangInterpreter (CXInterpreter I );
52
+
53
+ /**
54
+ * Returns a \c TInterp_t and takes the ownership.
55
+ */
56
+ TInterp_t clang_Interpreter_takeInterpreterAsPtr (CXInterpreter I );
57
+
58
+ /**
59
+ * Undo N previous incremental inputs.
60
+ */
61
+ enum CXErrorCode clang_Interpreter_undo (CXInterpreter I , unsigned int N );
62
+
63
+ /**
64
+ * Dispose of the given interpreter context.
65
+ */
66
+ void clang_Interpreter_dispose (CXInterpreter I );
67
+
68
+ /**
69
+ * Describes the return result of the different routines that do the incremental
70
+ * compilation.
71
+ */
72
+ typedef enum {
73
+ /**
74
+ * The compilation was successful.
75
+ */
76
+ CXInterpreter_Success = 0 ,
77
+ /**
78
+ * The compilation failed.
79
+ */
80
+ CXInterpreter_Failure = 1 ,
81
+ /**
82
+ * More more input is expected.
83
+ */
84
+ CXInterpreter_MoreInputExpected = 2 ,
85
+ } CXInterpreter_CompilationResult ;
86
+
87
+ /**
88
+ * Add a search path to the interpreter.
89
+ *
90
+ * \param I The interpreter.
91
+ *
92
+ * \param dir The directory to add.
93
+ *
94
+ * \param isUser Whether the directory is a user directory.
95
+ *
96
+ * \param prepend Whether to prepend the directory to the search path.
97
+ */
98
+ void clang_Interpreter_addSearchPath (CXInterpreter I , const char * dir ,
99
+ bool isUser , bool prepend );
100
+
101
+ /**
102
+ * Add an include path.
103
+ *
104
+ * \param I The interpreter.
105
+ *
106
+ * \param dir The directory to add.
107
+ */
108
+ void clang_Interpreter_addIncludePath (CXInterpreter I , const char * dir );
109
+
110
+ /**
111
+ * Declares a code snippet in \c code and does not execute it.
112
+ *
113
+ * \param I The interpreter.
114
+ *
115
+ * \param code The code snippet to declare.
116
+ *
117
+ * \param silent Whether to suppress the diagnostics or not
118
+ *
119
+ * \returns a \c CXErrorCode.
120
+ */
121
+ enum CXErrorCode clang_Interpreter_declare (CXInterpreter I , const char * code ,
122
+ bool silent );
123
+
124
+ /**
125
+ * Declares and executes a code snippet in \c code.
126
+ *
127
+ * \param I The interpreter.
128
+ *
129
+ * \param code The code snippet to execute.
130
+ *
131
+ * \returns a \c CXErrorCode.
132
+ */
133
+ enum CXErrorCode clang_Interpreter_process (CXInterpreter I , const char * code );
134
+
135
+ /**
136
+ * An opaque pointer representing a lightweight struct that is used for carrying
137
+ * execution results.
138
+ */
139
+ typedef void * CXValue ;
140
+
141
+ /**
142
+ * Create a CXValue.
143
+ *
144
+ * \returns a \c CXValue.
145
+ */
146
+ CXValue clang_createValue (void );
147
+
148
+ /**
149
+ * Dispose of the given CXValue.
150
+ *
151
+ * \param V The CXValue to dispose.
152
+ */
153
+ void clang_Value_dispose (CXValue V );
154
+
155
+ /**
156
+ * Declares, executes and stores the execution result to \c V.
157
+ *
158
+ * \param[in] I The interpreter.
159
+ *
160
+ * \param[in] code The code snippet to evaluate.
161
+ *
162
+ * \param[out] V The value to store the execution result.
163
+ *
164
+ * \returns a \c CXErrorCode.
165
+ */
166
+ enum CXErrorCode clang_Interpreter_evaluate (CXInterpreter I , const char * code ,
167
+ CXValue V );
168
+
169
+ /**
170
+ * Looks up the library if access is enabled.
171
+ *
172
+ * \param I The interpreter.
173
+ *
174
+ * \param lib_name The name of the library to lookup.
175
+ *
176
+ * \returns the path to the library.
177
+ */
178
+ CXString clang_Interpreter_lookupLibrary (CXInterpreter I , const char * lib_name );
179
+
180
+ /**
181
+ * Finds \c lib_stem considering the list of search paths and loads it by
182
+ * calling dlopen.
183
+ *
184
+ * \param I The interpreter.
185
+ *
186
+ * \param lib_stem The stem of the library to load.
187
+ *
188
+ * \param lookup Whether to lookup the library or not.
189
+ *
190
+ * \returns a \c CXInterpreter_CompilationResult.
191
+ */
192
+ CXInterpreter_CompilationResult
193
+ clang_Interpreter_loadLibrary (CXInterpreter I , const char * lib_stem ,
194
+ bool lookup );
195
+
196
+ /**
197
+ * Finds \c lib_stem considering the list of search paths and unloads it by
198
+ * calling dlclose.
199
+ *
200
+ * \param I The interpreter.
201
+ *
202
+ * \param lib_stem The stem of the library to unload.
203
+ */
204
+ void clang_Interpreter_unloadLibrary (CXInterpreter I , const char * lib_stem );
205
+
206
+ /**
207
+ * @}
208
+ */
209
+
210
+ /**
211
+ * \defgroup CPPINTEROP_SCOPE_MANIP Scope manipulations
212
+ *
213
+ * @{
214
+ */
215
+
216
+ /**
217
+ * A fake CXCursor for working with the interpreter.
218
+ * It has the same structure as CXCursor, but unlike CXCursor, it stores a
219
+ * handle to the interpreter in the third slot of the data field.
220
+ * This pave the way for upstreaming features to the LLVM project.
221
+ */
222
+ typedef struct {
223
+ enum CXCursorKind kind ;
224
+ int xdata ;
225
+ const void * data [3 ];
226
+ } CXScope ;
227
+
228
+ // for debugging purposes
229
+ void clang_scope_dump (CXScope S );
230
+
231
+ /**
232
+ * Checks if a class has a default constructor.
233
+ */
234
+ bool clang_hasDefaultConstructor (CXScope S );
235
+
236
+ /**
237
+ * Returns the default constructor of a class, if any.
238
+ */
239
+ CXScope clang_getDefaultConstructor (CXScope S );
240
+
241
+ /**
242
+ * Returns the class destructor, if any.
243
+ */
244
+ CXScope clang_getDestructor (CXScope S );
245
+
246
+ /**
247
+ * Returns a stringified version of a given function signature in the form:
248
+ * void N::f(int i, double d, long l = 0, char ch = 'a').
249
+ */
250
+ CXString clang_getFunctionSignature (CXScope func );
251
+
252
+ /**
253
+ * Checks if a function is a templated function.
254
+ */
255
+ bool clang_isTemplatedFunction (CXScope func );
256
+
257
+ /**
258
+ * This function performs a lookup to check if there is a templated function of
259
+ * that type. \c parent is mandatory, the global scope should be used as the
260
+ * default value.
261
+ */
262
+ bool clang_existsFunctionTemplate (const char * name , CXScope parent );
263
+
264
+ typedef struct {
265
+ void * Type ;
266
+ const char * IntegralValue ;
267
+ } CXTemplateArgInfo ;
268
+
269
+ /**
270
+ * Builds a template instantiation for a given templated declaration.
271
+ * Offers a single interface for instantiation of class, function and variable
272
+ * templates.
273
+ *
274
+ * \param[in] tmpl The uninstantiated template class/function.
275
+ *
276
+ * \param[in] template_args The pointer to vector of template arguments stored
277
+ * in the \c TemplateArgInfo struct
278
+ *
279
+ * \param[in] template_args_size The size of the vector of template arguments
280
+ * passed as \c template_args
281
+ *
282
+ * \returns a \c CXScope representing the instantiated templated
283
+ * class/function/variable.
284
+ */
285
+ CXScope clang_instantiateTemplate (CXScope tmpl ,
286
+ CXTemplateArgInfo * template_args ,
287
+ size_t template_args_size );
288
+
289
+ /**
290
+ * A fake CXType for working with the interpreter.
291
+ * It has the same structure as CXType, but unlike CXType, it stores a
292
+ * handle to the interpreter in the second slot of the data field.
293
+ */
294
+ typedef struct {
295
+ enum CXTypeKind kind ;
296
+ void * data [2 ];
297
+ } CXQualType ;
298
+
299
+ /**
300
+ * Gets the string of the type that is passed as a parameter.
301
+ */
302
+ CXString clang_getTypeAsString (CXQualType type );
303
+
304
+ /**
305
+ * Returns the complex of the provided type.
306
+ */
307
+ CXQualType clang_getComplexType (CXQualType eltype );
308
+
309
+ /**
310
+ * An opaque pointer representing the object of a given type (\c CXScope).
311
+ */
312
+ typedef void * CXObject ;
313
+
314
+ /**
315
+ * Allocates memory for the given type.
316
+ */
317
+ CXObject clang_allocate (unsigned int n );
318
+
319
+ /**
320
+ * Deallocates memory for a given class.
321
+ */
322
+ void clang_deallocate (CXObject address );
323
+
324
+ /**
325
+ * Creates an object of class \c scope and calls its default constructor. If \c
326
+ * arena is set it uses placement new.
327
+ */
328
+ CXObject clang_construct (CXScope scope , void * arena );
329
+
330
+ /**
331
+ * Creates a trampoline function and makes a call to a generic function or
332
+ * method.
333
+ *
334
+ * \param func The function or method to call.
335
+ *
336
+ * \param result The location where the return result will be placed.
337
+ *
338
+ * \param args The arguments to pass to the invocation.
339
+ *
340
+ * \param n The number of arguments.
341
+ *
342
+ * \param self The 'this pointer' of the object.
343
+ */
344
+ void clang_invoke (CXScope func , void * result , void * * args , size_t n ,
345
+ void * self );
346
+
347
+ /**
348
+ * Calls the destructor of object of type \c type. When withFree is true it
349
+ * calls operator delete/free.
350
+ *
351
+ * \param This The object to destruct.
352
+ *
353
+ * \param type The type of the object.
354
+ *
355
+ * \param withFree Whether to call operator delete/free or not.
356
+ */
357
+ void clang_destruct (CXObject This , CXScope S , bool withFree );
358
+
359
+ /**
360
+ * @}
361
+ */
362
+
363
+ LLVM_CLANG_C_EXTERN_C_END
364
+
365
+ #endif // LLVM_CLANG_C_CXCPPINTEROP_H
366
+ // NOLINTEND()
0 commit comments