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