blob: 9d2f3cff5c6e543110d1684a6205ba9067682db2 [file]
// 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 internals
//===----------------------------------------------------------------------===//
// iree_status_payload_type_t is defined in status.h (public API).
typedef struct iree_status_storage_t iree_status_storage_t;
// Formats a payload into a human-readable string with snprintf-style
// semantics: |out_buffer_length| is always set to the total number of
// characters required to format the entire payload excluding the NUL
// terminator, even if |buffer_capacity| is insufficient. If |buffer| is
// provided then as much of the payload as fits is written NUL-terminated;
// implementations must never write at or beyond |buffer| + |buffer_capacity|.
// If |buffer| is NULL then no characters are written (measurement pass).
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;
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_