std/arg

March 26, 2026 ยท View on GitHub

Variadic argument support for functions with variable parameter lists.

Types

va_list

Platform-specific structure for variadic argument handling. Implementation varies by architecture:

  • X86_64: Contains GP offset, FP offset, overflow area, and register save area
  • X86, PowerPC, MIPS, AVR, WASM: Single pointer to argument area
  • AArch64: Stack pointer, register tops, and offsets
  • PowerPC: Character and short fields with pointers
  • S390X: Long fields with character pointers

Functions

__builtin_va_start

void __builtin_va_start(char* va)

Initializes variadic argument list. Must be called before accessing arguments.

__builtin_va_end

void __builtin_va_end(char* va)

Cleans up variadic argument list after use.

__builtin_va_copy

void __builtin_va_copy(char* dest, char* src)

Copies variadic argument list from src to dest.

Example

import <std/arg>

int sum(int count, ...) {
    va_list args;
    __builtin_va_start(&args, count);

    int total = 0;
    for (int i = 0; i < count; i++) {
        total += va_arg(args, int);
    }

    __builtin_va_end(&args);
    return total;
}