Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.

Commit 4f7402d

Browse files
committed
Move TypeInfo-based va_arg version from core.stdc.stdarg to core.vararg
1 parent 9d10a6e commit 4f7402d

File tree

2 files changed

+134
-111
lines changed

2 files changed

+134
-111
lines changed

src/core/stdc/stdarg.d

Lines changed: 13 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -41,31 +41,26 @@ else version (SysV_x64)
4141
}
4242
}
4343

44-
version (OSX)
45-
version = Darwin;
46-
else version (iOS)
47-
version = Darwin;
48-
else version (TVOS)
49-
version = Darwin;
50-
else version (WatchOS)
51-
version = Darwin;
52-
53-
version (Darwin) { /* simpler varargs implementation */ }
54-
else
55-
{
56-
version (ARM)
57-
version = AAPCS32;
58-
version (AArch64)
59-
version = AAPCS64;
60-
}
61-
6244
version (ARM) version = ARM_Any;
6345
version (AArch64) version = ARM_Any;
6446
version (MIPS32) version = MIPS_Any;
6547
version (MIPS64) version = MIPS_Any;
6648
version (PPC) version = PPC_Any;
6749
version (PPC64) version = PPC_Any;
6850

51+
version (ARM_Any)
52+
{
53+
// Darwin uses a simpler varargs implementation
54+
version (OSX) {}
55+
else version (iOS) {}
56+
else version (TVOS) {}
57+
else version (WatchOS) {}
58+
else:
59+
60+
version (ARM) version = AAPCS32;
61+
version (AArch64) version = AAPCS64;
62+
}
63+
6964

7065
T alignUp(size_t alignment = size_t.sizeof, T)(T base) pure
7166
{
@@ -275,99 +270,6 @@ void va_arg(T)(ref va_list ap, ref T parmn)
275270
}
276271

277272

278-
/**
279-
* Retrieve and store through parmn the next value that is of TypeInfo ti.
280-
* Used when the static type is not known.
281-
*/
282-
version (GNU) { /* unsupported */ } else
283-
void va_arg()(ref va_list ap, TypeInfo ti, void* parmn)
284-
{
285-
version (X86)
286-
{
287-
// Wait until everyone updates to get TypeInfo.talign
288-
//auto talign = ti.talign;
289-
//auto p = cast(void*)(cast(size_t)ap + talign - 1) & ~(talign - 1);
290-
auto p = ap;
291-
auto tsize = ti.tsize;
292-
ap = cast(va_list) (p + tsize.alignUp);
293-
parmn[0..tsize] = p[0..tsize];
294-
}
295-
else version (Win64)
296-
{
297-
version (LDC) enum isLDC = true;
298-
else enum isLDC = false;
299-
300-
// Wait until everyone updates to get TypeInfo.talign
301-
//auto talign = ti.talign;
302-
//auto p = cast(void*)(cast(size_t)ap + talign - 1) & ~(talign - 1);
303-
auto p = ap;
304-
auto tsize = ti.tsize;
305-
void* q;
306-
if (isLDC && tsize == 16 && cast(TypeInfo_Array) ti)
307-
{
308-
q = p;
309-
ap = cast(va_list) (p + tsize);
310-
}
311-
else
312-
{
313-
q = (tsize > size_t.sizeof || (tsize & (tsize - 1)) != 0) ? *cast(void**) p : p;
314-
ap = cast(va_list) (p + size_t.sizeof);
315-
}
316-
parmn[0..tsize] = q[0..tsize];
317-
}
318-
else version (SysV_x64)
319-
{
320-
core.internal.vararg.sysv_x64.va_arg(ap, ti, parmn);
321-
}
322-
else version (AAPCS32)
323-
{
324-
const tsize = ti.tsize;
325-
if (ti.talign >= 8)
326-
ap.__ap = ap.__ap.alignUp!8;
327-
auto p = ap.__ap;
328-
version (BigEndian)
329-
p = adjustForBigEndian(p, tsize);
330-
ap.__ap += tsize.alignUp;
331-
parmn[0..tsize] = p[0..tsize];
332-
}
333-
else version (AAPCS64)
334-
{
335-
static assert(0, "Unsupported platform");
336-
}
337-
else version (ARM_Any)
338-
{
339-
const tsize = ti.tsize;
340-
auto p = cast(void*) ap;
341-
version (BigEndian)
342-
p = adjustForBigEndian(p, tsize);
343-
ap += tsize.alignUp;
344-
parmn[0..tsize] = p[0..tsize];
345-
}
346-
else version (PPC_Any)
347-
{
348-
if (ti.talign >= 8)
349-
ap = ap.alignUp!8;
350-
const tsize = ti.tsize;
351-
auto p = cast(void*) ap;
352-
version (BigEndian)
353-
p = adjustForBigEndian(p, tsize);
354-
ap += tsize.alignUp;
355-
parmn[0..tsize] = p[0..tsize];
356-
}
357-
else version (MIPS_Any)
358-
{
359-
const tsize = ti.tsize;
360-
auto p = cast(void*) ap;
361-
version (BigEndian)
362-
p = adjustForBigEndian(p, tsize);
363-
ap += tsize.alignUp;
364-
parmn[0..tsize] = p[0..tsize];
365-
}
366-
else
367-
static assert(0, "Unsupported platform");
368-
}
369-
370-
371273
/**
372274
* End use of ap.
373275
*/

