Mercurial > projects > ldc
diff lphobos/std/c/stdarg.d @ 55:0ccfae271c45 trunk
[svn r59] Added support for C-style variadic functions. Currently only works on x86, x86-64 va_arg is broken in LLVM 2.1. PPC and PPC64 unknown.
Updates to runtime. Rebuild!
author | lindquist |
---|---|
date | Wed, 24 Oct 2007 22:18:06 +0200 |
parents | c53b6e3fe49a |
children | 373489eeaf90 |
line wrap: on
line diff
--- a/lphobos/std/c/stdarg.d Wed Oct 24 01:37:34 2007 +0200 +++ b/lphobos/std/c/stdarg.d Wed Oct 24 22:18:06 2007 +0200 @@ -1,7 +1,7 @@ /** * C's <stdarg.h> - * Authors: Hauke Duden and Walter Bright, Digital Mars, www.digitalmars.com + * Authors: Hauke Duden, Walter Bright and Tomas Lindquist Olsen, Digital Mars, www.digitalmars.com * License: Public Domain * Macros: * WIKI=Phobos/StdCStdarg @@ -11,32 +11,16 @@ module std.c.stdarg; -alias void* va_list; +public import llvm.va_list; -template va_start(T) -{ - void va_start(out va_list ap, inout T parmn) - { - ap = cast(va_list)(cast(void*)&parmn + ((T.sizeof + int.sizeof - 1) & ~(int.sizeof - 1))); - } -} +pragma(LLVM_internal, "va_start") + void va_start(T)(va_list ap, ref T); -template va_arg(T) -{ - T va_arg(inout va_list ap) - { - T arg = *cast(T*)ap; - ap = cast(va_list)(cast(void*)ap + ((T.sizeof + int.sizeof - 1) & ~(int.sizeof - 1))); - return arg; - } -} +pragma(LLVM_internal, "va_arg") + T va_arg(T)(va_list ap); -void va_end(va_list ap) -{ - -} +pragma(LLVM_internal, "va_intrinsic", "llvm.va_end") + void va_end(va_list args); -void va_copy(out va_list dest, va_list src) -{ - dest = src; -} +pragma(LLVM_internal, "va_intrinsic", "llvm.va_copy") + void va_copy(va_list dst, va_list src);