Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Additional Resources

ABIs and Platform Specifics

System V

The System V ABIs are defined by a General ABI (gABI), which cross-platform things like linking behavior and the ELF format, and by processor-speciic ABIs (psABI) that define data layout and calling convention. The gABI can be found at https://www.sco.com/developers/gabi/.

ARM (Arm32 and AArch64)

ABIs are located at https://github.com/ARM-software/abi-aa. The aapcs32 and aapcs64 directories are likely the most interesting. These ABIs are actively developed and discussed at that repository.

AMDGPU

The LLVM guide at https://llvm.org/docs/AMDGPUUsage.html is likely the best collection of resources for this architecture.

AVR

The AVR calling convention is detailed at the GCC Wiki, https://gcc.gnu.org/wiki/avr-gcc. The wiki is actively updated as needed.

BPF

A minimal ABI is defined at https://docs.kernel.org/bpf/standardization/abi.html.

CSky

The LLVM documentation links to https://github.com/c-sky/csky-doc/tree/master, which contains a document C-SKY_V2_CPU_Applications_Binary_Interface_Standards_Manual.pdf.

Hexagon

The Hexagon ABI can be found at https://docs.qualcomm.com/doc/80-N2040-23/topic/.

Loongarch

ABIs are located at https://github.com/loongson/la-abi-specs, with a rendered version at https://loongson.github.io/LoongArch-Documentation/LoongArch-ELF-ABI-EN.html. This ABI is actively developed and discussed at that repository.

m68k

An ABI is described at https://m680x0.github.io/doc/abi.html.

MIPS

The o32 (“old 32”) ABI is described in System V Application Binary Interface: MIPS RISC Processor Supplement. The n32 and n64 (“new 32” and “new 64”) ABIs are described in the MIPSproTM N32 ABI Handbook. There is also a porting guide for n64 that may be helpful https://irix7.com/techpubs/007-2391-006.pdf.

MSP430

The document MSP430 Embedded Application Binary Interface is available at https://www.ti.com/lit/an/slaa534a/slaa534a.pdf.

NVPTX

LLVM documentation directs to https://docs.nvidia.com/cuda/index.html.

PowerPC

There are a few relevant documents for PowerPC ABI:

RISC-V

Ratified RISC-V ABIs are located at https://docs.riscv.org/reference/abi/v1.0/index.html. More recent snapshots can be viewed at https://riscv-non-isa.github.io/riscv-elf-psabi-doc/, with development happening at https://github.com/riscv-non-isa/riscv-elf-psabi-doc.

s390x

The ABI is located at https://github.com/IBM/s390x-abi with a published PDF available at https://ibm.github.io/s390x-abi/lzsabi_s390x.pdf. This ABI is actively developed and discussed at that repository.

Historical ISAs can be found at https://linux.mainframe.blog/zarchitecture-principles-of-operation/. https://maskray.me/blog/toolchain-notes-on-z-architecture has a great overview of other ABI components such as linking and TLS.

SPARC

SCD 2.4.1 available at https://sparc.org/technical-documents/specifications/ describes both the 32-bit and 64-bit ABIs. SPARC psABI 3.0, available at that same link, is an older description of the 32-bit ABI.

x86

The 32-bit ABI (i386) is located at https://gitlab.com/x86-psABIs/i386-ABI. The 64-bit ABI (amd64) is located at https://gitlab.com/x86-psABIs/x86-64-ABI/#elf-x86-64-abi-psabi. Both of these are actively developed and discussed on mailing lists at https://groups.google.com/g/ia32-abi and https://groups.google.com/g/x86-64-abi.

Xtensa

TODO

Apple

Apple largely follows the System V ABIs but documents a few exceptions at the following links:

Microsoft

Microsoft’s x86-64 ABI is defined at https://learn.microsoft.com/en-us/cpp/build/x64-software-conventions. There are a few different x86-32 conventions:

As well as a few that aren’t supported by Rust (__clrcall, __vectorcall, __preserve_none).

Aarch64 targets generally use the AAPCS64 calling convention. There are some exceptions listed at https://learn.microsoft.com/en-us/cpp/build/arm64-windows-abi-conventions?view=msvc-170.

Register mappings for arm64ec are documented at https://learn.microsoft.com/en-us/cpp/build/arm64ec-windows-abi-conventions?view=msvc-170. http://www.emulators.com/docs/abc_arm64ec_explained.htm does a great job of explaining more about how this works.

Wasm

The way that C types are broken down into Wasm types is described at https://github.com/WebAssembly/tool-conventions/blob/main/BasicCABI.md.

Additional Resources for Platform Specifics

The following links aggregate more resources