mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-08-19 12:50:04 +02:00
[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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user