Replace libc printf with eyalroz/printf and add streaming status formatting. (#23694)

Integrates [eyalroz/printf](https://github.com/eyalroz/printf) as a
vendored dependency to replace all libc snprintf/vsnprintf calls across
the runtime. This gives us a consistent, portable printf implementation
across all platforms (including embedded and bare-metal targets) with no
platform-specific quirks.

Beyond the drop-in replacement, this extends the status formatting API
with streaming support:

- Add iree_status_format_to: callback-based streaming formatter that
avoids contiguous buffers and pre-measurement passes. The callback
returns bool for flow control, enabling early termination on buffer full
or allocation failure.

- Add iree_string_builder_append_status: single-pass status-to-builder
formatting via iree_status_format_to, resolving the
status/string_builder dependency cycle that previously required a local
copy in libhsa.c.

- Rewrite iree_status_fprint to stream directly to FILE* with zero heap
allocation (previously required a contiguous buffer).

- Rewrite iree_status_to_string as single-pass using string builder
instead of two-pass measure-then-format.

- Fix va_copy usage in status allocation: use C99 va_copy for the
two-pass measure-then-format pattern instead of calling va_start twice
on the same parameter (implementation-defined behavior).

- Convert Status::ToString (C++) and ApiStatusToString (Python bindings)
from two-pass iree_status_format to single-pass iree_status_format_to.

- Replace HIP dynamic_symbols.c allocate-format-free pattern with direct
iree_string_builder_append_status (eliminates intermediate heap
allocation).

- RISC-V toolchain fix: strip debug info from libgcc.a during CMake
configure. eyalroz/printf's long double support in %Lf/%Le compiles
`va_arg(args, long double)` which on RISC-V (128-bit quad precision)
generates references to `__extenddftf2`/`__trunctfdf2` soft-float
builtins. These are resolved from libgcc.a, but the GCC 12.2.0-compiled
objects in that archive contain DWARF debug info with relocation types
60/61 (in `.debug_rnglists` and `.debug_loclists` sections) that LLD
cannot parse. The pre-built RISC-V toolchain lacks compiler-rt builtins
as an alternative, so we strip the debug metadata from libgcc.a at
configure time using `llvm-objcopy --strip-debug`. This preserves all
code and data sections and is idempotent. The strip runs inside the
`RISCV_TOOLCHAIN_ROOT` guard so users with their own toolchains are
unaffected. Verified locally with the same toolchain used in CI
(`toolchain_iree_manylinux_2_28_20231012`).

Co-authored-by: Claude <noreply@anthropic.com>
72 files changed
tree: 88522be363f316c2315cf118034c91e25f637330
  1. .github/
  2. build_tools/
  3. compiler/
  4. docs/
  5. experimental/
  6. integrations/
  7. lib/
  8. llvm-external-projects/
  9. runtime/
  10. samples/
  11. tests/
  12. third_party/
  13. tools/
  14. .bazel_to_cmake.cfg.py
  15. .bazelignore
  16. .bazelrc
  17. .bazelversion
  18. .clang-format
  19. .git-blame-ignore-revs
  20. .gitattributes
  21. .gitignore
  22. .gitmodules
  23. .pre-commit-config.yaml
  24. .yamllint.yml
  25. AUTHORS
  26. BUILD.bazel
  27. CITATION.cff
  28. CMakeLists.txt
  29. configure_bazel.py
  30. CONTRIBUTING.md
  31. LICENSE
  32. MAINTAINERS.md
  33. MODULE.bazel
  34. README.md
  35. RELEASING.md
README.md

IREE: Intermediate Representation Execution Environment

IREE (Intermediate Representation Execution Eenvironment, pronounced as “eerie”) is an MLIR-based end-to-end compiler and runtime that lowers Machine Learning (ML) models to a unified IR that scales up to meet the needs of the datacenter and down to satisfy the constraints and special considerations of mobile and edge deployments.

See our website for project details, user guides, and instructions on building from source.

IREE Discord Status pre-commit OpenSSF Best Practices

Project news

Project status

Release status

Releases notes are published on GitHub releases.

PackageRelease status
GitHub release (stable)GitHub Release
GitHub release (nightly)GitHub Release
iree-base-compilerPyPI version
iree-base-runtimePyPI version

For more details on the release process, see https://iree.dev/developers/general/release-management/.

Build status

CI PkgCI

Nightly build status

Operating systemBuild status
LinuxCI - Linux arm64 clang
macOSCI - macOS x64 clang
macOSCI - macOS arm64 clang

For the full list of workflows see https://iree.dev/developers/general/github-actions/.

Communication channels

Related project channels

  • MLIR topic within LLVM Discourse: IREE is enabled by and heavily relies on MLIR. IREE sometimes is referred to in certain MLIR discussions. Useful if you are also interested in MLIR evolution.

Architecture overview

IREE Architecture IREE Architecture

See our website for more information.

Presentations and talks

Community meeting recordings: IREE YouTube channel

DateTitleRecordingSlides
2025-06-10Data-Tiling in IREE: Achieving High Performance Through Compiler Design (AsiaLLVM)recordingslides
2025-05-17Introduction to GPU architecture and IREE's GPU CodeGen Pipelinerecordingslides
2025-02-12The Long Tail of AI: SPIR-V in IREE and MLIR (Vulkanised)recordingslides
2024-10-01Unveiling the Inner Workings of IREE: An MLIR-Based Compiler for Diverse Hardwarerecording
2021-06-09IREE Runtime Design Tech Talkrecordingslides
2020-08-20IREE CodeGen (MLIR Open Design Meeting)recordingslides
2020-03-18Interactive HAL IR Walkthroughrecording
2020-01-31End-to-end MLIR Workflow in IREE (MLIR Open Design Meeting)recordingslides

License

IREE is licensed under the terms of the Apache 2.0 License with LLVM Exceptions. See LICENSE for more information.