zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 8df04e144483ff48e506522da8269af25d0bca85 (tree)
parent 02097dff7049cecb16e301d37cd270159ef0f371
Author: Matthew Lugg <mlugg@mlugg.co.uk>
Date:   Sat,  2 May 2026 11:04:28 +0100

std: actually rename `std.builtin` to `std.lang`

This is now the canonical name, and `std.builtin` is a deprecated alias.

Diffstat:
MCMakeLists.txt | 3++-
Dlib/std/builtin.zig | 1254-------------------------------------------------------------------------------
Alib/std/lang.zig | 1254+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rlib/std/builtin/assembly.zig -> lib/std/lang/assembly.zig | 0
Mlib/std/std.zig | 5++++-
5 files changed, 1260 insertions(+), 1256 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt @@ -239,7 +239,8 @@ set(ZIG_STAGE2_SOURCES lib/std/atomic.zig lib/std/base64.zig lib/std/buf_map.zig - lib/std/builtin.zig + lib/std/lang.zig + lib/std/lang/assembly.zig lib/std/c.zig lib/std/coff.zig lib/std/crypto.zig diff --git a/lib/std/builtin.zig b/lib/std/builtin.zig @@ -1,1254 +0,0 @@ -//! Types and values provided by the Zig language. - -const builtin = @import("builtin"); -const std = @import("std.zig"); -const root = @import("root"); - -pub const assembly = @import("builtin/assembly.zig"); - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const StackTrace = struct { - index: usize, - instruction_addresses: []usize, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const GlobalLinkage = enum(u2) { - internal, - strong, - weak, - link_once, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const SymbolVisibility = enum(u2) { - default, - hidden, - protected, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const AtomicOrder = enum { - unordered, - monotonic, - acquire, - release, - acq_rel, - seq_cst, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const ReduceOp = enum { - And, - Or, - Xor, - Min, - Max, - Add, - Mul, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const AtomicRmwOp = enum { - /// Exchange - store the operand unmodified. - /// Supports enums, integers, and floats. - Xchg, - /// Add operand to existing value. - /// Supports integers and floats. - /// For integers, two's complement wraparound applies. - Add, - /// Subtract operand from existing value. - /// Supports integers and floats. - /// For integers, two's complement wraparound applies. - Sub, - /// Perform bitwise AND on existing value with operand. - /// Supports integers. - And, - /// Perform bitwise NAND on existing value with operand. - /// Supports integers. - Nand, - /// Perform bitwise OR on existing value with operand. - /// Supports integers. - Or, - /// Perform bitwise XOR on existing value with operand. - /// Supports integers. - Xor, - /// Store operand if it is larger than the existing value. - /// Supports integers and floats. - Max, - /// Store operand if it is smaller than the existing value. - /// Supports integers and floats. - Min, -}; - -/// The code model puts constraints on the location of symbols and the size of code and data. -/// The selection of a code model is a trade off on speed and restrictions that needs to be selected on a per application basis to meet its requirements. -/// A slightly more detailed explanation can be found in (for example) the [System V Application Binary Interface (x86_64)](https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-1.0.pdf) 3.5.1. -/// -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const CodeModel = enum { - default, - extreme, - kernel, - large, - medany, - medium, - medlow, - medmid, - normal, - small, - tiny, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const OptimizeMode = enum { - Debug, - ReleaseSafe, - ReleaseFast, - ReleaseSmall, -}; - -/// The calling convention of a function defines how arguments and return values are passed, as well -/// as any other requirements which callers and callees must respect, such as register preservation -/// and stack alignment. -/// -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const CallingConvention = union(enum(u8)) { - pub const Tag = @typeInfo(CallingConvention).@"union".tag_type.?; - - /// This is an alias for the default C calling convention for this target. - /// Functions marked as `extern` or `export` are given this calling convention by default. - pub const c = builtin.target.cCallingConvention().?; - - pub const winapi: CallingConvention = switch (builtin.target.cpu.arch) { - .x86_64 => .{ .x86_64_win = .{} }, - .x86 => .{ .x86_stdcall = .{} }, - .aarch64 => .{ .aarch64_aapcs_win = .{} }, - .thumb => .{ .arm_aapcs_vfp = .{} }, - else => unreachable, - }; - - pub const kernel: CallingConvention = switch (builtin.target.cpu.arch) { - .amdgcn => .amdgcn_kernel, - .nvptx, .nvptx64 => .nvptx_kernel, - .spirv32, .spirv64 => .spirv_kernel, - else => unreachable, - }; - - /// The default Zig calling convention when neither `export` nor `inline` is specified. - /// This calling convention makes no guarantees about stack alignment, registers, etc. - /// It can only be used within this Zig compilation unit. - auto, - - /// The calling convention of a function that can be called with `async` syntax. An `async` call - /// of a runtime-known function must target a function with this calling convention. - /// Comptime-known functions with other calling conventions may be coerced to this one. - async, - - /// Functions with this calling convention have no prologue or epilogue, making the function - /// uncallable in regular Zig code. This can be useful when integrating with assembly. - naked, - - /// This calling convention is exactly equivalent to using the `inline` keyword on a function - /// definition. This function will be semantically inlined by the Zig compiler at call sites. - /// Pointers to inline functions are comptime-only. - @"inline", - - // Calling conventions for the `x86_64` architecture. - x86_64_sysv: CommonOptions, - x86_64_x32: CommonOptions, - x86_64_win: CommonOptions, - x86_64_regcall_v3_sysv: CommonOptions, - x86_64_regcall_v4_win: CommonOptions, - x86_64_vectorcall: CommonOptions, - x86_64_interrupt: CommonOptions, - - // Calling conventions for the `x86` architecture. - x86_sysv: X86RegparmOptions, - x86_win: X86RegparmOptions, - x86_stdcall: X86RegparmOptions, - x86_fastcall: CommonOptions, - x86_thiscall: CommonOptions, - x86_thiscall_mingw: CommonOptions, - x86_regcall_v3: CommonOptions, - x86_regcall_v4_win: CommonOptions, - x86_vectorcall: CommonOptions, - x86_interrupt: CommonOptions, - - // Calling conventions for the `x86_16` architecture. - - x86_16_cdecl: CommonOptions, - x86_16_stdcall: CommonOptions, - x86_16_regparmcall: CommonOptions, - x86_16_interrupt: CommonOptions, - - // Calling conventions for the `aarch64` and `aarch64_be` architectures. - aarch64_aapcs: CommonOptions, - aarch64_aapcs_darwin: CommonOptions, - aarch64_aapcs_win: CommonOptions, - aarch64_vfabi: CommonOptions, - aarch64_vfabi_sve: CommonOptions, - - /// The standard `alpha` calling convention. - alpha_osf: CommonOptions, - - // Calling convetions for the `arm`, `armeb`, `thumb`, and `thumbeb` architectures. - /// ARM Architecture Procedure Call Standard - arm_aapcs: CommonOptions, - /// ARM Architecture Procedure Call Standard Vector Floating-Point - arm_aapcs_vfp: CommonOptions, - arm_interrupt: ArmInterruptOptions, - - // Calling conventions for the `mips64` and `mips64el` architectures. - mips64_n64: CommonOptions, - mips64_n32: CommonOptions, - mips64_interrupt: MipsInterruptOptions, - - // Calling conventions for the `mips` and `mipsel` architectures. - mips_o32: CommonOptions, - mips_interrupt: MipsInterruptOptions, - - // Calling conventions for the `riscv64` architecture. - riscv64_lp64: CommonOptions, - riscv64_lp64_v: CommonOptions, - riscv64_interrupt: RiscvInterruptOptions, - - // Calling conventions for the `riscv32` architecture. - riscv32_ilp32: CommonOptions, - riscv32_ilp32_v: CommonOptions, - riscv32_interrupt: RiscvInterruptOptions, - - // Calling conventions for the `sparc64` architecture. - sparc64_sysv: CommonOptions, - - // Calling conventions for the `sparc` architecture. - sparc_sysv: CommonOptions, - - // Calling conventions for the `powerpc64` and `powerpc64le` architectures. - powerpc64_elf: CommonOptions, - powerpc64_elf_altivec: CommonOptions, - powerpc64_elf_v2: CommonOptions, - - // Calling conventions for the `powerpc` and `powerpcle` architectures. - powerpc_sysv: CommonOptions, - powerpc_sysv_altivec: CommonOptions, - powerpc_aix: CommonOptions, - powerpc_aix_altivec: CommonOptions, - - /// The standard `wasm32` and `wasm64` calling convention, as specified in the WebAssembly Tool Conventions. - wasm_mvp: CommonOptions, - - /// The standard `arc`/`arceb` calling convention. - arc_sysv: CommonOptions, - arc_interrupt: ArcInterruptOptions, - - // Calling conventions for the `avr` architecture. - avr_gnu, - avr_builtin, - avr_signal, - avr_interrupt, - - /// The standard `bpfel`/`bpfeb` calling convention. - bpf_std: CommonOptions, - - // Calling conventions for the `csky` architecture. - csky_sysv: CommonOptions, - csky_interrupt: CommonOptions, - - // Calling conventions for the `hexagon` architecture. - hexagon_sysv: CommonOptions, - hexagon_sysv_hvx: CommonOptions, - - /// The standard `hppa` calling convention. - hppa_elf: CommonOptions, - - /// The standard `hppa64` calling convention. - hppa64_elf: CommonOptions, - - kvx_lp64: CommonOptions, - kvx_ilp32: CommonOptions, - - /// The standard `lanai` calling convention. - lanai_sysv: CommonOptions, - - /// The standard `loongarch64` calling convention. - loongarch64_lp64: CommonOptions, - - /// The standard `loongarch32` calling convention. - loongarch32_ilp32: CommonOptions, - - // Calling conventions for the `m68k` architecture. - m68k_sysv: CommonOptions, - m68k_gnu: CommonOptions, - m68k_rtd: CommonOptions, - m68k_interrupt: CommonOptions, - - /// The standard `microblaze`/`microblazeel` calling convention. - microblaze_std: CommonOptions, - microblaze_interrupt: MicroblazeInterruptOptions, - - /// The standard `msp430` calling convention. - msp430_eabi: CommonOptions, - msp430_interrupt: CommonOptions, - - /// The standard `or1k` calling convention. - or1k_sysv: CommonOptions, - - /// The standard `propeller` calling convention. - propeller_sysv: CommonOptions, - - // Calling conventions for the `s390x` architecture. - s390x_sysv: CommonOptions, - s390x_sysv_vx: CommonOptions, - - // Calling conventions for the `sh`/`sheb` architecture. - sh_gnu: CommonOptions, - sh_renesas: CommonOptions, - sh_interrupt: ShInterruptOptions, - - /// The standard `ve` calling convention. - ve_sysv: CommonOptions, - - // Calling conventions for the `xcore` architecture. - xcore_xs1: CommonOptions, - xcore_xs2: CommonOptions, - - // Calling conventions for the `xtensa`/`xtensaeb` architecture. - xtensa_call0: CommonOptions, - xtensa_windowed: CommonOptions, - - // Calling conventions for the `amdgcn` architecture. - amdgcn_device: CommonOptions, - amdgcn_kernel, - amdgcn_cs: CommonOptions, - - // Calling conventions for the `nvptx` and `nvptx64` architectures. - nvptx_device, - nvptx_kernel, - - // Calling conventions for kernels and shaders on the `spirv`, `spirv32`, and `spirv64` architectures. - spirv_device, - spirv_kernel, - spirv_fragment, - spirv_vertex, - - // Calling conventions for the `ez80` architecture. - ez80_cet, - ez80_tiflags, - - /// Options shared across most calling conventions. - pub const CommonOptions = struct { - /// The boundary the stack is aligned to when the function is called. - /// `null` means the default for this calling convention. - incoming_stack_alignment: ?u64 = null, - }; - - /// Options for x86 calling conventions which support the regparm attribute to pass some - /// arguments in registers. - pub const X86RegparmOptions = struct { - /// The boundary the stack is aligned to when the function is called. - /// `null` means the default for this calling convention. - incoming_stack_alignment: ?u64 = null, - /// The number of arguments to pass in registers before passing the remaining arguments - /// according to the calling convention. - /// Equivalent to `__attribute__((regparm(x)))` in Clang and GCC. - register_params: u2 = 0, - }; - - /// Options for the `arc_interrupt` calling convention. - pub const ArcInterruptOptions = struct { - /// The boundary the stack is aligned to when the function is called. - /// `null` means the default for this calling convention. - incoming_stack_alignment: ?u64 = null, - /// The kind of interrupt being received. - type: InterruptType, - - pub const InterruptType = enum(u2) { - ilink1, - ilink2, - ilink, - firq, - }; - }; - - /// Options for the `arm_interrupt` calling convention. - pub const ArmInterruptOptions = struct { - /// The boundary the stack is aligned to when the function is called. - /// `null` means the default for this calling convention. - incoming_stack_alignment: ?u64 = null, - /// The kind of interrupt being received. - type: InterruptType = .generic, - - pub const InterruptType = enum(u3) { - generic, - irq, - fiq, - swi, - abort, - undef, - }; - }; - - /// Options for the `microblaze_interrupt` calling convention. - pub const MicroblazeInterruptOptions = struct { - /// The boundary the stack is aligned to when the function is called. - /// `null` means the default for this calling convention. - incoming_stack_alignment: ?u64 = null, - type: InterruptType = .regular, - - pub const InterruptType = enum(u2) { - /// User exception; return with `rtsd`. - user, - /// Regular interrupt; return with `rtid`. - regular, - /// Fast interrupt; return with `rtid`. - fast, - /// Software breakpoint; return with `rtbd`. - breakpoint, - }; - }; - - /// Options for the `mips_interrupt` and `mips64_interrupt` calling conventions. - pub const MipsInterruptOptions = struct { - /// The boundary the stack is aligned to when the function is called. - /// `null` means the default for this calling convention. - incoming_stack_alignment: ?u64 = null, - /// The interrupt mode. - mode: InterruptMode = .eic, - - pub const InterruptMode = enum(u4) { - eic, - sw0, - sw1, - hw0, - hw1, - hw2, - hw3, - hw4, - hw5, - }; - }; - - /// Options for the `riscv32_interrupt` and `riscv64_interrupt` calling conventions. - pub const RiscvInterruptOptions = struct { - /// The boundary the stack is aligned to when the function is called. - /// `null` means the default for this calling convention. - incoming_stack_alignment: ?u64 = null, - /// The privilege mode. - mode: PrivilegeMode, - - pub const PrivilegeMode = enum(u2) { - supervisor, - machine, - }; - }; - - /// Options for the `sh_interrupt` calling convention. - pub const ShInterruptOptions = struct { - /// The boundary the stack is aligned to when the function is called. - /// `null` means the default for this calling convention. - incoming_stack_alignment: ?u64 = null, - save: SaveBehavior = .full, - - pub const SaveBehavior = enum(u3) { - /// Save only fpscr (if applicable). - fpscr, - /// Save only high-numbered registers, i.e. r0 through r7 are *not* saved. - high, - /// Save all registers normally. - full, - /// Save all registers using the CPU's fast register bank. - bank, - }; - }; - - /// Returns the array of `std.Target.Cpu.Arch` to which this `CallingConvention` applies. - /// Asserts that `cc` is not `.auto`, `.@"async"`, `.naked`, or `.@"inline"`. - pub fn archs(cc: CallingConvention) []const std.Target.Cpu.Arch { - return std.Target.Cpu.Arch.fromCallingConvention(cc); - } - - pub fn eql(a: CallingConvention, b: CallingConvention) bool { - return std.meta.eql(a, b); - } - - pub fn withStackAlign(cc: CallingConvention, incoming_stack_alignment: u64) CallingConvention { - const tag: CallingConvention.Tag = cc; - var result = cc; - @field(result, @tagName(tag)).incoming_stack_alignment = incoming_stack_alignment; - return result; - } -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const AddressSpace = enum(u5) { - // CPU address spaces. - generic, - gs, - fs, - ss, - - // x86_16 extra address spaces. - /// Allows addressing the entire address space by storing both segment and offset. - far, - - // GPU address spaces. - global, - constant, - param, - shared, - local, - input, - output, - uniform, - push_constant, - storage_buffer, - physical_storage_buffer, - - // AVR address spaces. - flash, - flash1, - flash2, - flash3, - flash4, - flash5, - - // Propeller address spaces. - - /// This address space only addresses the cog-local ram. - cog, - - /// This address space only addresses shared hub ram. - hub, - - /// This address space only addresses the "lookup" ram - lut, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const SourceLocation = struct { - /// The name chosen when compiling. Not a file path. - module: [:0]const u8, - /// Relative to the root directory of its module. - file: [:0]const u8, - fn_name: [:0]const u8, - line: u32, - column: u32, -}; - -pub const TypeId = std.meta.Tag(Type); - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const Type = union(enum) { - type, - void, - bool, - noreturn, - int: Int, - float: Float, - pointer: Pointer, - array: Array, - @"struct": Struct, - comptime_float, - comptime_int, - undefined, - null, - optional: Optional, - error_union: ErrorUnion, - error_set: ErrorSet, - @"enum": Enum, - @"union": Union, - @"fn": Fn, - @"opaque": Opaque, - frame: Frame, - @"anyframe": AnyFrame, - vector: Vector, - enum_literal, - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Int = struct { - signedness: Signedness, - bits: u16, - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Float = struct { - bits: u16, - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Pointer = struct { - size: Size, - is_const: bool, - is_volatile: bool, - /// `null` means implicit alignment, which is equivalent to `@alignOf(child)`. - alignment: ?usize, - address_space: AddressSpace, - child: type, - is_allowzero: bool, - - /// The type of the sentinel is the element type of the pointer, which is - /// the value of the `child` field in this struct. However there is no way - /// to refer to that type here, so we use `*const anyopaque`. - /// See also: `sentinel` - sentinel_ptr: ?*const anyopaque, - - /// Loads the pointer type's sentinel value from `sentinel_ptr`. - /// Returns `null` if the pointer type has no sentinel. - pub inline fn sentinel(comptime ptr: Pointer) ?ptr.child { - const sp: *const ptr.child = @ptrCast(@alignCast(ptr.sentinel_ptr orelse return null)); - return sp.*; - } - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Size = enum(u2) { - one, - many, - slice, - c, - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Attributes = struct { - @"const": bool = false, - @"volatile": bool = false, - @"allowzero": bool = false, - @"addrspace": ?AddressSpace = null, - @"align": ?usize = null, - }; - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Array = struct { - len: comptime_int, - child: type, - - /// The type of the sentinel is the element type of the array, which is - /// the value of the `child` field in this struct. However there is no way - /// to refer to that type here, so we use `*const anyopaque`. - /// See also: `sentinel`. - sentinel_ptr: ?*const anyopaque, - - /// Loads the array type's sentinel value from `sentinel_ptr`. - /// Returns `null` if the array type has no sentinel. - pub inline fn sentinel(comptime arr: Array) ?arr.child { - const sp: *const arr.child = @ptrCast(@alignCast(arr.sentinel_ptr orelse return null)); - return sp.*; - } - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const ContainerLayout = enum(u2) { - auto, - @"extern", - @"packed", - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const StructField = struct { - name: [:0]const u8, - type: type, - /// The type of the default value is the type of this struct field, which - /// is the value of the `type` field in this struct. However there is no - /// way to refer to that type here, so we use `*const anyopaque`. - /// See also: `defaultValue`. - default_value_ptr: ?*const anyopaque, - is_comptime: bool, - /// `null` means the field alignment was not explicitly specified. The - /// field will still be aligned to at least `@alignOf` its `type`. - alignment: ?usize, - - /// Loads the field's default value from `default_value_ptr`. - /// Returns `null` if the field has no default value. - pub inline fn defaultValue(comptime sf: StructField) ?sf.type { - const dp: *const sf.type = @ptrCast(@alignCast(sf.default_value_ptr orelse return null)); - return dp.*; - } - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Attributes = struct { - @"comptime": bool = false, - @"align": ?usize = null, - default_value_ptr: ?*const anyopaque = null, - }; - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Struct = struct { - layout: ContainerLayout, - /// Only valid if layout is .@"packed" - backing_integer: ?type = null, - fields: []const StructField, - decls: []const Declaration, - is_tuple: bool, - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Optional = struct { - child: type, - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const ErrorUnion = struct { - error_set: type, - payload: type, - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Error = struct { - name: [:0]const u8, - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const ErrorSet = ?[]const Error; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const EnumField = struct { - name: [:0]const u8, - value: comptime_int, - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Enum = struct { - tag_type: type, - fields: []const EnumField, - decls: []const Declaration, - is_exhaustive: bool, - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Mode = enum { exhaustive, nonexhaustive }; - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const UnionField = struct { - name: [:0]const u8, - type: type, - /// `null` means the field alignment was not explicitly specified. The - /// field will still be aligned to at least `@alignOf` its `type`. - alignment: ?usize, - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Attributes = struct { - @"align": ?usize = null, - }; - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Union = struct { - layout: ContainerLayout, - tag_type: ?type, - fields: []const UnionField, - decls: []const Declaration, - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Fn = struct { - calling_convention: CallingConvention, - is_generic: bool, - is_var_args: bool, - /// TODO change the language spec to make this not optional. - return_type: ?type, - params: []const Param, - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Param = struct { - is_generic: bool, - is_noalias: bool, - type: ?type, - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Attributes = struct { - @"noalias": bool = false, - }; - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Attributes = struct { - @"callconv": CallingConvention = .auto, - varargs: bool = false, - }; - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Opaque = struct { - decls: []const Declaration, - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Frame = struct { - function: *const anyopaque, - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const AnyFrame = struct { - child: ?type, - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Vector = struct { - len: comptime_int, - child: type, - }; - - /// This data structure is used by the Zig language code generation and - /// therefore must be kept in sync with the compiler implementation. - pub const Declaration = struct { - name: [:0]const u8, - }; -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const FloatMode = enum { - strict, - optimized, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const Endian = enum { - big, - little, - - pub const native = builtin.target.cpu.arch.endian(); - pub const foreign: Endian = @enumFromInt(1 - @intFromEnum(native)); -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const Signedness = enum(u1) { - signed, - unsigned, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const OutputMode = enum { - Exe, - Lib, - Obj, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const LinkMode = enum { - static, - dynamic, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const UnwindTables = enum { - none, - sync, - async, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const WasiExecModel = enum { - command, - reactor, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const CallModifier = enum { - /// Equivalent to function call syntax. - auto, - /// Prevents tail call optimization. This guarantees that the return - /// address will point to the callsite, as opposed to the callsite's - /// callsite. If the call is otherwise required to be tail-called - /// or inlined, a compile error is emitted instead. - never_tail, - /// Guarantees that the call will not be inlined. If the call is - /// otherwise required to be inlined, a compile error is emitted instead. - never_inline, - /// Asserts that the function call will not suspend. This allows a - /// non-async function to call an async function. - no_suspend, - /// Guarantees that the call will be generated with tail call optimization. - /// If this is not possible, a compile error is emitted instead. - always_tail, - /// Guarantees that the call will be inlined at the callsite. - /// If this is not possible, a compile error is emitted instead. - always_inline, - /// Evaluates the call at compile-time. If the call cannot be completed at - /// compile-time, a compile error is emitted instead. - compile_time, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const VaListAarch64 = extern struct { - __stack: *anyopaque, - __gr_top: *anyopaque, - __vr_top: *anyopaque, - __gr_offs: c_int, - __vr_offs: c_int, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const VaListAlpha = extern struct { - __base: *anyopaque, - __offset: c_int, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const VaListArm = extern struct { - __ap: *anyopaque, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const VaListHexagon = extern struct { - __gpr: c_long, - __fpr: c_long, - __overflow_arg_area: *anyopaque, - __reg_save_area: *anyopaque, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const VaListPowerPc = extern struct { - gpr: u8, - fpr: u8, - reserved: c_ushort, - overflow_arg_area: *anyopaque, - reg_save_area: *anyopaque, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const VaListS390x = extern struct { - __current_saved_reg_area_pointer: *anyopaque, - __saved_reg_area_end_pointer: *anyopaque, - __overflow_area_pointer: *anyopaque, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const VaListSh = extern struct { - __va_next_o: *anyopaque, - __va_next_o_limit: *anyopaque, - __va_next_fp: *anyopaque, - __va_next_fp_limit: *anyopaque, - __va_next_stack: *anyopaque, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const VaListX86_64 = extern struct { - gp_offset: c_uint, - fp_offset: c_uint, - overflow_arg_area: *anyopaque, - reg_save_area: *anyopaque, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const VaListXtensa = extern struct { - __va_stk: *c_int, - __va_reg: *c_int, - __va_ndx: c_int, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const VaList = switch (builtin.cpu.arch) { - .amdgcn, - .msp430, - .nvptx, - .nvptx64, - .powerpc64, - .powerpc64le, - .x86, - => *u8, - .arc, - .arceb, - .avr, - .bpfel, - .bpfeb, - .csky, - .hppa, - .hppa64, - .kvx, - .lanai, - .loongarch32, - .loongarch64, - .m68k, - .microblaze, - .microblazeel, - .mips, - .mipsel, - .mips64, - .mips64el, - .riscv32, - .riscv32be, - .riscv64, - .riscv64be, - .sparc, - .sparc64, - .spirv32, - .spirv64, - .ve, - .wasm32, - .wasm64, - .xcore, - => *anyopaque, - .aarch64, .aarch64_be => switch (builtin.os.tag) { - .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .windows => *u8, - else => switch (builtin.zig_backend) { - else => VaListAarch64, - .stage2_llvm => @compileError("disabled due to miscompilations"), - }, - }, - .alpha => VaListAlpha, - .arm, .armeb, .thumb, .thumbeb => VaListArm, - .hexagon => if (builtin.target.abi.isMusl()) VaListHexagon else *u8, - .powerpc, .powerpcle => VaListPowerPc, - .s390x => VaListS390x, - .sh, .sheb => VaListSh, // This is wrong for `sh_renesas`: https://github.com/ziglang/zig/issues/24692#issuecomment-3150779829 - .x86_64 => switch (builtin.os.tag) { - .uefi, .windows => switch (builtin.zig_backend) { - else => *u8, - .stage2_llvm => @compileError("disabled due to miscompilations"), - }, - else => VaListX86_64, - }, - .xtensa, .xtensaeb => VaListXtensa, - else => @compileError("VaList not supported for this target yet"), -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const PrefetchOptions = struct { - /// Whether the prefetch should prepare for a read or a write. - rw: Rw = .read, - /// The data's locality in an inclusive range from 0 to 3. - /// - /// 0 means no temporal locality. That is, the data can be immediately - /// dropped from the cache after it is accessed. - /// - /// 3 means high temporal locality. That is, the data should be kept in - /// the cache as it is likely to be accessed again soon. - locality: u2 = 3, - /// The cache that the prefetch should be performed on. - cache: Cache = .data, - - pub const Rw = enum(u1) { - read, - write, - }; - - pub const Cache = enum(u1) { - instruction, - data, - }; -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const ExportOptions = struct { - name: []const u8, - linkage: GlobalLinkage = .strong, - section: ?[]const u8 = null, - visibility: SymbolVisibility = .default, -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const ExternOptions = struct { - name: []const u8, - library_name: ?[]const u8 = null, - linkage: GlobalLinkage = .strong, - visibility: SymbolVisibility = .default, - /// Setting this to `true` makes the `@extern` a runtime value. - is_thread_local: bool = false, - is_dll_import: bool = false, - relocation: Relocation = .any, - decoration: ?Decoration = null, - - pub const Decoration = union(enum) { - location: u32, - descriptor: Descriptor, - - pub const Descriptor = struct { - binding: u32, - set: u32, - }; - }; - - pub const Relocation = enum(u1) { - /// Any type of relocation is allowed. - any, - /// A program-counter-relative relocation is required. - /// Using this value makes the `@extern` a runtime value. - pcrel, - }; -}; - -/// This data structure is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const BranchHint = enum(u3) { - /// Equivalent to no hint given. - none, - /// This branch of control flow is more likely to be reached than its peers. - /// The optimizer should optimize for reaching it. - likely, - /// This branch of control flow is less likely to be reached than its peers. - /// The optimizer should optimize for not reaching it. - unlikely, - /// This branch of control flow is unlikely to *ever* be reached. - /// The optimizer may place it in a different page of memory to optimize other branches. - cold, - /// It is difficult to predict whether this branch of control flow will be reached. - /// The optimizer should avoid branching behavior with expensive mispredictions. - unpredictable, -}; - -/// This enum is set by the compiler and communicates which compiler backend is -/// used to produce machine code. -/// Think carefully before deciding to observe this value. Nearly all code should -/// be agnostic to the backend that implements the language. The use case -/// to use this value is to **work around problems with compiler implementations.** -/// -/// Avoid failing the compilation if the compiler backend does not match a -/// whitelist of backends; rather one should detect that a known problem would -/// occur in a blacklist of backends. -/// -/// The enum is nonexhaustive so that alternate Zig language implementations may -/// choose a number as their tag (please use a random number generator rather -/// than a "cute" number) and codebases can interact with these values even if -/// this upstream enum does not have a name for the number. Of course, upstream -/// is happy to accept pull requests to add Zig implementations to this enum. -/// -/// This data structure is part of the Zig language specification. -pub const CompilerBackend = enum(u64) { - /// It is allowed for a compiler implementation to not reveal its identity, - /// in which case this value is appropriate. Be cool and make sure your - /// code supports `other` Zig compilers! - other = 0, - /// The original Zig compiler created in 2015 by Andrew Kelley. Implemented - /// in C++. Used LLVM. Deleted from the ZSF ziglang/zig codebase on - /// December 6th, 2022. - stage1 = 1, - /// The reference implementation self-hosted compiler of Zig, using the - /// LLVM backend. - stage2_llvm = 2, - /// The reference implementation self-hosted compiler of Zig, using the - /// backend that generates C source code. - /// Note that one can observe whether the compilation will output C code - /// directly with `object_format` value rather than the `compiler_backend` value. - stage2_c = 3, - /// The reference implementation self-hosted compiler of Zig, using the - /// WebAssembly backend. - stage2_wasm = 4, - /// The reference implementation self-hosted compiler of Zig, using the - /// arm backend. - stage2_arm = 5, - /// The reference implementation self-hosted compiler of Zig, using the - /// x86_64 backend. - stage2_x86_64 = 6, - /// The reference implementation self-hosted compiler of Zig, using the - /// aarch64 backend. - stage2_aarch64 = 7, - /// The reference implementation self-hosted compiler of Zig, using the - /// x86 backend. - stage2_x86 = 8, - /// The reference implementation self-hosted compiler of Zig, using the - /// riscv64 backend. - stage2_riscv64 = 9, - /// The reference implementation self-hosted compiler of Zig, using the - /// sparc64 backend. - stage2_sparc64 = 10, - /// The reference implementation self-hosted compiler of Zig, using the - /// spirv backend. - stage2_spirv = 11, - /// The reference implementation self-hosted compiler of Zig, using the - /// powerpc backend. - stage2_powerpc = 12, - - _, -}; - -/// This function type is used by the Zig language code generation and -/// therefore must be kept in sync with the compiler implementation. -pub const TestFn = struct { - name: []const u8, - func: *const fn () anyerror!void, -}; - -/// This namespace is used by the Zig compiler to emit various kinds of safety -/// panics. These can be overridden by making a public `panic` namespace in the -/// root source file. -pub const panic: type = p: { - if (@hasDecl(root, "panic")) { - if (@TypeOf(root.panic) != type) { - // Deprecated; make `panic` a namespace instead. - break :p std.debug.FullPanic(struct { - fn panic(msg: []const u8, ra: ?usize) noreturn { - root.panic(msg, @errorReturnTrace(), ra); - } - }.panic); - } - break :p root.panic; - } - break :p switch (builtin.zig_backend) { - .stage2_powerpc, - .stage2_riscv64, - => std.debug.simple_panic, - else => std.debug.FullPanic(std.debug.defaultPanic), - }; -}; - -pub noinline fn returnError() void { - @branchHint(.unlikely); - @setRuntimeSafety(false); - const st = @errorReturnTrace().?; - if (st.index < st.instruction_addresses.len) - st.instruction_addresses[st.index] = @returnAddress(); - st.index += 1; -} diff --git a/lib/std/lang.zig b/lib/std/lang.zig @@ -0,0 +1,1254 @@ +//! Types and values provided by the Zig language. + +const builtin = @import("builtin"); +const std = @import("std.zig"); +const root = @import("root"); + +pub const assembly = @import("lang/assembly.zig"); + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const StackTrace = struct { + index: usize, + instruction_addresses: []usize, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const GlobalLinkage = enum(u2) { + internal, + strong, + weak, + link_once, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const SymbolVisibility = enum(u2) { + default, + hidden, + protected, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const AtomicOrder = enum { + unordered, + monotonic, + acquire, + release, + acq_rel, + seq_cst, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const ReduceOp = enum { + And, + Or, + Xor, + Min, + Max, + Add, + Mul, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const AtomicRmwOp = enum { + /// Exchange - store the operand unmodified. + /// Supports enums, integers, and floats. + Xchg, + /// Add operand to existing value. + /// Supports integers and floats. + /// For integers, two's complement wraparound applies. + Add, + /// Subtract operand from existing value. + /// Supports integers and floats. + /// For integers, two's complement wraparound applies. + Sub, + /// Perform bitwise AND on existing value with operand. + /// Supports integers. + And, + /// Perform bitwise NAND on existing value with operand. + /// Supports integers. + Nand, + /// Perform bitwise OR on existing value with operand. + /// Supports integers. + Or, + /// Perform bitwise XOR on existing value with operand. + /// Supports integers. + Xor, + /// Store operand if it is larger than the existing value. + /// Supports integers and floats. + Max, + /// Store operand if it is smaller than the existing value. + /// Supports integers and floats. + Min, +}; + +/// The code model puts constraints on the location of symbols and the size of code and data. +/// The selection of a code model is a trade off on speed and restrictions that needs to be selected on a per application basis to meet its requirements. +/// A slightly more detailed explanation can be found in (for example) the [System V Application Binary Interface (x86_64)](https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-1.0.pdf) 3.5.1. +/// +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const CodeModel = enum { + default, + extreme, + kernel, + large, + medany, + medium, + medlow, + medmid, + normal, + small, + tiny, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const OptimizeMode = enum { + Debug, + ReleaseSafe, + ReleaseFast, + ReleaseSmall, +}; + +/// The calling convention of a function defines how arguments and return values are passed, as well +/// as any other requirements which callers and callees must respect, such as register preservation +/// and stack alignment. +/// +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const CallingConvention = union(enum(u8)) { + pub const Tag = @typeInfo(CallingConvention).@"union".tag_type.?; + + /// This is an alias for the default C calling convention for this target. + /// Functions marked as `extern` or `export` are given this calling convention by default. + pub const c = builtin.target.cCallingConvention().?; + + pub const winapi: CallingConvention = switch (builtin.target.cpu.arch) { + .x86_64 => .{ .x86_64_win = .{} }, + .x86 => .{ .x86_stdcall = .{} }, + .aarch64 => .{ .aarch64_aapcs_win = .{} }, + .thumb => .{ .arm_aapcs_vfp = .{} }, + else => unreachable, + }; + + pub const kernel: CallingConvention = switch (builtin.target.cpu.arch) { + .amdgcn => .amdgcn_kernel, + .nvptx, .nvptx64 => .nvptx_kernel, + .spirv32, .spirv64 => .spirv_kernel, + else => unreachable, + }; + + /// The default Zig calling convention when neither `export` nor `inline` is specified. + /// This calling convention makes no guarantees about stack alignment, registers, etc. + /// It can only be used within this Zig compilation unit. + auto, + + /// The calling convention of a function that can be called with `async` syntax. An `async` call + /// of a runtime-known function must target a function with this calling convention. + /// Comptime-known functions with other calling conventions may be coerced to this one. + async, + + /// Functions with this calling convention have no prologue or epilogue, making the function + /// uncallable in regular Zig code. This can be useful when integrating with assembly. + naked, + + /// This calling convention is exactly equivalent to using the `inline` keyword on a function + /// definition. This function will be semantically inlined by the Zig compiler at call sites. + /// Pointers to inline functions are comptime-only. + @"inline", + + // Calling conventions for the `x86_64` architecture. + x86_64_sysv: CommonOptions, + x86_64_x32: CommonOptions, + x86_64_win: CommonOptions, + x86_64_regcall_v3_sysv: CommonOptions, + x86_64_regcall_v4_win: CommonOptions, + x86_64_vectorcall: CommonOptions, + x86_64_interrupt: CommonOptions, + + // Calling conventions for the `x86` architecture. + x86_sysv: X86RegparmOptions, + x86_win: X86RegparmOptions, + x86_stdcall: X86RegparmOptions, + x86_fastcall: CommonOptions, + x86_thiscall: CommonOptions, + x86_thiscall_mingw: CommonOptions, + x86_regcall_v3: CommonOptions, + x86_regcall_v4_win: CommonOptions, + x86_vectorcall: CommonOptions, + x86_interrupt: CommonOptions, + + // Calling conventions for the `x86_16` architecture. + + x86_16_cdecl: CommonOptions, + x86_16_stdcall: CommonOptions, + x86_16_regparmcall: CommonOptions, + x86_16_interrupt: CommonOptions, + + // Calling conventions for the `aarch64` and `aarch64_be` architectures. + aarch64_aapcs: CommonOptions, + aarch64_aapcs_darwin: CommonOptions, + aarch64_aapcs_win: CommonOptions, + aarch64_vfabi: CommonOptions, + aarch64_vfabi_sve: CommonOptions, + + /// The standard `alpha` calling convention. + alpha_osf: CommonOptions, + + // Calling convetions for the `arm`, `armeb`, `thumb`, and `thumbeb` architectures. + /// ARM Architecture Procedure Call Standard + arm_aapcs: CommonOptions, + /// ARM Architecture Procedure Call Standard Vector Floating-Point + arm_aapcs_vfp: CommonOptions, + arm_interrupt: ArmInterruptOptions, + + // Calling conventions for the `mips64` and `mips64el` architectures. + mips64_n64: CommonOptions, + mips64_n32: CommonOptions, + mips64_interrupt: MipsInterruptOptions, + + // Calling conventions for the `mips` and `mipsel` architectures. + mips_o32: CommonOptions, + mips_interrupt: MipsInterruptOptions, + + // Calling conventions for the `riscv64` architecture. + riscv64_lp64: CommonOptions, + riscv64_lp64_v: CommonOptions, + riscv64_interrupt: RiscvInterruptOptions, + + // Calling conventions for the `riscv32` architecture. + riscv32_ilp32: CommonOptions, + riscv32_ilp32_v: CommonOptions, + riscv32_interrupt: RiscvInterruptOptions, + + // Calling conventions for the `sparc64` architecture. + sparc64_sysv: CommonOptions, + + // Calling conventions for the `sparc` architecture. + sparc_sysv: CommonOptions, + + // Calling conventions for the `powerpc64` and `powerpc64le` architectures. + powerpc64_elf: CommonOptions, + powerpc64_elf_altivec: CommonOptions, + powerpc64_elf_v2: CommonOptions, + + // Calling conventions for the `powerpc` and `powerpcle` architectures. + powerpc_sysv: CommonOptions, + powerpc_sysv_altivec: CommonOptions, + powerpc_aix: CommonOptions, + powerpc_aix_altivec: CommonOptions, + + /// The standard `wasm32` and `wasm64` calling convention, as specified in the WebAssembly Tool Conventions. + wasm_mvp: CommonOptions, + + /// The standard `arc`/`arceb` calling convention. + arc_sysv: CommonOptions, + arc_interrupt: ArcInterruptOptions, + + // Calling conventions for the `avr` architecture. + avr_gnu, + avr_builtin, + avr_signal, + avr_interrupt, + + /// The standard `bpfel`/`bpfeb` calling convention. + bpf_std: CommonOptions, + + // Calling conventions for the `csky` architecture. + csky_sysv: CommonOptions, + csky_interrupt: CommonOptions, + + // Calling conventions for the `hexagon` architecture. + hexagon_sysv: CommonOptions, + hexagon_sysv_hvx: CommonOptions, + + /// The standard `hppa` calling convention. + hppa_elf: CommonOptions, + + /// The standard `hppa64` calling convention. + hppa64_elf: CommonOptions, + + kvx_lp64: CommonOptions, + kvx_ilp32: CommonOptions, + + /// The standard `lanai` calling convention. + lanai_sysv: CommonOptions, + + /// The standard `loongarch64` calling convention. + loongarch64_lp64: CommonOptions, + + /// The standard `loongarch32` calling convention. + loongarch32_ilp32: CommonOptions, + + // Calling conventions for the `m68k` architecture. + m68k_sysv: CommonOptions, + m68k_gnu: CommonOptions, + m68k_rtd: CommonOptions, + m68k_interrupt: CommonOptions, + + /// The standard `microblaze`/`microblazeel` calling convention. + microblaze_std: CommonOptions, + microblaze_interrupt: MicroblazeInterruptOptions, + + /// The standard `msp430` calling convention. + msp430_eabi: CommonOptions, + msp430_interrupt: CommonOptions, + + /// The standard `or1k` calling convention. + or1k_sysv: CommonOptions, + + /// The standard `propeller` calling convention. + propeller_sysv: CommonOptions, + + // Calling conventions for the `s390x` architecture. + s390x_sysv: CommonOptions, + s390x_sysv_vx: CommonOptions, + + // Calling conventions for the `sh`/`sheb` architecture. + sh_gnu: CommonOptions, + sh_renesas: CommonOptions, + sh_interrupt: ShInterruptOptions, + + /// The standard `ve` calling convention. + ve_sysv: CommonOptions, + + // Calling conventions for the `xcore` architecture. + xcore_xs1: CommonOptions, + xcore_xs2: CommonOptions, + + // Calling conventions for the `xtensa`/`xtensaeb` architecture. + xtensa_call0: CommonOptions, + xtensa_windowed: CommonOptions, + + // Calling conventions for the `amdgcn` architecture. + amdgcn_device: CommonOptions, + amdgcn_kernel, + amdgcn_cs: CommonOptions, + + // Calling conventions for the `nvptx` and `nvptx64` architectures. + nvptx_device, + nvptx_kernel, + + // Calling conventions for kernels and shaders on the `spirv`, `spirv32`, and `spirv64` architectures. + spirv_device, + spirv_kernel, + spirv_fragment, + spirv_vertex, + + // Calling conventions for the `ez80` architecture. + ez80_cet, + ez80_tiflags, + + /// Options shared across most calling conventions. + pub const CommonOptions = struct { + /// The boundary the stack is aligned to when the function is called. + /// `null` means the default for this calling convention. + incoming_stack_alignment: ?u64 = null, + }; + + /// Options for x86 calling conventions which support the regparm attribute to pass some + /// arguments in registers. + pub const X86RegparmOptions = struct { + /// The boundary the stack is aligned to when the function is called. + /// `null` means the default for this calling convention. + incoming_stack_alignment: ?u64 = null, + /// The number of arguments to pass in registers before passing the remaining arguments + /// according to the calling convention. + /// Equivalent to `__attribute__((regparm(x)))` in Clang and GCC. + register_params: u2 = 0, + }; + + /// Options for the `arc_interrupt` calling convention. + pub const ArcInterruptOptions = struct { + /// The boundary the stack is aligned to when the function is called. + /// `null` means the default for this calling convention. + incoming_stack_alignment: ?u64 = null, + /// The kind of interrupt being received. + type: InterruptType, + + pub const InterruptType = enum(u2) { + ilink1, + ilink2, + ilink, + firq, + }; + }; + + /// Options for the `arm_interrupt` calling convention. + pub const ArmInterruptOptions = struct { + /// The boundary the stack is aligned to when the function is called. + /// `null` means the default for this calling convention. + incoming_stack_alignment: ?u64 = null, + /// The kind of interrupt being received. + type: InterruptType = .generic, + + pub const InterruptType = enum(u3) { + generic, + irq, + fiq, + swi, + abort, + undef, + }; + }; + + /// Options for the `microblaze_interrupt` calling convention. + pub const MicroblazeInterruptOptions = struct { + /// The boundary the stack is aligned to when the function is called. + /// `null` means the default for this calling convention. + incoming_stack_alignment: ?u64 = null, + type: InterruptType = .regular, + + pub const InterruptType = enum(u2) { + /// User exception; return with `rtsd`. + user, + /// Regular interrupt; return with `rtid`. + regular, + /// Fast interrupt; return with `rtid`. + fast, + /// Software breakpoint; return with `rtbd`. + breakpoint, + }; + }; + + /// Options for the `mips_interrupt` and `mips64_interrupt` calling conventions. + pub const MipsInterruptOptions = struct { + /// The boundary the stack is aligned to when the function is called. + /// `null` means the default for this calling convention. + incoming_stack_alignment: ?u64 = null, + /// The interrupt mode. + mode: InterruptMode = .eic, + + pub const InterruptMode = enum(u4) { + eic, + sw0, + sw1, + hw0, + hw1, + hw2, + hw3, + hw4, + hw5, + }; + }; + + /// Options for the `riscv32_interrupt` and `riscv64_interrupt` calling conventions. + pub const RiscvInterruptOptions = struct { + /// The boundary the stack is aligned to when the function is called. + /// `null` means the default for this calling convention. + incoming_stack_alignment: ?u64 = null, + /// The privilege mode. + mode: PrivilegeMode, + + pub const PrivilegeMode = enum(u2) { + supervisor, + machine, + }; + }; + + /// Options for the `sh_interrupt` calling convention. + pub const ShInterruptOptions = struct { + /// The boundary the stack is aligned to when the function is called. + /// `null` means the default for this calling convention. + incoming_stack_alignment: ?u64 = null, + save: SaveBehavior = .full, + + pub const SaveBehavior = enum(u3) { + /// Save only fpscr (if applicable). + fpscr, + /// Save only high-numbered registers, i.e. r0 through r7 are *not* saved. + high, + /// Save all registers normally. + full, + /// Save all registers using the CPU's fast register bank. + bank, + }; + }; + + /// Returns the array of `std.Target.Cpu.Arch` to which this `CallingConvention` applies. + /// Asserts that `cc` is not `.auto`, `.@"async"`, `.naked`, or `.@"inline"`. + pub fn archs(cc: CallingConvention) []const std.Target.Cpu.Arch { + return std.Target.Cpu.Arch.fromCallingConvention(cc); + } + + pub fn eql(a: CallingConvention, b: CallingConvention) bool { + return std.meta.eql(a, b); + } + + pub fn withStackAlign(cc: CallingConvention, incoming_stack_alignment: u64) CallingConvention { + const tag: CallingConvention.Tag = cc; + var result = cc; + @field(result, @tagName(tag)).incoming_stack_alignment = incoming_stack_alignment; + return result; + } +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const AddressSpace = enum(u5) { + // CPU address spaces. + generic, + gs, + fs, + ss, + + // x86_16 extra address spaces. + /// Allows addressing the entire address space by storing both segment and offset. + far, + + // GPU address spaces. + global, + constant, + param, + shared, + local, + input, + output, + uniform, + push_constant, + storage_buffer, + physical_storage_buffer, + + // AVR address spaces. + flash, + flash1, + flash2, + flash3, + flash4, + flash5, + + // Propeller address spaces. + + /// This address space only addresses the cog-local ram. + cog, + + /// This address space only addresses shared hub ram. + hub, + + /// This address space only addresses the "lookup" ram + lut, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const SourceLocation = struct { + /// The name chosen when compiling. Not a file path. + module: [:0]const u8, + /// Relative to the root directory of its module. + file: [:0]const u8, + fn_name: [:0]const u8, + line: u32, + column: u32, +}; + +pub const TypeId = std.meta.Tag(Type); + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const Type = union(enum) { + type, + void, + bool, + noreturn, + int: Int, + float: Float, + pointer: Pointer, + array: Array, + @"struct": Struct, + comptime_float, + comptime_int, + undefined, + null, + optional: Optional, + error_union: ErrorUnion, + error_set: ErrorSet, + @"enum": Enum, + @"union": Union, + @"fn": Fn, + @"opaque": Opaque, + frame: Frame, + @"anyframe": AnyFrame, + vector: Vector, + enum_literal, + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Int = struct { + signedness: Signedness, + bits: u16, + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Float = struct { + bits: u16, + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Pointer = struct { + size: Size, + is_const: bool, + is_volatile: bool, + /// `null` means implicit alignment, which is equivalent to `@alignOf(child)`. + alignment: ?usize, + address_space: AddressSpace, + child: type, + is_allowzero: bool, + + /// The type of the sentinel is the element type of the pointer, which is + /// the value of the `child` field in this struct. However there is no way + /// to refer to that type here, so we use `*const anyopaque`. + /// See also: `sentinel` + sentinel_ptr: ?*const anyopaque, + + /// Loads the pointer type's sentinel value from `sentinel_ptr`. + /// Returns `null` if the pointer type has no sentinel. + pub inline fn sentinel(comptime ptr: Pointer) ?ptr.child { + const sp: *const ptr.child = @ptrCast(@alignCast(ptr.sentinel_ptr orelse return null)); + return sp.*; + } + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Size = enum(u2) { + one, + many, + slice, + c, + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Attributes = struct { + @"const": bool = false, + @"volatile": bool = false, + @"allowzero": bool = false, + @"addrspace": ?AddressSpace = null, + @"align": ?usize = null, + }; + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Array = struct { + len: comptime_int, + child: type, + + /// The type of the sentinel is the element type of the array, which is + /// the value of the `child` field in this struct. However there is no way + /// to refer to that type here, so we use `*const anyopaque`. + /// See also: `sentinel`. + sentinel_ptr: ?*const anyopaque, + + /// Loads the array type's sentinel value from `sentinel_ptr`. + /// Returns `null` if the array type has no sentinel. + pub inline fn sentinel(comptime arr: Array) ?arr.child { + const sp: *const arr.child = @ptrCast(@alignCast(arr.sentinel_ptr orelse return null)); + return sp.*; + } + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const ContainerLayout = enum(u2) { + auto, + @"extern", + @"packed", + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const StructField = struct { + name: [:0]const u8, + type: type, + /// The type of the default value is the type of this struct field, which + /// is the value of the `type` field in this struct. However there is no + /// way to refer to that type here, so we use `*const anyopaque`. + /// See also: `defaultValue`. + default_value_ptr: ?*const anyopaque, + is_comptime: bool, + /// `null` means the field alignment was not explicitly specified. The + /// field will still be aligned to at least `@alignOf` its `type`. + alignment: ?usize, + + /// Loads the field's default value from `default_value_ptr`. + /// Returns `null` if the field has no default value. + pub inline fn defaultValue(comptime sf: StructField) ?sf.type { + const dp: *const sf.type = @ptrCast(@alignCast(sf.default_value_ptr orelse return null)); + return dp.*; + } + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Attributes = struct { + @"comptime": bool = false, + @"align": ?usize = null, + default_value_ptr: ?*const anyopaque = null, + }; + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Struct = struct { + layout: ContainerLayout, + /// Only valid if layout is .@"packed" + backing_integer: ?type = null, + fields: []const StructField, + decls: []const Declaration, + is_tuple: bool, + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Optional = struct { + child: type, + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const ErrorUnion = struct { + error_set: type, + payload: type, + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Error = struct { + name: [:0]const u8, + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const ErrorSet = ?[]const Error; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const EnumField = struct { + name: [:0]const u8, + value: comptime_int, + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Enum = struct { + tag_type: type, + fields: []const EnumField, + decls: []const Declaration, + is_exhaustive: bool, + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Mode = enum { exhaustive, nonexhaustive }; + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const UnionField = struct { + name: [:0]const u8, + type: type, + /// `null` means the field alignment was not explicitly specified. The + /// field will still be aligned to at least `@alignOf` its `type`. + alignment: ?usize, + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Attributes = struct { + @"align": ?usize = null, + }; + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Union = struct { + layout: ContainerLayout, + tag_type: ?type, + fields: []const UnionField, + decls: []const Declaration, + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Fn = struct { + calling_convention: CallingConvention, + is_generic: bool, + is_var_args: bool, + /// TODO change the language spec to make this not optional. + return_type: ?type, + params: []const Param, + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Param = struct { + is_generic: bool, + is_noalias: bool, + type: ?type, + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Attributes = struct { + @"noalias": bool = false, + }; + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Attributes = struct { + @"callconv": CallingConvention = .auto, + varargs: bool = false, + }; + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Opaque = struct { + decls: []const Declaration, + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Frame = struct { + function: *const anyopaque, + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const AnyFrame = struct { + child: ?type, + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Vector = struct { + len: comptime_int, + child: type, + }; + + /// This data structure is used by the Zig language code generation and + /// therefore must be kept in sync with the compiler implementation. + pub const Declaration = struct { + name: [:0]const u8, + }; +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const FloatMode = enum { + strict, + optimized, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const Endian = enum { + big, + little, + + pub const native = builtin.target.cpu.arch.endian(); + pub const foreign: Endian = @enumFromInt(1 - @intFromEnum(native)); +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const Signedness = enum(u1) { + signed, + unsigned, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const OutputMode = enum { + Exe, + Lib, + Obj, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const LinkMode = enum { + static, + dynamic, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const UnwindTables = enum { + none, + sync, + async, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const WasiExecModel = enum { + command, + reactor, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const CallModifier = enum { + /// Equivalent to function call syntax. + auto, + /// Prevents tail call optimization. This guarantees that the return + /// address will point to the callsite, as opposed to the callsite's + /// callsite. If the call is otherwise required to be tail-called + /// or inlined, a compile error is emitted instead. + never_tail, + /// Guarantees that the call will not be inlined. If the call is + /// otherwise required to be inlined, a compile error is emitted instead. + never_inline, + /// Asserts that the function call will not suspend. This allows a + /// non-async function to call an async function. + no_suspend, + /// Guarantees that the call will be generated with tail call optimization. + /// If this is not possible, a compile error is emitted instead. + always_tail, + /// Guarantees that the call will be inlined at the callsite. + /// If this is not possible, a compile error is emitted instead. + always_inline, + /// Evaluates the call at compile-time. If the call cannot be completed at + /// compile-time, a compile error is emitted instead. + compile_time, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const VaListAarch64 = extern struct { + __stack: *anyopaque, + __gr_top: *anyopaque, + __vr_top: *anyopaque, + __gr_offs: c_int, + __vr_offs: c_int, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const VaListAlpha = extern struct { + __base: *anyopaque, + __offset: c_int, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const VaListArm = extern struct { + __ap: *anyopaque, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const VaListHexagon = extern struct { + __gpr: c_long, + __fpr: c_long, + __overflow_arg_area: *anyopaque, + __reg_save_area: *anyopaque, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const VaListPowerPc = extern struct { + gpr: u8, + fpr: u8, + reserved: c_ushort, + overflow_arg_area: *anyopaque, + reg_save_area: *anyopaque, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const VaListS390x = extern struct { + __current_saved_reg_area_pointer: *anyopaque, + __saved_reg_area_end_pointer: *anyopaque, + __overflow_area_pointer: *anyopaque, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const VaListSh = extern struct { + __va_next_o: *anyopaque, + __va_next_o_limit: *anyopaque, + __va_next_fp: *anyopaque, + __va_next_fp_limit: *anyopaque, + __va_next_stack: *anyopaque, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const VaListX86_64 = extern struct { + gp_offset: c_uint, + fp_offset: c_uint, + overflow_arg_area: *anyopaque, + reg_save_area: *anyopaque, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const VaListXtensa = extern struct { + __va_stk: *c_int, + __va_reg: *c_int, + __va_ndx: c_int, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const VaList = switch (builtin.cpu.arch) { + .amdgcn, + .msp430, + .nvptx, + .nvptx64, + .powerpc64, + .powerpc64le, + .x86, + => *u8, + .arc, + .arceb, + .avr, + .bpfel, + .bpfeb, + .csky, + .hppa, + .hppa64, + .kvx, + .lanai, + .loongarch32, + .loongarch64, + .m68k, + .microblaze, + .microblazeel, + .mips, + .mipsel, + .mips64, + .mips64el, + .riscv32, + .riscv32be, + .riscv64, + .riscv64be, + .sparc, + .sparc64, + .spirv32, + .spirv64, + .ve, + .wasm32, + .wasm64, + .xcore, + => *anyopaque, + .aarch64, .aarch64_be => switch (builtin.os.tag) { + .driverkit, .ios, .maccatalyst, .macos, .tvos, .visionos, .watchos, .windows => *u8, + else => switch (builtin.zig_backend) { + else => VaListAarch64, + .stage2_llvm => @compileError("disabled due to miscompilations"), + }, + }, + .alpha => VaListAlpha, + .arm, .armeb, .thumb, .thumbeb => VaListArm, + .hexagon => if (builtin.target.abi.isMusl()) VaListHexagon else *u8, + .powerpc, .powerpcle => VaListPowerPc, + .s390x => VaListS390x, + .sh, .sheb => VaListSh, // This is wrong for `sh_renesas`: https://github.com/ziglang/zig/issues/24692#issuecomment-3150779829 + .x86_64 => switch (builtin.os.tag) { + .uefi, .windows => switch (builtin.zig_backend) { + else => *u8, + .stage2_llvm => @compileError("disabled due to miscompilations"), + }, + else => VaListX86_64, + }, + .xtensa, .xtensaeb => VaListXtensa, + else => @compileError("VaList not supported for this target yet"), +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const PrefetchOptions = struct { + /// Whether the prefetch should prepare for a read or a write. + rw: Rw = .read, + /// The data's locality in an inclusive range from 0 to 3. + /// + /// 0 means no temporal locality. That is, the data can be immediately + /// dropped from the cache after it is accessed. + /// + /// 3 means high temporal locality. That is, the data should be kept in + /// the cache as it is likely to be accessed again soon. + locality: u2 = 3, + /// The cache that the prefetch should be performed on. + cache: Cache = .data, + + pub const Rw = enum(u1) { + read, + write, + }; + + pub const Cache = enum(u1) { + instruction, + data, + }; +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const ExportOptions = struct { + name: []const u8, + linkage: GlobalLinkage = .strong, + section: ?[]const u8 = null, + visibility: SymbolVisibility = .default, +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const ExternOptions = struct { + name: []const u8, + library_name: ?[]const u8 = null, + linkage: GlobalLinkage = .strong, + visibility: SymbolVisibility = .default, + /// Setting this to `true` makes the `@extern` a runtime value. + is_thread_local: bool = false, + is_dll_import: bool = false, + relocation: Relocation = .any, + decoration: ?Decoration = null, + + pub const Decoration = union(enum) { + location: u32, + descriptor: Descriptor, + + pub const Descriptor = struct { + binding: u32, + set: u32, + }; + }; + + pub const Relocation = enum(u1) { + /// Any type of relocation is allowed. + any, + /// A program-counter-relative relocation is required. + /// Using this value makes the `@extern` a runtime value. + pcrel, + }; +}; + +/// This data structure is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const BranchHint = enum(u3) { + /// Equivalent to no hint given. + none, + /// This branch of control flow is more likely to be reached than its peers. + /// The optimizer should optimize for reaching it. + likely, + /// This branch of control flow is less likely to be reached than its peers. + /// The optimizer should optimize for not reaching it. + unlikely, + /// This branch of control flow is unlikely to *ever* be reached. + /// The optimizer may place it in a different page of memory to optimize other branches. + cold, + /// It is difficult to predict whether this branch of control flow will be reached. + /// The optimizer should avoid branching behavior with expensive mispredictions. + unpredictable, +}; + +/// This enum is set by the compiler and communicates which compiler backend is +/// used to produce machine code. +/// Think carefully before deciding to observe this value. Nearly all code should +/// be agnostic to the backend that implements the language. The use case +/// to use this value is to **work around problems with compiler implementations.** +/// +/// Avoid failing the compilation if the compiler backend does not match a +/// whitelist of backends; rather one should detect that a known problem would +/// occur in a blacklist of backends. +/// +/// The enum is nonexhaustive so that alternate Zig language implementations may +/// choose a number as their tag (please use a random number generator rather +/// than a "cute" number) and codebases can interact with these values even if +/// this upstream enum does not have a name for the number. Of course, upstream +/// is happy to accept pull requests to add Zig implementations to this enum. +/// +/// This data structure is part of the Zig language specification. +pub const CompilerBackend = enum(u64) { + /// It is allowed for a compiler implementation to not reveal its identity, + /// in which case this value is appropriate. Be cool and make sure your + /// code supports `other` Zig compilers! + other = 0, + /// The original Zig compiler created in 2015 by Andrew Kelley. Implemented + /// in C++. Used LLVM. Deleted from the ZSF ziglang/zig codebase on + /// December 6th, 2022. + stage1 = 1, + /// The reference implementation self-hosted compiler of Zig, using the + /// LLVM backend. + stage2_llvm = 2, + /// The reference implementation self-hosted compiler of Zig, using the + /// backend that generates C source code. + /// Note that one can observe whether the compilation will output C code + /// directly with `object_format` value rather than the `compiler_backend` value. + stage2_c = 3, + /// The reference implementation self-hosted compiler of Zig, using the + /// WebAssembly backend. + stage2_wasm = 4, + /// The reference implementation self-hosted compiler of Zig, using the + /// arm backend. + stage2_arm = 5, + /// The reference implementation self-hosted compiler of Zig, using the + /// x86_64 backend. + stage2_x86_64 = 6, + /// The reference implementation self-hosted compiler of Zig, using the + /// aarch64 backend. + stage2_aarch64 = 7, + /// The reference implementation self-hosted compiler of Zig, using the + /// x86 backend. + stage2_x86 = 8, + /// The reference implementation self-hosted compiler of Zig, using the + /// riscv64 backend. + stage2_riscv64 = 9, + /// The reference implementation self-hosted compiler of Zig, using the + /// sparc64 backend. + stage2_sparc64 = 10, + /// The reference implementation self-hosted compiler of Zig, using the + /// spirv backend. + stage2_spirv = 11, + /// The reference implementation self-hosted compiler of Zig, using the + /// powerpc backend. + stage2_powerpc = 12, + + _, +}; + +/// This function type is used by the Zig language code generation and +/// therefore must be kept in sync with the compiler implementation. +pub const TestFn = struct { + name: []const u8, + func: *const fn () anyerror!void, +}; + +/// This namespace is used by the Zig compiler to emit various kinds of safety +/// panics. These can be overridden by making a public `panic` namespace in the +/// root source file. +pub const panic: type = p: { + if (@hasDecl(root, "panic")) { + if (@TypeOf(root.panic) != type) { + // Deprecated; make `panic` a namespace instead. + break :p std.debug.FullPanic(struct { + fn panic(msg: []const u8, ra: ?usize) noreturn { + root.panic(msg, @errorReturnTrace(), ra); + } + }.panic); + } + break :p root.panic; + } + break :p switch (builtin.zig_backend) { + .stage2_powerpc, + .stage2_riscv64, + => std.debug.simple_panic, + else => std.debug.FullPanic(std.debug.defaultPanic), + }; +}; + +pub noinline fn returnError() void { + @branchHint(.unlikely); + @setRuntimeSafety(false); + const st = @errorReturnTrace().?; + if (st.index < st.instruction_addresses.len) + st.instruction_addresses[st.index] = @returnAddress(); + st.index += 1; +} diff --git a/lib/std/builtin/assembly.zig b/lib/std/lang/assembly.zig diff --git a/lib/std/std.zig b/lib/std/std.zig @@ -65,8 +65,11 @@ pub const array_hash_map = @import("array_hash_map.zig"); pub const atomic = @import("atomic.zig"); pub const base64 = @import("base64.zig"); pub const bit_set = @import("bit_set.zig"); +/// Deprecated; use `lang`. +/// +/// To be removed after Zig 0.17.0. pub const builtin = lang; -pub const lang = @import("builtin.zig"); +pub const lang = @import("lang.zig"); pub const c = @import("c.zig"); pub const coff = @import("coff.zig"); pub const compress = @import("compress.zig");