- /*===-- llvm-c/Remarks.h - Remarks Public C Interface -------------*- C -*-===*\ 
- |*                                                                            *| 
- |* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *| 
- |* Exceptions.                                                                *| 
- |* See https://llvm.org/LICENSE.txt for license information.                  *| 
- |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *| 
- |*                                                                            *| 
- |*===----------------------------------------------------------------------===*| 
- |*                                                                            *| 
- |* This header provides a public interface to a remark diagnostics library.   *| 
- |* LLVM provides an implementation of this interface.                         *| 
- |*                                                                            *| 
- \*===----------------------------------------------------------------------===*/ 
-   
- #ifndef LLVM_C_REMARKS_H 
- #define LLVM_C_REMARKS_H 
-   
- #include "llvm-c/ExternC.h" 
- #include "llvm-c/Types.h" 
- #ifdef __cplusplus 
- #include <cstddef> 
- #else 
- #include <stddef.h> 
- #endif /* !defined(__cplusplus) */ 
-   
- LLVM_C_EXTERN_C_BEGIN 
-   
- /** 
-  * @defgroup LLVMCREMARKS Remarks 
-  * @ingroup LLVMC 
-  * 
-  * @{ 
-  */ 
-   
- // 0 -> 1: Bitstream remarks support. 
- #define REMARKS_API_VERSION 1 
-   
- /** 
-  * The type of the emitted remark. 
-  */ 
- enum LLVMRemarkType { 
-   LLVMRemarkTypeUnknown, 
-   LLVMRemarkTypePassed, 
-   LLVMRemarkTypeMissed, 
-   LLVMRemarkTypeAnalysis, 
-   LLVMRemarkTypeAnalysisFPCommute, 
-   LLVMRemarkTypeAnalysisAliasing, 
-   LLVMRemarkTypeFailure 
- }; 
-   
- /** 
-  * String containing a buffer and a length. The buffer is not guaranteed to be 
-  * zero-terminated. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- typedef struct LLVMRemarkOpaqueString *LLVMRemarkStringRef; 
-   
- /** 
-  * Returns the buffer holding the string. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern const char *LLVMRemarkStringGetData(LLVMRemarkStringRef String); 
-   
- /** 
-  * Returns the size of the string. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern uint32_t LLVMRemarkStringGetLen(LLVMRemarkStringRef String); 
-   
- /** 
-  * DebugLoc containing File, Line and Column. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- typedef struct LLVMRemarkOpaqueDebugLoc *LLVMRemarkDebugLocRef; 
-   
- /** 
-  * Return the path to the source file for a debug location. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern LLVMRemarkStringRef 
- LLVMRemarkDebugLocGetSourceFilePath(LLVMRemarkDebugLocRef DL); 
-   
- /** 
-  * Return the line in the source file for a debug location. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern uint32_t LLVMRemarkDebugLocGetSourceLine(LLVMRemarkDebugLocRef DL); 
-   
- /** 
-  * Return the column in the source file for a debug location. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern uint32_t LLVMRemarkDebugLocGetSourceColumn(LLVMRemarkDebugLocRef DL); 
-   
- /** 
-  * Element of the "Args" list. The key might give more information about what 
-  * the semantics of the value are, e.g. "Callee" will tell you that the value 
-  * is a symbol that names a function. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- typedef struct LLVMRemarkOpaqueArg *LLVMRemarkArgRef; 
-   
- /** 
-  * Returns the key of an argument. The key defines what the value is, and the 
-  * same key can appear multiple times in the list of arguments. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern LLVMRemarkStringRef LLVMRemarkArgGetKey(LLVMRemarkArgRef Arg); 
-   
- /** 
-  * Returns the value of an argument. This is a string that can contain newlines. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern LLVMRemarkStringRef LLVMRemarkArgGetValue(LLVMRemarkArgRef Arg); 
-   
- /** 
-  * Returns the debug location that is attached to the value of this argument. 
-  * 
-  * If there is no debug location, the return value will be `NULL`. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern LLVMRemarkDebugLocRef LLVMRemarkArgGetDebugLoc(LLVMRemarkArgRef Arg); 
-   
- /** 
-  * A remark emitted by the compiler. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- typedef struct LLVMRemarkOpaqueEntry *LLVMRemarkEntryRef; 
-   
- /** 
-  * Free the resources used by the remark entry. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern void LLVMRemarkEntryDispose(LLVMRemarkEntryRef Remark); 
-   
- /** 
-  * The type of the remark. For example, it can allow users to only keep the 
-  * missed optimizations from the compiler. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern enum LLVMRemarkType LLVMRemarkEntryGetType(LLVMRemarkEntryRef Remark); 
-   
- /** 
-  * Get the name of the pass that emitted this remark. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern LLVMRemarkStringRef 
- LLVMRemarkEntryGetPassName(LLVMRemarkEntryRef Remark); 
-   
- /** 
-  * Get an identifier of the remark. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern LLVMRemarkStringRef 
- LLVMRemarkEntryGetRemarkName(LLVMRemarkEntryRef Remark); 
-   
- /** 
-  * Get the name of the function being processed when the remark was emitted. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern LLVMRemarkStringRef 
- LLVMRemarkEntryGetFunctionName(LLVMRemarkEntryRef Remark); 
-   
- /** 
-  * Returns the debug location that is attached to this remark. 
-  * 
-  * If there is no debug location, the return value will be `NULL`. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern LLVMRemarkDebugLocRef 
- LLVMRemarkEntryGetDebugLoc(LLVMRemarkEntryRef Remark); 
-   
- /** 
-  * Return the hotness of the remark. 
-  * 
-  * A hotness of `0` means this value is not set. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern uint64_t LLVMRemarkEntryGetHotness(LLVMRemarkEntryRef Remark); 
-   
- /** 
-  * The number of arguments the remark holds. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern uint32_t LLVMRemarkEntryGetNumArgs(LLVMRemarkEntryRef Remark); 
-   
- /** 
-  * Get a new iterator to iterate over a remark's argument. 
-  * 
-  * If there are no arguments in \p Remark, the return value will be `NULL`. 
-  * 
-  * The lifetime of the returned value is bound to the lifetime of \p Remark. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern LLVMRemarkArgRef LLVMRemarkEntryGetFirstArg(LLVMRemarkEntryRef Remark); 
-   
- /** 
-  * Get the next argument in \p Remark from the position of \p It. 
-  * 
-  * Returns `NULL` if there are no more arguments available. 
-  * 
-  * The lifetime of the returned value is bound to the lifetime of \p Remark. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern LLVMRemarkArgRef LLVMRemarkEntryGetNextArg(LLVMRemarkArgRef It, 
-                                                   LLVMRemarkEntryRef Remark); 
-   
- typedef struct LLVMRemarkOpaqueParser *LLVMRemarkParserRef; 
-   
- /** 
-  * Creates a remark parser that can be used to parse the buffer located in \p 
-  * Buf of size \p Size bytes. 
-  * 
-  * \p Buf cannot be `NULL`. 
-  * 
-  * This function should be paired with LLVMRemarkParserDispose() to avoid 
-  * leaking resources. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern LLVMRemarkParserRef LLVMRemarkParserCreateYAML(const void *Buf, 
-                                                       uint64_t Size); 
-   
- /** 
-  * Creates a remark parser that can be used to parse the buffer located in \p 
-  * Buf of size \p Size bytes. 
-  * 
-  * \p Buf cannot be `NULL`. 
-  * 
-  * This function should be paired with LLVMRemarkParserDispose() to avoid 
-  * leaking resources. 
-  * 
-  * \since REMARKS_API_VERSION=1 
-  */ 
- extern LLVMRemarkParserRef LLVMRemarkParserCreateBitstream(const void *Buf, 
-                                                            uint64_t Size); 
-   
- /** 
-  * Returns the next remark in the file. 
-  * 
-  * The value pointed to by the return value needs to be disposed using a call to 
-  * LLVMRemarkEntryDispose(). 
-  * 
-  * All the entries in the returned value that are of LLVMRemarkStringRef type 
-  * will become invalidated once a call to LLVMRemarkParserDispose is made. 
-  * 
-  * If the parser reaches the end of the buffer, the return value will be `NULL`. 
-  * 
-  * In the case of an error, the return value will be `NULL`, and: 
-  * 
-  * 1) LLVMRemarkParserHasError() will return `1`. 
-  * 
-  * 2) LLVMRemarkParserGetErrorMessage() will return a descriptive error 
-  *    message. 
-  * 
-  * An error may occur if: 
-  * 
-  * 1) An argument is invalid. 
-  * 
-  * 2) There is a parsing error. This can occur on things like malformed YAML. 
-  * 
-  * 3) There is a Remark semantic error. This can occur on well-formed files with 
-  *    missing or extra fields. 
-  * 
-  * Here is a quick example of the usage: 
-  * 
-  * ``` 
-  * LLVMRemarkParserRef Parser = LLVMRemarkParserCreateYAML(Buf, Size); 
-  * LLVMRemarkEntryRef Remark = NULL; 
-  * while ((Remark = LLVMRemarkParserGetNext(Parser))) { 
-  *    // use Remark 
-  *    LLVMRemarkEntryDispose(Remark); // Release memory. 
-  * } 
-  * bool HasError = LLVMRemarkParserHasError(Parser); 
-  * LLVMRemarkParserDispose(Parser); 
-  * ``` 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern LLVMRemarkEntryRef LLVMRemarkParserGetNext(LLVMRemarkParserRef Parser); 
-   
- /** 
-  * Returns `1` if the parser encountered an error while parsing the buffer. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern LLVMBool LLVMRemarkParserHasError(LLVMRemarkParserRef Parser); 
-   
- /** 
-  * Returns a null-terminated string containing an error message. 
-  * 
-  * In case of no error, the result is `NULL`. 
-  * 
-  * The memory of the string is bound to the lifetime of \p Parser. If 
-  * LLVMRemarkParserDispose() is called, the memory of the string will be 
-  * released. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern const char *LLVMRemarkParserGetErrorMessage(LLVMRemarkParserRef Parser); 
-   
- /** 
-  * Releases all the resources used by \p Parser. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern void LLVMRemarkParserDispose(LLVMRemarkParserRef Parser); 
-   
- /** 
-  * Returns the version of the remarks library. 
-  * 
-  * \since REMARKS_API_VERSION=0 
-  */ 
- extern uint32_t LLVMRemarkVersion(void); 
-   
- /** 
-  * @} // endgoup LLVMCREMARKS 
-  */ 
-   
- LLVM_C_EXTERN_C_END 
-   
- #endif /* LLVM_C_REMARKS_H */ 
-