Files
UnrealEngine/Engine/Plugins/Experimental/NNERuntimeIREE/Source/ThirdParty/NNEMlirTools/Internal/NNEMlirTools.h
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

97 lines
4.2 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
// NNEMlirTools.h - minimal C API for introspecting MLIR modules via LLVM/MLIR.
// The interface is provided as a single, versioned function table to ensure
// binary compatibility across builds and convenient manual loading.
// All objects are opaque handles that are released with the corresponding 'Release' functions.
//
// The API and its handles are not thread-safe.
#pragma once
#include <cstdint>
#include <cstddef>
#if defined(NNEMLIR_EXPORT)
#if defined(_MSC_VER)
#define NNEMLIR_API __declspec(dllexport)
#define NNEMLIR_CALL __cdecl
#elif defined(__GNUC__)
#define NNEMLIR_API __attribute__((visibility("default")))
#define NNEMLIR_CALL
#else
#error "Unsupported platform for NNEMLIR export"
#endif
#else
#define NNEMLIR_API
#define NNEMLIR_CALL
#endif
#ifdef __cplusplus
extern "C" {
#endif
/// Success / error codes returned through NNEMlirStatus.
typedef enum {
NNEMLIR_SUCCESS = 0, ///< Operation completed successfully.
NNEMLIR_ERR_PARSE_FAILED = 1, ///< Parsing of file/buffer failed.
NNEMLIR_ERR_BAD_ARGUMENT = 2, ///< Operation received invalid argument.
NNEMLIR_ERR_INTERNAL = 0x7FFF ///< Unexpected internal failure.
} NNEMlirStatusCode;
/// Opaque handles
struct NNEMlirStatus_s; typedef struct NNEMlirStatus_s* NNEMlirStatus; ///< Status result of an API call.
struct NNEMlirContext_s; typedef struct NNEMlirContext_s* NNEMlirContext; ///< Context, contains MLIRContext with registered dialects.
struct NNEMlirModule_s; typedef struct NNEMlirModule_s* NNEMlirModule; ///< Parsed MLIR module.
struct NNEMlirFunction_s; typedef struct NNEMlirFunction_s* NNEMlirFunction; ///< (Public) function within a module.
struct NNEMlirValue_s; typedef struct NNEMlirValue_s* NNEMlirValue; ///< Function argument or result.
/// ABI version
#define NNEMLIR_ABI_VERSION 1u
/// Function table
typedef struct NNEMlirApi {
uint32_t AbiVersion; ///< Must equal NNEMLIR_ABI_VERSION
uint32_t StructSize; ///< sizeof(NNEMlirApi)
/* Status helpers */
const char* (NNEMLIR_CALL *StatusToString) (NNEMlirStatus);
NNEMlirStatusCode (NNEMLIR_CALL *GetStatusCode) (NNEMlirStatus);
/* Context & parsing */
NNEMlirContext (NNEMLIR_CALL *CreateContext) (void);
NNEMlirStatus (NNEMLIR_CALL *ParseModuleFromBuffer) (NNEMlirContext,const char* /* Buffer ptr (null-termination not required) */,size_t /* Buffer size */,NNEMlirModule*);
NNEMlirStatus (NNEMLIR_CALL *ParseModuleFromFile) (NNEMlirContext,const char* /* Path to MLIR file */,NNEMlirModule*);
/* Module-level introspection */
size_t (NNEMLIR_CALL *GetPublicFunctionCount)(NNEMlirModule);
NNEMlirFunction (NNEMLIR_CALL *GetPublicFunction) (NNEMlirModule,size_t);
/* Function-level introspection */
const char* (NNEMLIR_CALL *GetFunctionName) (NNEMlirFunction);
size_t (NNEMLIR_CALL *GetInputCount) (NNEMlirFunction);
size_t (NNEMLIR_CALL *GetResultCount) (NNEMlirFunction);
NNEMlirValue (NNEMLIR_CALL *GetInputValue) (NNEMlirFunction,size_t);
NNEMlirValue (NNEMLIR_CALL *GetResultValue) (NNEMlirFunction,size_t);
/* Value-level introspection */
const char* (NNEMLIR_CALL *GetValueName) (NNEMlirValue); ///< nullptr if unnamed.
const char* (NNEMLIR_CALL *GetValueTypeText) (NNEMlirValue); ///< E.g. "tensor<4x16xf32>".
const char* (NNEMLIR_CALL *GetElementTypeText) (NNEMlirValue); ///< Element type only, e.g. "f32".
size_t (NNEMLIR_CALL *GetShape) (NNEMlirValue,int64_t*,size_t);
/* Release opaque handles */
void (NNEMLIR_CALL *ReleaseStatus) (NNEMlirStatus);
void (NNEMLIR_CALL *ReleaseContext) (NNEMlirContext);
void (NNEMLIR_CALL *ReleaseModule) (NNEMlirModule);
void (NNEMLIR_CALL *ReleaseFunction) (NNEMlirFunction);
void (NNEMLIR_CALL *ReleaseValue) (NNEMlirValue);
} NNEMlirApi;
/// Returns a pointer to the global NNEMlirApi or nullptr if the requested
/// minimum ABI version is newer than the implementation.
NNEMLIR_API const NNEMlirApi* NNEMLIR_CALL NNEMlirGetInterface(uint32_t MinVersion);
#ifdef __cplusplus
} /* extern "C" */
#endif