198 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			198 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
| /*===-- llvm-c/OptRemarks.h - OptRemarks Public C Interface -------*- C -*-===*\
 | |
| |*                                                                            *|
 | |
| |*                     The LLVM Compiler Infrastructure                       *|
 | |
| |*                                                                            *|
 | |
| |* This file is distributed under the University of Illinois Open Source      *|
 | |
| |* License. See LICENSE.TXT for details.                                      *|
 | |
| |*                                                                            *|
 | |
| |*===----------------------------------------------------------------------===*|
 | |
| |*                                                                            *|
 | |
| |* This header provides a public interface to an opt-remark library.          *|
 | |
| |* LLVM provides an implementation of this interface.                         *|
 | |
| |*                                                                            *|
 | |
| \*===----------------------------------------------------------------------===*/
 | |
| 
 | |
| #ifndef LLVM_C_OPT_REMARKS_H
 | |
| #define LLVM_C_OPT_REMARKS_H
 | |
| 
 | |
| #include "llvm-c/Core.h"
 | |
| #include "llvm-c/Types.h"
 | |
| #ifdef __cplusplus
 | |
| #include <cstddef>
 | |
| extern "C" {
 | |
| #else
 | |
| #include <stddef.h>
 | |
| #endif /* !defined(__cplusplus) */
 | |
| 
 | |
| /**
 | |
|  * @defgroup LLVMCOPTREMARKS OptRemarks
 | |
|  * @ingroup LLVMC
 | |
|  *
 | |
|  * @{
 | |
|  */
 | |
| 
 | |
| #define OPT_REMARKS_API_VERSION 0
 | |
| 
 | |
| /**
 | |
|  * String containing a buffer and a length. The buffer is not guaranteed to be
 | |
|  * zero-terminated.
 | |
|  *
 | |
|  * \since OPT_REMARKS_API_VERSION=0
 | |
|  */
 | |
| typedef struct {
 | |
|   const char *Str;
 | |
|   uint32_t Len;
 | |
| } LLVMOptRemarkStringRef;
 | |
| 
 | |
| /**
 | |
|  * DebugLoc containing File, Line and Column.
 | |
|  *
 | |
|  * \since OPT_REMARKS_API_VERSION=0
 | |
|  */
 | |
| typedef struct {
 | |
|   // File:
 | |
|   LLVMOptRemarkStringRef SourceFile;
 | |
|   // Line:
 | |
|   uint32_t SourceLineNumber;
 | |
|   // Column:
 | |
|   uint32_t SourceColumnNumber;
 | |
| } LLVMOptRemarkDebugLoc;
 | |
| 
 | |
| /**
 | |
|  * Element of the "Args" list. The key might give more information about what
 | |
|  * are the semantics of the value, e.g. "Callee" will tell you that the value
 | |
|  * is a symbol that names a function.
 | |
|  *
 | |
|  * \since OPT_REMARKS_API_VERSION=0
 | |
|  */
 | |
| typedef struct {
 | |
|   // e.g. "Callee"
 | |
|   LLVMOptRemarkStringRef Key;
 | |
|   // e.g. "malloc"
 | |
|   LLVMOptRemarkStringRef Value;
 | |
| 
 | |
|   // "DebugLoc": Optional
 | |
|   LLVMOptRemarkDebugLoc DebugLoc;
 | |
| } LLVMOptRemarkArg;
 | |
| 
 | |
| /**
 | |
|  * One remark entry.
 | |
|  *
 | |
|  * \since OPT_REMARKS_API_VERSION=0
 | |
|  */
 | |
| typedef struct {
 | |
|   // e.g. !Missed, !Passed
 | |
|   LLVMOptRemarkStringRef RemarkType;
 | |
|   // "Pass": Required
 | |
|   LLVMOptRemarkStringRef PassName;
 | |
|   // "Name": Required
 | |
|   LLVMOptRemarkStringRef RemarkName;
 | |
|   // "Function": Required
 | |
|   LLVMOptRemarkStringRef FunctionName;
 | |
| 
 | |
|   // "DebugLoc": Optional
 | |
|   LLVMOptRemarkDebugLoc DebugLoc;
 | |
|   // "Hotness": Optional
 | |
|   uint32_t Hotness;
 | |
|   // "Args": Optional. It is an array of `num_args` elements.
 | |
|   uint32_t NumArgs;
 | |
|   LLVMOptRemarkArg *Args;
 | |
| } LLVMOptRemarkEntry;
 | |
| 
 | |
| typedef struct LLVMOptRemarkOpaqueParser *LLVMOptRemarkParserRef;
 | |
| 
 | |
| /**
 | |
|  * Creates a remark parser that can be used to read and parse the buffer located
 | |
|  * in \p Buf of size \p Size.
 | |
|  *
 | |
|  * \p Buf cannot be NULL.
 | |
|  *
 | |
|  * This function should be paired with LLVMOptRemarkParserDispose() to avoid
 | |
|  * leaking resources.
 | |
|  *
 | |
|  * \since OPT_REMARKS_API_VERSION=0
 | |
|  */
 | |
| extern LLVMOptRemarkParserRef LLVMOptRemarkParserCreate(const void *Buf,
 | |
|                                                         uint64_t Size);
 | |
| 
 | |
| /**
 | |
|  * Returns the next remark in the file.
 | |
|  *
 | |
|  * The value pointed to by the return value is invalidated by the next call to
 | |
|  * LLVMOptRemarkParserGetNext().
 | |
|  *
 | |
|  * 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) LLVMOptRemarkParserHasError() will return `1`.
 | |
|  *
 | |
|  * 2) LLVMOptRemarkParserGetErrorMessage() will return a descriptive error
 | |
|  *    message.
 | |
|  *
 | |
|  * An error may occur if:
 | |
|  *
 | |
|  * 1) An argument is invalid.
 | |
|  *
 | |
|  * 2) There is a YAML parsing error. This type of error aborts parsing
 | |
|  *    immediately and returns `1`. It can occur on malformed YAML.
 | |
|  *
 | |
|  * 3) Remark parsing error. If this type of error occurs, the parser won't call
 | |
|  *    the handler and will continue to the next one. It can occur on malformed
 | |
|  *    remarks, like missing or extra fields in the file.
 | |
|  *
 | |
|  * Here is a quick example of the usage:
 | |
|  *
 | |
|  * ```
 | |
|  *  LLVMOptRemarkParserRef Parser = LLVMOptRemarkParserCreate(Buf, Size);
 | |
|  *  LLVMOptRemarkEntry *Remark = NULL;
 | |
|  *  while ((Remark == LLVMOptRemarkParserGetNext(Parser))) {
 | |
|  *    // use Remark
 | |
|  *  }
 | |
|  *  bool HasError = LLVMOptRemarkParserHasError(Parser);
 | |
|  *  LLVMOptRemarkParserDispose(Parser);
 | |
|  * ```
 | |
|  *
 | |
|  * \since OPT_REMARKS_API_VERSION=0
 | |
|  */
 | |
| extern LLVMOptRemarkEntry *
 | |
| LLVMOptRemarkParserGetNext(LLVMOptRemarkParserRef Parser);
 | |
| 
 | |
| /**
 | |
|  * Returns `1` if the parser encountered an error while parsing the buffer.
 | |
|  *
 | |
|  * \since OPT_REMARKS_API_VERSION=0
 | |
|  */
 | |
| extern LLVMBool LLVMOptRemarkParserHasError(LLVMOptRemarkParserRef 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
 | |
|  * LLVMOptRemarkParserDispose() is called, the memory of the string will be
 | |
|  * released.
 | |
|  *
 | |
|  * \since OPT_REMARKS_API_VERSION=0
 | |
|  */
 | |
| extern const char *
 | |
| LLVMOptRemarkParserGetErrorMessage(LLVMOptRemarkParserRef Parser);
 | |
| 
 | |
| /**
 | |
|  * Releases all the resources used by \p Parser.
 | |
|  *
 | |
|  * \since OPT_REMARKS_API_VERSION=0
 | |
|  */
 | |
| extern void LLVMOptRemarkParserDispose(LLVMOptRemarkParserRef Parser);
 | |
| 
 | |
| /**
 | |
|  * @} // endgoup LLVMCOPTREMARKS
 | |
|  */
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif /* !defined(__cplusplus) */
 | |
| 
 | |
| #endif /* LLVM_C_OPT_REMARKS_H */
 |