[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!
This commit is contained in:
Tomas Lindquist Olsen
2007-10-24 22:18:06 +02:00
parent 039bc0880d
commit 152e229329
13 changed files with 324 additions and 114 deletions

View File

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