blob: d56dbcf6d415d22c0f70f69b318654c606ec862c [file] [log] [blame]
// Copyright 2022 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
// Top-level compiler embedding API. This API is stable and intended to provide
// ABI stability across releases. It should be sufficient to construct tools
// and JITs which operate at the level of granularity of input and output
// artifacts.
//
// See the bottom of the file for unstable entrypoints which allow conversion
// to/from corresponding entities in the MLIR C API. These can be used for
// tools that hard-link to the compiler but are not available via runtime
// loaded stubs.
#ifndef IREE_COMPILER_EMBEDDING_API_H
#define IREE_COMPILER_EMBEDDING_API_H
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include "iree/compiler/api_support.h"
#ifdef __cplusplus
extern "C" {
#endif
// Opaque structures.
typedef struct iree_compiler_error_t iree_compiler_error_t;
typedef struct iree_compiler_session_t iree_compiler_session_t;
typedef struct iree_compiler_invocation_t iree_compiler_invocation_t;
typedef struct iree_compiler_source_t iree_compiler_source_t;
typedef struct iree_compiler_output_t iree_compiler_output_t;
//===----------------------------------------------------------------------===//
// Errors.
// Most compilation errors are routed through the diagnostic engine, but
// some errors are returned immediately. In this case, an API function will
// return an `iree_compiler_error_t*` which will be nullptr on success and
// an error on failure. When a non-null error is returned, it must be freed
// via `ireeCompilerErrorDestroy()`.
//===----------------------------------------------------------------------===//
// Destroys an error. Only non-nullptr errors must be destroyed, but it is
// legal to destroy nullptr.
IREE_EMBED_EXPORTED void ireeCompilerErrorDestroy(iree_compiler_error_t *error);
// Gets the message associated with the error as a C-string. The string will be
// valid until the error is destroyed.
IREE_EMBED_EXPORTED const char *
ireeCompilerErrorGetMessage(iree_compiler_error_t *error);
//===----------------------------------------------------------------------===//
// Global initialization.
//===----------------------------------------------------------------------===//
// Gets the version of the API that this compiler exports.
// The version is encoded with the lower 16 bits containing the minor version
// and upper bits containing the major version.
// The compiler API is versioned. Within a major version, symbols may be
// added, but existing symbols must not be removed or changed to alter
// previously exposed functionality. A major version bump implies an API
// break and no forward or backward compatibility is assumed across major
// versions.
IREE_EMBED_EXPORTED int ireeCompilerGetAPIVersion();
// The compiler must be globally initialized before further use.
// It is intended to be called as part of the hosting process's startup
// sequence. Any failures that it can encounter are fatal and will abort
// the process.
// It is legal to call this multiple times, and each call must be balanced
// by a call to |ireeCompilerGlobalShutdown|. The final shutdown call will
// permanently disable the compiler for the process and subsequent calls
// to initialize will fail/abort. If this is not desirable, some higher level
// code must hold initialization open with its own call.
IREE_EMBED_EXPORTED void ireeCompilerGlobalInitialize();
// Gets the build revision of the IREE compiler. In official releases, this
// will be a string with the build tag. In development builds, it may be an
// empty string. The returned is valid for as long as the compiler is
// initialized.
// Available since: 1.1
IREE_EMBED_EXPORTED const char *ireeCompilerGetRevision();
// Processes an argc/argv from main() using platform specific dark magic,
// possibly updating them in-place to cleaned up values. On most systems,
// this is a no-op. However, on Windows, this will do various processing
// to extract the original command line and decode it properly as UTF-8.
// It is therefore essential that this be passed the actual argc/argv to main
// and not some permutation of it. Any updated argv will persist until a
// final call to |ireeCompilerGlobalShutdown|. This must be called after
// |ireeCompilerGlobalInitialize|.
//
// We're really sorry about this. Old platforms are annoying.
// This API is not yet considered version-stable. If using out of tree, please
// contact the developers.
IREE_EMBED_EXPORTED void ireeCompilerGetProcessCLArgs(int *argc,
const char ***argv);
// Initializes the command line environment from an explicit argc/argv
// (typically the result of a prior call to ireeCompilerGetProcessCLArgs).
// This uses dark magic to setup the usual array of expected signal handlers.
// This API is not yet considered version-stable. If using out of tree, please
// contact the developers.
//
// Note that there is as yet no facility to register new global command line
// options from the C API. However, this facility should be sufficient for
// subordinating builtin command line options to a higher level integration
// by tunneling global options into the initialization sequence.
IREE_EMBED_EXPORTED void ireeCompilerSetupGlobalCL(int argc, const char **argv,
const char *banner,
bool installSignalHandlers);
// Destroys any process level resources that the compiler may have created.
// This must be called prior to library unloading.
IREE_EMBED_EXPORTED void ireeCompilerGlobalShutdown();
// Invokes a callback with each registered HAL target backend.
//
// This is really only suitable for global CLI-like tools, as plugins may
// register target backends and plugins are activated at the session level.
IREE_EMBED_EXPORTED void ireeCompilerEnumerateRegisteredHALTargetBackends(
void (*callback)(const char *backend, void *userData), void *userData);
// Enumerates all plugins that are linked into the compiler.
// Available since: 1.2
IREE_EMBED_EXPORTED void ireeCompilerEnumeratePlugins(
void (*callback)(const char *pluginName, void *userData), void *userData);
//===----------------------------------------------------------------------===//
// Session management.
// A session represents a scope where one or more runs can be executed.
// Internally, it consists of an MLIRContext and a private set of session
// options. If the CL environment was initialized, session options will be
// bootstrapped from global flags.
//
// Session creation cannot fail in a non-fatal way.
//===----------------------------------------------------------------------===//
// Creates a new session (which must be destroyed by
// ireeCompilerSessionDestroy).
IREE_EMBED_EXPORTED iree_compiler_session_t *ireeCompilerSessionCreate();
// Destroys a session.
IREE_EMBED_EXPORTED void
ireeCompilerSessionDestroy(iree_compiler_session_t *session);
// Sets session-local flags. These are a subset of flags supported by CLI
// tools and are privately scoped.
IREE_EMBED_EXPORTED iree_compiler_error_t *
ireeCompilerSessionSetFlags(iree_compiler_session_t *session, int argc,
const char *const *argv);
// Gets textual flags actually in effect from any source. Optionally, only
// calls back for non-default valued flags.
IREE_EMBED_EXPORTED void ireeCompilerSessionGetFlags(
iree_compiler_session_t *session, bool nonDefaultOnly,
void (*onFlag)(const char *flag, size_t length, void *), void *userData);
//===----------------------------------------------------------------------===//
// Run management.
// Runs execute against a session and represent a discrete invocation of the
// compiler.
//===----------------------------------------------------------------------===//
enum iree_compiler_diagnostic_severity_t {
IREE_COMPILER_DIAGNOSTIC_SEVERITY_NOTE = 0,
IREE_COMPILER_DIAGNOSTIC_SEVERITY_WARNING = 1,
IREE_COMPILER_DIAGNOSTIC_SEVERITY_ERROR = 2,
IREE_COMPILER_DIAGNOSTIC_SEVERITY_REMARK = 3,
};
IREE_EMBED_EXPORTED iree_compiler_invocation_t *
ireeCompilerInvocationCreate(iree_compiler_session_t *session);
// Enables a callback to receive diagnostics. This is targeted at API use of
// the compiler, allowing fine grained collection of formatted diagnostic
// records. It is not completely identical to
// |ireeCompilerInvocationEnableConsoleDiagnostics| which produces output
// suitable for an interactive stream (including color detection, etc) and has
// additional features for reading source files, etc. With default flags, no
// system state outside of the session will be used (i.e. no debug information
// loaded from files, etc).
// The |flags| parameter is reserved for the future and must be 0.
// The |callback| may be invoked from any thread at any time prior to
// destruction of the invocation. The callback should not make any calls back
// into compiler APIs.
// The |message| passes to the callback is only valid for the duration of
// the callback and the |messageSize| does not include a terminator nul.
IREE_EMBED_EXPORTED void ireeCompilerInvocationEnableCallbackDiagnostics(
iree_compiler_invocation_t *inv, int flags,
void (*callback)(enum iree_compiler_diagnostic_severity_t severity,
const char *message, size_t messageSize, void *userData),
void *userData);
// Enables default, pretty-printed diagnostics to the console. This is usually
// the right thing to do for command-line tools, but other mechanisms are
// preferred for library use.
IREE_EMBED_EXPORTED void
ireeCompilerInvocationEnableConsoleDiagnostics(iree_compiler_invocation_t *inv);
// Destroys a run.
IREE_EMBED_EXPORTED void
ireeCompilerInvocationDestroy(iree_compiler_invocation_t *inv);
// Sets a crash handler on the invocation. In the event of a crash, the callback
// will be invoked to create an output which will receive the crash dump.
// The callback should either set |*outOutput| to a new |iree_compiler_output_t|
// or return an error. Ownership of the output is passed to the caller.
// The implementation implicitly calls |ireeCompilerOutputKeep| on the
// output.
IREE_EMBED_EXPORTED void ireeCompilerInvocationSetCrashHandler(
iree_compiler_invocation_t *inv, bool genLocalReproducer,
iree_compiler_error_t *(*onCrashCallback)(
iree_compiler_output_t **outOutput, void *userData),
void *userData);
// Parses a source into this instance in preparation for performing a
// compilation action.
// Returns false and emits diagnostics on failure.
IREE_EMBED_EXPORTED bool
ireeCompilerInvocationParseSource(iree_compiler_invocation_t *inv,
iree_compiler_source_t *source);
// Sets a mnemonic phase name to run compilation from. Default is "input".
// The meaning of this is pipeline specific. See IREEVMPipelinePhase
// for the standard pipeline.
// Available since: 1.3
IREE_EMBED_EXPORTED void
ireeCompilerInvocationSetCompileFromPhase(iree_compiler_invocation_t *inv,
const char *phase);
// Sets a mnemonic phase name to run compilation to. Default is "end".
// The meaning of this is pipeline specific. See IREEVMPipelinePhase
// for the standard pipeline.
IREE_EMBED_EXPORTED void
ireeCompilerInvocationSetCompileToPhase(iree_compiler_invocation_t *inv,
const char *phase);
// Enables/disables verification of IR after each pass. Defaults to enabled.
IREE_EMBED_EXPORTED void
ireeCompilerInvocationSetVerifyIR(iree_compiler_invocation_t *inv, bool enable);
// Runs a compilation pipeline.
// Returns false and emits diagnostics on failure.
enum iree_compiler_pipeline_t {
IREE_COMPILER_PIPELINE_STD = 0,
IREE_COMPILER_PIPELINE_HAL_EXECUTABLE = 1,
};
IREE_EMBED_EXPORTED bool
ireeCompilerInvocationPipeline(iree_compiler_invocation_t *inv,
enum iree_compiler_pipeline_t pipeline);
// Outputs the current compiler state as textual IR to the output.
IREE_EMBED_EXPORTED iree_compiler_error_t *
ireeCompilerInvocationOutputIR(iree_compiler_invocation_t *inv,
iree_compiler_output_t *output);
// Assuming that the compiler has produced VM IR, converts it to bytecode
// and outputs it. This is a valid next step after running the
// IREE_COMPILER_PIPELINE_STD pipeline.
IREE_EMBED_EXPORTED iree_compiler_error_t *
ireeCompilerInvocationOutputVMBytecode(iree_compiler_invocation_t *inv,
iree_compiler_output_t *output);
// Assuming that the compiler has produced VM IR, converts it to textual
// C source and output it. This is a valid next step after running the
// IREE_COMPILER_PIPELINE_STD pipeline.
IREE_EMBED_EXPORTED iree_compiler_error_t *
ireeCompilerInvocationOutputVMCSource(iree_compiler_invocation_t *inv,
iree_compiler_output_t *output);
// Outputs the contents of a single HAL executable as binary data.
// This is a valid next step after running the
// IREE_COMPILER_PIPELINE_HAL_EXECUTABLE pipeline.
IREE_EMBED_EXPORTED iree_compiler_error_t *
ireeCompilerInvocationOutputHALExecutable(iree_compiler_invocation_t *inv,
iree_compiler_output_t *output);
//===----------------------------------------------------------------------===//
// Sources.
// Compilation sources are loaded into iree_compiler_source_t instances. These
// instances reference an originating session and may contain a concrete
// buffer of memory. Generally, when processing a source, its backing buffer
// will be transferred out from under it (i.e. sources are single-use).
// The actual source instance must be kept live until all processing is
// completed as some methods of loading a source involve maintaining
// references to backing resources.
//===----------------------------------------------------------------------===//
// Destroy source instances.
IREE_EMBED_EXPORTED void
ireeCompilerSourceDestroy(iree_compiler_source_t *source);
// Opens the source from a file. This is used for normal text assembly file
// sources.
// Must be destroyed with ireeCompilerSourceDestroy().
IREE_EMBED_EXPORTED iree_compiler_error_t *
ireeCompilerSourceOpenFile(iree_compiler_session_t *session,
const char *filePath,
iree_compiler_source_t **out_source);
// Wraps an existing buffer in memory.
// If |isNullTerminated| is true, then the null must be accounted for in the
// length. This is required for text buffers and it is permitted for binary
// buffers.
// Must be destroyed with ireeCompilerSourceDestroy().
IREE_EMBED_EXPORTED iree_compiler_error_t *
ireeCompilerSourceWrapBuffer(iree_compiler_session_t *session,
const char *bufferName, const char *buffer,
size_t length, bool isNullTerminated,
iree_compiler_source_t **out_source);
// Splits the current source buffer, invoking a callback for each "split"
// within it. This is per the usual MLIR split rules (see
// splitAndProcessBuffer): which split on `// -----`.
// Both the original source and all yielded sources must be destroyed by the
// caller eventually (split buffers are allowed to escape the callback).
IREE_EMBED_EXPORTED iree_compiler_error_t *ireeCompilerSourceSplit(
iree_compiler_source_t *source,
void (*callback)(iree_compiler_source_t *source, void *userData),
void *userData);
//===----------------------------------------------------------------------===//
// Outputs.
// Compilation outputs are standalone instances that are used to collect
// final compilation artifacts. In their most basic form, they are just
// wrappers around an output stream over some file. However, more advanced
// things can be enabled via additional APIs (i.e. allocating efficient
// temporary file handles, etc).
//
// Outputs are not bound to a session as they can outlive it or be disconnected
// from the actual process of compilation in arbitrary ways.
//===----------------------------------------------------------------------===//
// Destroy output instances.
IREE_EMBED_EXPORTED void
ireeCompilerOutputDestroy(iree_compiler_output_t *output);
// Opens a file for the output.
// Must be destroyed via ireeCompilerOutputDestroy().
IREE_EMBED_EXPORTED iree_compiler_error_t *
ireeCompilerOutputOpenFile(const char *filePath,
iree_compiler_output_t **out_output);
// Opens a file descriptor for output.
// Must be destroyed via ireeCompilerOutputDestroy().
IREE_EMBED_EXPORTED iree_compiler_error_t *
ireeCompilerOutputOpenFD(int fd, iree_compiler_output_t **out_output);
// Opens an output to in-memory storage. Use the API
// |ireeCompilerOutputMapMemory| to access the mapped contents once all
// output has been written.
IREE_EMBED_EXPORTED iree_compiler_error_t *
ireeCompilerOutputOpenMembuffer(iree_compiler_output_t **out_output);
// Maps the contents of a compiler output opened via
// |ireeCompilerOutputOpenMembuffer|. This may be something obtained via
// mmap or a more ordinary temporary buffer. This may fail in platform
// specific ways unless if the output was created via
// |ireeCompilerOutputOpenMembuffer|.
IREE_EMBED_EXPORTED iree_compiler_error_t *
ireeCompilerOutputMapMemory(iree_compiler_output_t *output, void **contents,
uint64_t *size);
// For file or other persistent outputs, by default they will be deleted on
// |ireeCompilerOutputDestroy| (or exit). It is necessary to call
// |ireeCompilerOutputKeep| in order to have them committed to their accessible
// place.
IREE_EMBED_EXPORTED void ireeCompilerOutputKeep(iree_compiler_output_t *output);
// Writes arbitrary data to the output.
IREE_EMBED_EXPORTED iree_compiler_error_t *
ireeCompilerOutputWrite(iree_compiler_output_t *output, const void *data,
size_t length);
#ifdef __cplusplus
}
#endif
#endif // IREE_COMPILER_EMBEDDING_API_H