Mercurial > projects > ldc
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 } |