IREE Compiler C API

IREE exports three levels of APIs for integrating IREE (and uses these APIs itself for building language bindings and binary tools):

  • Low-level MLIR API: This API builds on top of the MLIR C-API in order to enable low level access to IR building, transformations and combined pipelines. It provides no defined ABI or API stability guarantees, although best effort is taken to not break the API unnecessarily (similar to how the upstream MLIR C-API is considered).
  • Tool Entry Points: Entry points for standalone tools (i.e. iree-compile and iree-lld) are provided as exported C functions to enable the construction of busy-box binaries and other non-library use cases.
  • Embedding API: The high level compiler API provides programmatic access to the facilities of iree-compile and is intended for embedding into an online system which needs to invoke the compiler as a library and is interopping via input and output artifacts (vs direct construction of IR against in-memory data structures). This API is versioned and both API/ABI compatible within a major version.

Depending on build configuration, the API is built in the following ways:

  • Shared library: In this scenario, all of the APIs above are exported into a versioned shared library.
  • Static library: Used for building a static tool (not enabled by default since it adds build overhead).
  • Re-export Stub library: A static library which re-exports the Embedding API and provides additional entry-points for binding to a runtime-loaded shared library for the implementation. This is used as a convenience for consumers which need to decouple the interface from the implementation, which can happen in a variety of cases (i.e. avoiding symbol conflicts, integrating across build systems, etc).

See the implementation under compiler/src/iree/compiler/API (TODO: rename to ApiImpl).