1 | /*===-- llvm-c/Remarks.h - Remarks Public C Interface -------------*- C -*-===*\ |
2 | |* *| |
3 | |* Part of the LLVM Project, under the Apache License v2.0 with LLVM *| |
4 | |* Exceptions. *| |
5 | |* See https://llvm.org/LICENSE.txt for license information. *| |
6 | |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *| |
7 | |* *| |
8 | |*===----------------------------------------------------------------------===*| |
9 | |* *| |
10 | |* This header provides a public interface to a remark diagnostics library. *| |
11 | |* LLVM provides an implementation of this interface. *| |
12 | |* *| |
13 | \*===----------------------------------------------------------------------===*/ |
14 | |
15 | #ifndef LLVM_C_REMARKS_H |
16 | #define |
17 | |
18 | #include "llvm-c/ExternC.h" |
19 | #include "llvm-c/Types.h" |
20 | #ifdef __cplusplus |
21 | #include <cstddef> |
22 | #else |
23 | #include <stddef.h> |
24 | #endif /* !defined(__cplusplus) */ |
25 | |
26 | LLVM_C_EXTERN_C_BEGIN |
27 | |
28 | /** |
29 | * @defgroup LLVMCREMARKS Remarks |
30 | * @ingroup LLVMC |
31 | * |
32 | * @{ |
33 | */ |
34 | |
35 | // 0 -> 1: Bitstream remarks support. |
36 | #define 1 |
37 | |
38 | /** |
39 | * The type of the emitted remark. |
40 | */ |
41 | enum { |
42 | , |
43 | , |
44 | , |
45 | , |
46 | , |
47 | , |
48 | |
49 | }; |
50 | |
51 | /** |
52 | * String containing a buffer and a length. The buffer is not guaranteed to be |
53 | * zero-terminated. |
54 | * |
55 | * \since REMARKS_API_VERSION=0 |
56 | */ |
57 | typedef struct *; |
58 | |
59 | /** |
60 | * Returns the buffer holding the string. |
61 | * |
62 | * \since REMARKS_API_VERSION=0 |
63 | */ |
64 | extern const char *(LLVMRemarkStringRef String); |
65 | |
66 | /** |
67 | * Returns the size of the string. |
68 | * |
69 | * \since REMARKS_API_VERSION=0 |
70 | */ |
71 | extern uint32_t (LLVMRemarkStringRef String); |
72 | |
73 | /** |
74 | * DebugLoc containing File, Line and Column. |
75 | * |
76 | * \since REMARKS_API_VERSION=0 |
77 | */ |
78 | typedef struct *; |
79 | |
80 | /** |
81 | * Return the path to the source file for a debug location. |
82 | * |
83 | * \since REMARKS_API_VERSION=0 |
84 | */ |
85 | extern LLVMRemarkStringRef |
86 | (LLVMRemarkDebugLocRef DL); |
87 | |
88 | /** |
89 | * Return the line in the source file for a debug location. |
90 | * |
91 | * \since REMARKS_API_VERSION=0 |
92 | */ |
93 | extern uint32_t (LLVMRemarkDebugLocRef DL); |
94 | |
95 | /** |
96 | * Return the column in the source file for a debug location. |
97 | * |
98 | * \since REMARKS_API_VERSION=0 |
99 | */ |
100 | extern uint32_t LLVMRemarkDebugLocGetSourceColumn(LLVMRemarkDebugLocRef DL); |
101 | |
102 | /** |
103 | * Element of the "Args" list. The key might give more information about what |
104 | * the semantics of the value are, e.g. "Callee" will tell you that the value |
105 | * is a symbol that names a function. |
106 | * |
107 | * \since REMARKS_API_VERSION=0 |
108 | */ |
109 | typedef struct *; |
110 | |
111 | /** |
112 | * Returns the key of an argument. The key defines what the value is, and the |
113 | * same key can appear multiple times in the list of arguments. |
114 | * |
115 | * \since REMARKS_API_VERSION=0 |
116 | */ |
117 | extern LLVMRemarkStringRef (LLVMRemarkArgRef Arg); |
118 | |
119 | /** |
120 | * Returns the value of an argument. This is a string that can contain newlines. |
121 | * |
122 | * \since REMARKS_API_VERSION=0 |
123 | */ |
124 | extern LLVMRemarkStringRef (LLVMRemarkArgRef Arg); |
125 | |
126 | /** |
127 | * Returns the debug location that is attached to the value of this argument. |
128 | * |
129 | * If there is no debug location, the return value will be `NULL`. |
130 | * |
131 | * \since REMARKS_API_VERSION=0 |
132 | */ |
133 | extern LLVMRemarkDebugLocRef (LLVMRemarkArgRef Arg); |
134 | |
135 | /** |
136 | * A remark emitted by the compiler. |
137 | * |
138 | * \since REMARKS_API_VERSION=0 |
139 | */ |
140 | typedef struct *; |
141 | |
142 | /** |
143 | * Free the resources used by the remark entry. |
144 | * |
145 | * \since REMARKS_API_VERSION=0 |
146 | */ |
147 | extern void (LLVMRemarkEntryRef ); |
148 | |
149 | /** |
150 | * The type of the remark. For example, it can allow users to only keep the |
151 | * missed optimizations from the compiler. |
152 | * |
153 | * \since REMARKS_API_VERSION=0 |
154 | */ |
155 | extern enum LLVMRemarkType (LLVMRemarkEntryRef ); |
156 | |
157 | /** |
158 | * Get the name of the pass that emitted this remark. |
159 | * |
160 | * \since REMARKS_API_VERSION=0 |
161 | */ |
162 | extern LLVMRemarkStringRef |
163 | (LLVMRemarkEntryRef ); |
164 | |
165 | /** |
166 | * Get an identifier of the remark. |
167 | * |
168 | * \since REMARKS_API_VERSION=0 |
169 | */ |
170 | extern LLVMRemarkStringRef |
171 | (LLVMRemarkEntryRef ); |
172 | |
173 | /** |
174 | * Get the name of the function being processed when the remark was emitted. |
175 | * |
176 | * \since REMARKS_API_VERSION=0 |
177 | */ |
178 | extern LLVMRemarkStringRef |
179 | (LLVMRemarkEntryRef ); |
180 | |
181 | /** |
182 | * Returns the debug location that is attached to this remark. |
183 | * |
184 | * If there is no debug location, the return value will be `NULL`. |
185 | * |
186 | * \since REMARKS_API_VERSION=0 |
187 | */ |
188 | extern LLVMRemarkDebugLocRef |
189 | (LLVMRemarkEntryRef ); |
190 | |
191 | /** |
192 | * Return the hotness of the remark. |
193 | * |
194 | * A hotness of `0` means this value is not set. |
195 | * |
196 | * \since REMARKS_API_VERSION=0 |
197 | */ |
198 | extern uint64_t (LLVMRemarkEntryRef ); |
199 | |
200 | /** |
201 | * The number of arguments the remark holds. |
202 | * |
203 | * \since REMARKS_API_VERSION=0 |
204 | */ |
205 | extern uint32_t (LLVMRemarkEntryRef ); |
206 | |
207 | /** |
208 | * Get a new iterator to iterate over a remark's argument. |
209 | * |
210 | * If there are no arguments in \p Remark, the return value will be `NULL`. |
211 | * |
212 | * The lifetime of the returned value is bound to the lifetime of \p Remark. |
213 | * |
214 | * \since REMARKS_API_VERSION=0 |
215 | */ |
216 | extern LLVMRemarkArgRef (LLVMRemarkEntryRef ); |
217 | |
218 | /** |
219 | * Get the next argument in \p Remark from the position of \p It. |
220 | * |
221 | * Returns `NULL` if there are no more arguments available. |
222 | * |
223 | * The lifetime of the returned value is bound to the lifetime of \p Remark. |
224 | * |
225 | * \since REMARKS_API_VERSION=0 |
226 | */ |
227 | extern LLVMRemarkArgRef (LLVMRemarkArgRef It, |
228 | LLVMRemarkEntryRef ); |
229 | |
230 | typedef struct *; |
231 | |
232 | /** |
233 | * Creates a remark parser that can be used to parse the buffer located in \p |
234 | * Buf of size \p Size bytes. |
235 | * |
236 | * \p Buf cannot be `NULL`. |
237 | * |
238 | * This function should be paired with LLVMRemarkParserDispose() to avoid |
239 | * leaking resources. |
240 | * |
241 | * \since REMARKS_API_VERSION=0 |
242 | */ |
243 | extern LLVMRemarkParserRef (const void *Buf, |
244 | uint64_t Size); |
245 | |
246 | /** |
247 | * Creates a remark parser that can be used to parse the buffer located in \p |
248 | * Buf of size \p Size bytes. |
249 | * |
250 | * \p Buf cannot be `NULL`. |
251 | * |
252 | * This function should be paired with LLVMRemarkParserDispose() to avoid |
253 | * leaking resources. |
254 | * |
255 | * \since REMARKS_API_VERSION=1 |
256 | */ |
257 | extern LLVMRemarkParserRef (const void *Buf, |
258 | uint64_t Size); |
259 | |
260 | /** |
261 | * Returns the next remark in the file. |
262 | * |
263 | * The value pointed to by the return value needs to be disposed using a call to |
264 | * LLVMRemarkEntryDispose(). |
265 | * |
266 | * All the entries in the returned value that are of LLVMRemarkStringRef type |
267 | * will become invalidated once a call to LLVMRemarkParserDispose is made. |
268 | * |
269 | * If the parser reaches the end of the buffer, the return value will be `NULL`. |
270 | * |
271 | * In the case of an error, the return value will be `NULL`, and: |
272 | * |
273 | * 1) LLVMRemarkParserHasError() will return `1`. |
274 | * |
275 | * 2) LLVMRemarkParserGetErrorMessage() will return a descriptive error |
276 | * message. |
277 | * |
278 | * An error may occur if: |
279 | * |
280 | * 1) An argument is invalid. |
281 | * |
282 | * 2) There is a parsing error. This can occur on things like malformed YAML. |
283 | * |
284 | * 3) There is a Remark semantic error. This can occur on well-formed files with |
285 | * missing or extra fields. |
286 | * |
287 | * Here is a quick example of the usage: |
288 | * |
289 | * ``` |
290 | * LLVMRemarkParserRef Parser = LLVMRemarkParserCreateYAML(Buf, Size); |
291 | * LLVMRemarkEntryRef Remark = NULL; |
292 | * while ((Remark = LLVMRemarkParserGetNext(Parser))) { |
293 | * // use Remark |
294 | * LLVMRemarkEntryDispose(Remark); // Release memory. |
295 | * } |
296 | * bool HasError = LLVMRemarkParserHasError(Parser); |
297 | * LLVMRemarkParserDispose(Parser); |
298 | * ``` |
299 | * |
300 | * \since REMARKS_API_VERSION=0 |
301 | */ |
302 | extern LLVMRemarkEntryRef (LLVMRemarkParserRef Parser); |
303 | |
304 | /** |
305 | * Returns `1` if the parser encountered an error while parsing the buffer. |
306 | * |
307 | * \since REMARKS_API_VERSION=0 |
308 | */ |
309 | extern LLVMBool (LLVMRemarkParserRef Parser); |
310 | |
311 | /** |
312 | * Returns a null-terminated string containing an error message. |
313 | * |
314 | * In case of no error, the result is `NULL`. |
315 | * |
316 | * The memory of the string is bound to the lifetime of \p Parser. If |
317 | * LLVMRemarkParserDispose() is called, the memory of the string will be |
318 | * released. |
319 | * |
320 | * \since REMARKS_API_VERSION=0 |
321 | */ |
322 | extern const char *(LLVMRemarkParserRef Parser); |
323 | |
324 | /** |
325 | * Releases all the resources used by \p Parser. |
326 | * |
327 | * \since REMARKS_API_VERSION=0 |
328 | */ |
329 | extern void (LLVMRemarkParserRef Parser); |
330 | |
331 | /** |
332 | * Returns the version of the remarks library. |
333 | * |
334 | * \since REMARKS_API_VERSION=0 |
335 | */ |
336 | extern uint32_t (void); |
337 | |
338 | /** |
339 | * @} // endgoup LLVMCREMARKS |
340 | */ |
341 | |
342 | LLVM_C_EXTERN_C_END |
343 | |
344 | #endif /* LLVM_C_REMARKS_H */ |
345 | |