73 breaking releases
new 0.89.0 | Jan 5, 2025 |
---|---|
0.88.0 | Dec 29, 2024 |
0.87.0 | Dec 22, 2024 |
0.80.0 | Nov 24, 2024 |
0.20.0 | Nov 21, 2023 |
#76 in Development tools
35,334 downloads per month
Used in 22 crates
(3 directly)
290KB
6K
SLoC
ABI handling for rustc
What is an "ABI"?
Literally, "application binary interface", which means it is everything about how code interacts, at the machine level, with other code. This means it technically covers all of the following:
- object binary format for e.g. relocations or offset tables
- in-memory layout of types
- procedure calling conventions
When we discuss "ABI" in the context of rustc, we are probably discussing calling conventions.
To describe those rustc_abi
also covers type layout, as it must for values passed on the stack.
Despite rustc_abi
being about calling conventions, it is good to remember these usages exist.
You will encounter all of them and more if you study target-specific codegen enough!
Even in general conversation, when someone says "the Rust ABI is unstable", it may allude to
either or both of
repr(Rust)
types have a mostly-unspecified layoutextern "Rust" fn(A) -> R
has an unspecified calling convention
Crate Goal
ABI is a foundational concept, so the rustc_abi
crate serves as an equally foundational crate.
It cannot carry all details relevant to an ABI: those permeate code generation and linkage.
Instead, rustc_abi
is intended to provide the interface for reasoning about the binary interface.
It should contain traits and types that other crates then use in their implementation.
For example, a platform's extern "C" fn
calling convention will be implemented in rustc_target
but rustc_abi
contains the types for calculating layout and describing register-passing.
This makes it easier to describe things in the same way across targets, codegen backends, and
even other Rust compilers, such as rust-analyzer!
Dependencies
~0.7–1.4MB
~28K SLoC