From f7c4031a61d2ccbab543eb9dfece7b34532a9edb Mon Sep 17 00:00:00 2001 From: gingerBill Date: Tue, 28 Apr 2026 15:02:42 +0100 Subject: [PATCH] Map the C `va_*` to the intrinsics --- core/c/c.odin | 13 +++---------- core/c/libc/stdarg.odin | 25 ++++--------------------- 2 files changed, 7 insertions(+), 31 deletions(-) diff --git a/core/c/c.odin b/core/c/c.odin index bc847d566..cbff10e66 100644 --- a/core/c/c.odin +++ b/core/c/c.odin @@ -1,7 +1,8 @@ // Defines the basic types used by `C` programs for foreign function and data structure interop. package c -import builtin "base:builtin" +import builtin "base:builtin" +import intrinsics "base:intrinsics" char :: builtin.u8 // assuming -funsigned-char @@ -115,14 +116,6 @@ NDEBUG :: !ODIN_DEBUG CHAR_BIT :: 8 -// Since there are no types in C with an alignment larger than that of -// max_align_t, which cannot be larger than sizeof(long double) as any other -// exposed type wouldn't be valid C, the maximum alignment possible in a -// strictly conformant C implementation is 16 on the platforms we care about. -// The choice of 4096 bytes for storage of this type is more than enough on all -// relevant platforms. -va_list :: struct #align(16) { - _: [4096]u8, -} +va_list :: intrinsics.c_va_list FILE :: struct {} diff --git a/core/c/libc/stdarg.odin b/core/c/libc/stdarg.odin index 232471713..e7849b19d 100644 --- a/core/c/libc/stdarg.odin +++ b/core/c/libc/stdarg.odin @@ -4,29 +4,12 @@ package libc import "base:intrinsics" -import "core:c" +va_list :: intrinsics.va_list -@(private="file") -@(default_calling_convention="none") -foreign _ { - @(link_name="llvm.va_start") _va_start :: proc(arglist: ^i8) --- - @(link_name="llvm.va_end") _va_end :: proc(arglist: ^i8) --- - @(link_name="llvm.va_copy") _va_copy :: proc(dst, src: ^i8) --- -} +va_start :: intrinsics.va_start +va_end :: intrinsics.va_end +va_copy :: intrinsics.va_copy -va_list :: c.va_list - -va_start :: #force_inline proc(ap: ^va_list, _: any) { - _va_start(cast(^i8)ap) -} - -va_end :: #force_inline proc(ap: ^va_list) { - _va_end(cast(^i8)ap) -} - -va_copy :: #force_inline proc(dst, src: ^va_list) { - _va_copy(cast(^i8)dst, cast(^i8)src) -} // We cannot provide va_arg as there is no way to create "C" style procedures // in Odin which take variable arguments the C way. The #c_vararg attribute only