.. _devdocs-callconv:

*******************
Calling Conventions
*******************

.. currentmodule:: Base

Julia uses three calling conventions for four distinct purposes:

+-------+--------------+----------------------------------+
|Name   |Prefix        |Purpose                           |
+=======+==============+==================================+
|Native |``julia_``    | Speed via specialized signatures |
+-------+--------------+----------------------------------+
|JL Call|``jlcall_``   | Wrapper for generic calls        |
+       +--------------+----------------------------------+
|       |``jl_``       | Builtins                         |
+-------+--------------+----------------------------------+
|C ABI  |``jlcapi_``   | Wrapper callable from C          |
+-------+--------------+----------------------------------+

Julia Native Calling Convention
-------------------------------

The native calling convention is designed for fast non-generic calls.
It usually uses a specialized signature.

* LLVM ghosts (zero-length types) are omitted.
* LLVM scalars and vectors are passed by value.
* LLVM aggregates (arrays and structs) are passed by reference.

A small return values is returned as LLVM return values.
A large return values is returned via the "structure return" (``sret``)
convention, where the caller provides a pointer to a return slot.

An argument or return values thta is a homogeneous tuple is
sometimes represented as an LLVM vector instead of an LLVM array.

JL Call Convention
------------------

The JL Call convention is for builtins and generic dispatch.
Hand-written functions using this convention are declared via the macro ``JL_CALLABLE``.
The convention uses exactly 3 parameters:

* ``F``  - Julia representation of function that is being applied
* ``args`` - pointer to array of pointers to boxes
* ``nargs`` - length of the array

The return value is a pointer to a box.

C ABI
-----

C ABI wrappers enable calling Julia from C.
The wrapper calls a function using the native calling convention.

Tuples are always represented as C arrays.

