blob: 47328053e08e36a8d09dc6b4956b49ab231a2aca [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 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_