1 /*===-- llvm-c/Remarks.h - Remarks Public C Interface -------------*- C -*-===*\
3 |* Part of the LLVM Project, under the Apache License v2.0 with LLVM *|
5 |* See https://llvm.org/LICENSE.txt for license information. *|
6 |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception *|
8 |*===----------------------------------------------------------------------===*|
10 |* This header provides a public interface to a remark diagnostics library. *|
11 |* LLVM provides an implementation of this interface. *|
13 \*===----------------------------------------------------------------------===*/
15 #ifndef LLVM_C_REMARKS_H
16 #define LLVM_C_REMARKS_H
18 #include "llvm-c/Types.h"
24 #endif /* !defined(__cplusplus) */
27 * @defgroup LLVMCREMARKS Remarks
33 #define REMARKS_API_VERSION 0
36 * The type of the emitted remark.
39 LLVMRemarkTypeUnknown
,
42 LLVMRemarkTypeAnalysis
,
43 LLVMRemarkTypeAnalysisFPCommute
,
44 LLVMRemarkTypeAnalysisAliasing
,
49 * String containing a buffer and a length. The buffer is not guaranteed to be
52 * \since REMARKS_API_VERSION=0
54 typedef struct LLVMRemarkOpaqueString
*LLVMRemarkStringRef
;
57 * Returns the buffer holding the string.
59 * \since REMARKS_API_VERSION=0
61 extern const char *LLVMRemarkStringGetData(LLVMRemarkStringRef String
);
64 * Returns the size of the string.
66 * \since REMARKS_API_VERSION=0
68 extern uint32_t LLVMRemarkStringGetLen(LLVMRemarkStringRef String
);
71 * DebugLoc containing File, Line and Column.
73 * \since REMARKS_API_VERSION=0
75 typedef struct LLVMRemarkOpaqueDebugLoc
*LLVMRemarkDebugLocRef
;
78 * Return the path to the source file for a debug location.
80 * \since REMARKS_API_VERSION=0
82 extern LLVMRemarkStringRef
83 LLVMRemarkDebugLocGetSourceFilePath(LLVMRemarkDebugLocRef DL
);
86 * Return the line in the source file for a debug location.
88 * \since REMARKS_API_VERSION=0
90 extern uint32_t LLVMRemarkDebugLocGetSourceLine(LLVMRemarkDebugLocRef DL
);
93 * Return the column in the source file for a debug location.
95 * \since REMARKS_API_VERSION=0
97 extern uint32_t LLVMRemarkDebugLocGetSourceColumn(LLVMRemarkDebugLocRef DL
);
100 * Element of the "Args" list. The key might give more information about what
101 * the semantics of the value are, e.g. "Callee" will tell you that the value
102 * is a symbol that names a function.
104 * \since REMARKS_API_VERSION=0
106 typedef struct LLVMRemarkOpaqueArg
*LLVMRemarkArgRef
;
109 * Returns the key of an argument. The key defines what the value is, and the
110 * same key can appear multiple times in the list of arguments.
112 * \since REMARKS_API_VERSION=0
114 extern LLVMRemarkStringRef
LLVMRemarkArgGetKey(LLVMRemarkArgRef Arg
);
117 * Returns the value of an argument. This is a string that can contain newlines.
119 * \since REMARKS_API_VERSION=0
121 extern LLVMRemarkStringRef
LLVMRemarkArgGetValue(LLVMRemarkArgRef Arg
);
124 * Returns the debug location that is attached to the value of this argument.
126 * If there is no debug location, the return value will be `NULL`.
128 * \since REMARKS_API_VERSION=0
130 extern LLVMRemarkDebugLocRef
LLVMRemarkArgGetDebugLoc(LLVMRemarkArgRef Arg
);
133 * A remark emitted by the compiler.
135 * \since REMARKS_API_VERSION=0
137 typedef struct LLVMRemarkOpaqueEntry
*LLVMRemarkEntryRef
;
140 * The type of the remark. For example, it can allow users to only keep the
141 * missed optimizations from the compiler.
143 * \since REMARKS_API_VERSION=0
145 extern enum LLVMRemarkType
LLVMRemarkEntryGetType(LLVMRemarkEntryRef Remark
);
148 * Get the name of the pass that emitted this remark.
150 * \since REMARKS_API_VERSION=0
152 extern LLVMRemarkStringRef
153 LLVMRemarkEntryGetPassName(LLVMRemarkEntryRef Remark
);
156 * Get an identifier of the remark.
158 * \since REMARKS_API_VERSION=0
160 extern LLVMRemarkStringRef
161 LLVMRemarkEntryGetRemarkName(LLVMRemarkEntryRef Remark
);
164 * Get the name of the function being processsed when the remark was emitted.
166 * \since REMARKS_API_VERSION=0
168 extern LLVMRemarkStringRef
169 LLVMRemarkEntryGetFunctionName(LLVMRemarkEntryRef Remark
);
172 * Returns the debug location that is attached to this remark.
174 * If there is no debug location, the return value will be `NULL`.
176 * \since REMARKS_API_VERSION=0
178 extern LLVMRemarkDebugLocRef
179 LLVMRemarkEntryGetDebugLoc(LLVMRemarkEntryRef Remark
);
182 * Return the hotness of the remark.
184 * A hotness of `0` means this value is not set.
186 * \since REMARKS_API_VERSION=0
188 extern uint64_t LLVMRemarkEntryGetHotness(LLVMRemarkEntryRef Remark
);
191 * The number of arguments the remark holds.
193 * \since REMARKS_API_VERSION=0
195 extern uint32_t LLVMRemarkEntryGetNumArgs(LLVMRemarkEntryRef Remark
);
198 * Get a new iterator to iterate over a remark's argument.
200 * If there are no arguments in \p Remark, the return value will be `NULL`.
202 * \since REMARKS_API_VERSION=0
204 extern LLVMRemarkArgRef
LLVMRemarkEntryGetFirstArg(LLVMRemarkEntryRef Remark
);
207 * Get the next argument in \p Remark from the position of \p It.
209 * Returns `NULL` if there are no more arguments available.
211 * \since REMARKS_API_VERSION=0
213 extern LLVMRemarkArgRef
LLVMRemarkEntryGetNextArg(LLVMRemarkArgRef It
,
214 LLVMRemarkEntryRef Remark
);
216 typedef struct LLVMRemarkOpaqueParser
*LLVMRemarkParserRef
;
219 * Creates a remark parser that can be used to parse the buffer located in \p
220 * Buf of size \p Size bytes.
222 * \p Buf cannot be `NULL`.
224 * This function should be paired with LLVMRemarkParserDispose() to avoid
227 * \since REMARKS_API_VERSION=0
229 extern LLVMRemarkParserRef
LLVMRemarkParserCreateYAML(const void *Buf
,
233 * Returns the next remark in the file.
235 * The value pointed to by the return value is invalidated by the next call to
236 * LLVMRemarkParserGetNext().
238 * If the parser reaches the end of the buffer, the return value will be `NULL`.
240 * In the case of an error, the return value will be `NULL`, and:
242 * 1) LLVMRemarkParserHasError() will return `1`.
244 * 2) LLVMRemarkParserGetErrorMessage() will return a descriptive error
247 * An error may occur if:
249 * 1) An argument is invalid.
251 * 2) There is a parsing error. This can occur on things like malformed YAML.
253 * 3) There is a Remark semantic error. This can occur on well-formed files with
254 * missing or extra fields.
256 * Here is a quick example of the usage:
259 * LLVMRemarkParserRef Parser = LLVMRemarkParserCreateYAML(Buf, Size);
260 * LLVMRemarkEntryRef Remark = NULL;
261 * while ((Remark == LLVMRemarkParserGetNext(Parser))) {
264 * bool HasError = LLVMRemarkParserHasError(Parser);
265 * LLVMRemarkParserDispose(Parser);
268 * \since REMARKS_API_VERSION=0
270 extern LLVMRemarkEntryRef
LLVMRemarkParserGetNext(LLVMRemarkParserRef Parser
);
273 * Returns `1` if the parser encountered an error while parsing the buffer.
275 * \since REMARKS_API_VERSION=0
277 extern LLVMBool
LLVMRemarkParserHasError(LLVMRemarkParserRef Parser
);
280 * Returns a null-terminated string containing an error message.
282 * In case of no error, the result is `NULL`.
284 * The memory of the string is bound to the lifetime of \p Parser. If
285 * LLVMRemarkParserDispose() is called, the memory of the string will be
288 * \since REMARKS_API_VERSION=0
290 extern const char *LLVMRemarkParserGetErrorMessage(LLVMRemarkParserRef Parser
);
293 * Releases all the resources used by \p Parser.
295 * \since REMARKS_API_VERSION=0
297 extern void LLVMRemarkParserDispose(LLVMRemarkParserRef Parser
);
300 * Returns the version of the remarks library.
302 * \since REMARKS_API_VERSION=0
304 extern uint32_t LLVMRemarkVersion(void);
307 * @} // endgoup LLVMCREMARKS
312 #endif /* !defined(__cplusplus) */
314 #endif /* LLVM_C_REMARKS_H */