@@ -184,8 +184,18 @@ void va_arg(T)(ref va_list ap, ref T parmn)
184
184
}
185
185
else version (Win64 )
186
186
{
187
+ // LDC passes slices as 2 separate 64-bit values, not as 128-bit struct
188
+ version (LDC ) enum isLDC = true ;
189
+ else enum isLDC = false ;
190
+ static if (isLDC && is (T == E[], E))
191
+ {
192
+ const length = * cast (size_t * ) ap;
193
+ ap += size_t .sizeof;
194
+ auto ptr = * cast (typeof (parmn.ptr)* ) ap;
195
+ parmn = ptr[0 .. length];
196
+ }
187
197
// passed indirectly by value if > 64 bits or of a size that is not a power of 2
188
- static if (T.sizeof > size_t .sizeof || (T.sizeof & (T.sizeof - 1 )) != 0 )
198
+ else static if (T.sizeof > size_t .sizeof || (T.sizeof & (T.sizeof - 1 )) != 0 )
189
199
parmn = ** cast (T** ) ap;
190
200
else
191
201
parmn = * cast (T* ) ap;
@@ -267,13 +277,25 @@ void va_arg()(ref va_list ap, TypeInfo ti, void* parmn)
267
277
}
268
278
else version (Win64 )
269
279
{
280
+ version (LDC ) enum isLDC = true ;
281
+ else enum isLDC = false ;
282
+
270
283
// Wait until everyone updates to get TypeInfo.talign
271
284
// auto talign = ti.talign;
272
285
// auto p = cast(void*)(cast(size_t)ap + talign - 1) & ~(talign - 1);
273
286
auto p = ap;
274
287
auto tsize = ti.tsize;
275
- ap = cast (va_list) (p + size_t .sizeof);
276
- void * q = (tsize > size_t .sizeof || (tsize & (tsize - 1 )) != 0 ) ? * cast (void ** ) p : p;
288
+ void * q;
289
+ if (isLDC && tsize == 16 && cast (TypeInfo_Array ) ti)
290
+ {
291
+ q = p;
292
+ ap = cast (va_list) (p + tsize);
293
+ }
294
+ else
295
+ {
296
+ q = (tsize > size_t .sizeof || (tsize & (tsize - 1 )) != 0 ) ? * cast (void ** ) p : p;
297
+ ap = cast (va_list) (p + size_t .sizeof);
298
+ }
277
299
parmn[0 .. tsize] = q[0 .. tsize];
278
300
}
279
301
else version (SysV_x64)
0 commit comments