src/core/vararg.d

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,124 @@
1717
module core.vararg;
1818

1919
public import core.stdc.stdarg;
20+
21+
22+
version (GNU) { /* TypeInfo-based va_arg overload unsupported */ }
23+
else:
24+
25+
version (ARM) version = ARM_Any;
26+
version (AArch64) version = ARM_Any;
27+
version (MIPS32) version = MIPS_Any;
28+
version (MIPS64) version = MIPS_Any;
29+
version (PPC) version = PPC_Any;
30+
version (PPC64) version = PPC_Any;
31+
32+
version (ARM_Any)
33+
{
34+
// Darwin uses a simpler varargs implementation
35+
version (OSX) {}
36+
else version (iOS) {}
37+
else version (TVOS) {}
38+
else version (WatchOS) {}
39+
else:
40+
41+
version (ARM) version = AAPCS32;
42+
version (AArch64) version = AAPCS64;
43+
}
44+
45+
46+
///
47+
alias va_arg = core.stdc.stdarg.va_arg;
48+
49+
50+
/**
51+
* Retrieve and store through parmn the next value that is of TypeInfo ti.
52+
* Used when the static type is not known.
53+
*/
54+
void va_arg()(ref va_list ap, TypeInfo ti, void* parmn)
55+
{
56+
version (X86)
57+
{
58+
// Wait until everyone updates to get TypeInfo.talign
59+
//auto talign = ti.talign;
60+
//auto p = cast(void*)(cast(size_t)ap + talign - 1) & ~(talign - 1);
61+
auto p = ap;
62+
auto tsize = ti.tsize;
63+
ap = cast(va_list) (p + tsize.alignUp);
64+
parmn[0..tsize] = p[0..tsize];
65+
}
66+
else version (Win64)
67+
{
68+
version (LDC) enum isLDC = true;
69+
else enum isLDC = false;
70+
71+
// Wait until everyone updates to get TypeInfo.talign
72+
//auto talign = ti.talign;
73+
//auto p = cast(void*)(cast(size_t)ap + talign - 1) & ~(talign - 1);
74+
auto p = ap;
75+
auto tsize = ti.tsize;
76+
void* q;
77+
if (isLDC && tsize == 16 && cast(TypeInfo_Array) ti)
78+
{
79+
q = p;
80+
ap = cast(va_list) (p + tsize);
81+
}
82+
else
83+
{
84+
q = (tsize > size_t.sizeof || (tsize & (tsize - 1)) != 0) ? *cast(void**) p : p;
85+
ap = cast(va_list) (p + size_t.sizeof);
86+
}
87+
parmn[0..tsize] = q[0..tsize];
88+
}
89+
else version (X86_64)
90+
{
91+
static import core.internal.vararg.sysv_x64;
92+
core.internal.vararg.sysv_x64.va_arg(ap, ti, parmn);
93+
}
94+
else version (AAPCS32)
95+
{
96+
const tsize = ti.tsize;
97+
if (ti.talign >= 8)
98+
ap.__ap = ap.__ap.alignUp!8;
99+
auto p = ap.__ap;
100+
version (BigEndian)
101+
p = adjustForBigEndian(p, tsize);
102+
ap.__ap += tsize.alignUp;
103+
parmn[0..tsize] = p[0..tsize];
104+
}
105+
else version (AAPCS64)
106+
{
107+
static assert(0, "Unsupported platform");
108+
}
109+
else version (ARM_Any)
110+
{
111+
const tsize = ti.tsize;
112+
auto p = cast(void*) ap;
113+
version (BigEndian)
114+
p = adjustForBigEndian(p, tsize);
115+
ap += tsize.alignUp;
116+
parmn[0..tsize] = p[0..tsize];
117+
}
118+
else version (PPC_Any)
119+
{
120+
if (ti.talign >= 8)
121+
ap = ap.alignUp!8;
122+
const tsize = ti.tsize;
123+
auto p = cast(void*) ap;
124+
version (BigEndian)
125+
p = adjustForBigEndian(p, tsize);
126+
ap += tsize.alignUp;
127+
parmn[0..tsize] = p[0..tsize];
128+
}
129+
else version (MIPS_Any)
130+
{
131+
const tsize = ti.tsize;
132+
auto p = cast(void*) ap;
133+
version (BigEndian)
134+
p = adjustForBigEndian(p, tsize);
135+
ap += tsize.alignUp;
136+
parmn[0..tsize] = p[0..tsize];
137+
}
138+
else
139+
static assert(0, "Unsupported platform");
140+
}

0 commit comments

Comments
 (0)