comparison 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
comparison
equal deleted inserted replaced
54:28e99b04a132 55:0ccfae271c45
1 1
2 /** 2 /**
3 * C's <stdarg.h> 3 * C's <stdarg.h>
4 * Authors: Hauke Duden and Walter Bright, Digital Mars, www.digitalmars.com 4 * Authors: Hauke Duden, Walter Bright and Tomas Lindquist Olsen, Digital Mars, www.digitalmars.com
5 * License: Public Domain 5 * License: Public Domain
6 * Macros: 6 * Macros:
7 * WIKI=Phobos/StdCStdarg 7 * WIKI=Phobos/StdCStdarg
8 */ 8 */
9 9
10 /* This is for use with extern(C) variable argument lists. */ 10 /* This is for use with extern(C) variable argument lists. */
11 11
12 module std.c.stdarg; 12 module std.c.stdarg;
13 13
14 alias void* va_list; 14 public import llvm.va_list;
15 15
16 template va_start(T) 16 pragma(LLVM_internal, "va_start")
17 { 17 void va_start(T)(va_list ap, ref T);
18 void va_start(out va_list ap, inout T parmn)
19 {
20 ap = cast(va_list)(cast(void*)&parmn + ((T.sizeof + int.sizeof - 1) & ~(int.sizeof - 1)));
21 }
22 }
23 18
24 template va_arg(T) 19 pragma(LLVM_internal, "va_arg")
25 { 20 T va_arg(T)(va_list ap);
26 T va_arg(inout va_list ap)
27 {
28 T arg = *cast(T*)ap;
29 ap = cast(va_list)(cast(void*)ap + ((T.sizeof + int.sizeof - 1) & ~(int.sizeof - 1)));
30 return arg;
31 }
32 }
33 21
34 void va_end(va_list ap) 22 pragma(LLVM_internal, "va_intrinsic", "llvm.va_end")
35 { 23 void va_end(va_list args);
36 24
37 } 25 pragma(LLVM_internal, "va_intrinsic", "llvm.va_copy")
38 26 void va_copy(va_list dst, va_list src);
39 void va_copy(out va_list dest, va_list src)
40 {
41 dest = src;
42 }