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);