| // Copyright 2024 The IREE Authors |
| // |
| // Licensed 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 |
| |
| #ifndef IREE_BASE_STATUS_PAYLOAD_H_ |
| #define IREE_BASE_STATUS_PAYLOAD_H_ |
| |
| #include "iree/base/allocator.h" |
| #include "iree/base/status.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif // __cplusplus |
| |
| //===----------------------------------------------------------------------===// |
| // Status payload API |
| //===----------------------------------------------------------------------===// |
| |
| typedef struct iree_status_storage_t iree_status_storage_t; |
| |
| // Defines the type of an iree_status_payload_t. |
| typedef enum iree_status_payload_type_e { |
| // Opaque; payload may still be formatted by a formatter but is not possible |
| // to retrieve by the programmatic APIs. |
| IREE_STATUS_PAYLOAD_TYPE_OPAQUE = 0, |
| // A string message annotation of type iree_status_payload_message_t. |
| IREE_STATUS_PAYLOAD_TYPE_MESSAGE = 1, |
| // Platform-dependent stack trace in iree_status_payload_stack_trace_t. |
| IREE_STATUS_PAYLOAD_TYPE_STACK_TRACE = 2, |
| // Starting type ID for user payloads. IREE reserves all payloads with types |
| // less than this. |
| IREE_STATUS_PAYLOAD_TYPE_MIN_USER = 0x70000000u, |
| } iree_status_payload_type_t; |
| |
| typedef struct iree_status_payload_t iree_status_payload_t; |
| |
| // Function that formats a payload into a human-readable string form for logs. |
| typedef void(IREE_API_PTR* iree_status_payload_formatter_t)( |
| const iree_status_payload_t* payload, iree_host_size_t buffer_capacity, |
| char* buffer, iree_host_size_t* out_buffer_length); |
| |
| // Header for optional status payloads. |
| // Each status may have zero or more payloads associated with it that can later |
| // be used to produce more detailed logging or programmatically query |
| // information about an error. |
| struct iree_status_payload_t { |
| // Next payload in the status payload linked list. |
| struct iree_status_payload_t* next; |
| // Payload type identifier used for programmatic access to payloads. May be |
| // IREE_STATUS_PAYLOAD_TYPE_OPAQUE if the payload cannot be accessed directly. |
| iree_status_payload_type_t type; |
| // Allocator used for the payload and associated resources. |
| iree_allocator_t allocator; |
| // String formatter callback used to write the payload into a string buffer. |
| // If not present then the payload will be mentioned but not dumped when the |
| // status is logged. |
| iree_status_payload_formatter_t formatter; |
| }; |
| |
| // A string message (IREE_STATUS_PAYLOAD_TYPE_MESSAGE). |
| typedef struct iree_status_payload_message_t { |
| iree_status_payload_t header; |
| // String data reference. May point to an address immediately following this |
| // struct (if copied) or a constant string reference in rodata. |
| iree_string_view_t message; |
| } iree_status_payload_message_t; |
| |
| // A platform-dependent stack trace (IREE_STATUS_PAYLOAD_TYPE_STACK_TRACE). |
| typedef struct iree_status_payload_stack_trace_t { |
| iree_status_payload_t header; |
| uint16_t skip_frames; |
| uint16_t frame_count; |
| uintptr_t addresses[]; |
| } iree_status_payload_stack_trace_t; |
| |
| // TODO(benvanik): expose API for appending/enumerating payloads. |
| // Currently this is an implementation detail. |
| iree_status_t iree_status_append_payload(iree_status_t status, |
| iree_status_storage_t* storage, |
| iree_status_payload_t* payload); |
| |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif // __cplusplus |
| |
| #endif // IREE_BASE_STATUS_PAYLOAD_H_ |