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

Commit 9d10a6e

Browse files
committed
core.stdc.stdarg: Add adjustForBigEndian() helper
And optimistically fix the ARM big-endian TODOs without testing.
1 parent 73e1f93 commit 9d10a6e

File tree

1 file changed

+31
-12
lines changed

1 file changed

+31
-12
lines changed

src/core/stdc/stdarg.d

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,17 @@ unittest
8686
}
8787

8888

89+
version (BigEndian)
90+
{
91+
// Adjusts a size_t-aligned pointer for types smaller than size_t.
92+
T* adjustForBigEndian(T)(T* p, size_t size) pure
93+
{
94+
return size >= size_t.sizeof ? p :
95+
cast(T*) ((cast(void*) p) + (size_t.sizeof - size));
96+
}
97+
}
98+
99+
89100
/**
90101
* The argument pointer type.
91102
*/
@@ -211,7 +222,10 @@ void va_arg(T)(ref va_list ap, ref T parmn)
211222
// instead of normal 4-byte alignment (APCS doesn't do this).
212223
if (T.alignof >= 8)
213224
ap.__ap = ap.__ap.alignUp!8;
214-
auto p = ap.__ap; // TODO: big-endian adjustment?
225+
auto p = ap.__ap;
226+
version (BigEndian)
227+
static if (T.sizeof < size_t.sizeof)
228+
p = adjustForBigEndian(p, T.sizeof);
215229
parmn = *cast(T*) p;
216230
ap.__ap += T.sizeof.alignUp;
217231
}
@@ -221,7 +235,10 @@ void va_arg(T)(ref va_list ap, ref T parmn)
221235
}
222236
else version (ARM_Any)
223237
{
224-
auto p = ap; // TODO: big-endian adjustment?
238+
auto p = ap;
239+
version (BigEndian)
240+
static if (T.sizeof < size_t.sizeof)
241+
p = adjustForBigEndian(p, T.sizeof);
225242
parmn = *cast(T*) p;
226243
ap += T.sizeof.alignUp;
227244
}
@@ -240,7 +257,7 @@ void va_arg(T)(ref va_list ap, ref T parmn)
240257
auto p = ap;
241258
version (BigEndian)
242259
static if (T.sizeof < size_t.sizeof)
243-
p += size_t.sizeof - T.sizeof;
260+
p = adjustForBigEndian(p, T.sizeof);
244261
parmn = *cast(T*) p;
245262
ap += T.sizeof.alignUp;
246263
}
@@ -249,7 +266,7 @@ void va_arg(T)(ref va_list ap, ref T parmn)
249266
auto p = ap;
250267
version (BigEndian)
251268
static if (T.sizeof < size_t.sizeof)
252-
p += size_t.sizeof - T.sizeof;
269+
p = adjustForBigEndian(p, T.sizeof);
253270
parmn = *cast(T*) p;
254271
ap += T.sizeof.alignUp;
255272
}
@@ -307,7 +324,9 @@ void va_arg()(ref va_list ap, TypeInfo ti, void* parmn)
307324
const tsize = ti.tsize;
308325
if (ti.talign >= 8)
309326
ap.__ap = ap.__ap.alignUp!8;
310-
auto p = ap.__ap; // TODO: big-endian adjustment?
327+
auto p = ap.__ap;
328+
version (BigEndian)
329+
p = adjustForBigEndian(p, tsize);
311330
ap.__ap += tsize.alignUp;
312331
parmn[0..tsize] = p[0..tsize];
313332
}
@@ -318,29 +337,29 @@ void va_arg()(ref va_list ap, TypeInfo ti, void* parmn)
318337
else version (ARM_Any)
319338
{
320339
const tsize = ti.tsize;
321-
auto p = cast(void*) ap; // TODO: big-endian adjustment?
340+
auto p = cast(void*) ap;
341+
version (BigEndian)
342+
p = adjustForBigEndian(p, tsize);
322343
ap += tsize.alignUp;
323344
parmn[0..tsize] = p[0..tsize];
324345
}
325346
else version (PPC_Any)
326347
{
327348
if (ti.talign >= 8)
328349
ap = ap.alignUp!8;
329-
auto p = cast(void*) ap;
330350
const tsize = ti.tsize;
351+
auto p = cast(void*) ap;
331352
version (BigEndian)
332-
if (tsize < size_t.sizeof)
333-
p += size_t.sizeof - tsize;
353+
p = adjustForBigEndian(p, tsize);
334354
ap += tsize.alignUp;
335355
parmn[0..tsize] = p[0..tsize];
336356
}
337357
else version (MIPS_Any)
338358
{
339-
auto p = cast(void*) ap;
340359
const tsize = ti.tsize;
360+
auto p = cast(void*) ap;
341361
version (BigEndian)
342-
if (tsize < size_t.sizeof)
343-
p += size_t.sizeof - tsize;
362+
p = adjustForBigEndian(p, tsize);
344363
ap += tsize.alignUp;
345364
parmn[0..tsize] = p[0..tsize];
346365
}

0 commit comments

Comments
 (0)