@@ -86,6 +86,17 @@ unittest
86
86
}
87
87
88
88
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
+
89
100
/**
90
101
* The argument pointer type.
91
102
*/
@@ -211,7 +222,10 @@ void va_arg(T)(ref va_list ap, ref T parmn)
211
222
// instead of normal 4-byte alignment (APCS doesn't do this).
212
223
if (T.alignof >= 8 )
213
224
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);
215
229
parmn = * cast (T* ) p;
216
230
ap.__ap += T.sizeof.alignUp;
217
231
}
@@ -221,7 +235,10 @@ void va_arg(T)(ref va_list ap, ref T parmn)
221
235
}
222
236
else version (ARM_Any)
223
237
{
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);
225
242
parmn = * cast (T* ) p;
226
243
ap += T.sizeof.alignUp;
227
244
}
@@ -240,7 +257,7 @@ void va_arg(T)(ref va_list ap, ref T parmn)
240
257
auto p = ap;
241
258
version (BigEndian )
242
259
static if (T.sizeof < size_t .sizeof)
243
- p += size_t .sizeof - T.sizeof;
260
+ p = adjustForBigEndian(p, T.sizeof) ;
244
261
parmn = * cast (T* ) p;
245
262
ap += T.sizeof.alignUp;
246
263
}
@@ -249,7 +266,7 @@ void va_arg(T)(ref va_list ap, ref T parmn)
249
266
auto p = ap;
250
267
version (BigEndian )
251
268
static if (T.sizeof < size_t .sizeof)
252
- p += size_t .sizeof - T.sizeof;
269
+ p = adjustForBigEndian(p, T.sizeof) ;
253
270
parmn = * cast (T* ) p;
254
271
ap += T.sizeof.alignUp;
255
272
}
@@ -307,7 +324,9 @@ void va_arg()(ref va_list ap, TypeInfo ti, void* parmn)
307
324
const tsize = ti.tsize;
308
325
if (ti.talign >= 8 )
309
326
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);
311
330
ap.__ap += tsize.alignUp;
312
331
parmn[0 .. tsize] = p[0 .. tsize];
313
332
}
@@ -318,29 +337,29 @@ void va_arg()(ref va_list ap, TypeInfo ti, void* parmn)
318
337
else version (ARM_Any)
319
338
{
320
339
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);
322
343
ap += tsize.alignUp;
323
344
parmn[0 .. tsize] = p[0 .. tsize];
324
345
}
325
346
else version (PPC_Any)
326
347
{
327
348
if (ti.talign >= 8 )
328
349
ap = ap.alignUp! 8 ;
329
- auto p = cast (void * ) ap;
330
350
const tsize = ti.tsize;
351
+ auto p = cast (void * ) ap;
331
352
version (BigEndian )
332
- if (tsize < size_t .sizeof)
333
- p += size_t .sizeof - tsize;
353
+ p = adjustForBigEndian(p, tsize);
334
354
ap += tsize.alignUp;
335
355
parmn[0 .. tsize] = p[0 .. tsize];
336
356
}
337
357
else version (MIPS_Any)
338
358
{
339
- auto p = cast (void * ) ap;
340
359
const tsize = ti.tsize;
360
+ auto p = cast (void * ) ap;
341
361
version (BigEndian )
342
- if (tsize < size_t .sizeof)
343
- p += size_t .sizeof - tsize;
362
+ p = adjustForBigEndian(p, tsize);
344
363
ap += tsize.alignUp;
345
364
parmn[0 .. tsize] = p[0 .. tsize];
346
365
}
0 commit comments