comparison dyncall/dyncall_callvm_ppc64.c @ 533:71c884e610f0

- integration of patches from Raphael Luba, Thekla, Inc.: * integration of aggregate-by-value (struct, union) support patch for x64 (win and sysv) * windows/x64 asm additions to specify how stack unwinds (help for debuggers, exception handling, etc.) * see Changelog for details - new calling convention modes for thiscalls (platform agnostic, was specific before) * new signature character for platform agnostic thiscalls ('*' / DC_SIGCHAR_CC_THISCALL) - dcCallF(), dcVCallF(), dcArgF() and dcVArgF(): * added support for aggregates-by-value (wasn't part of patch) * change that those functions don't implicitly call dcReset() anymore, which was unflexible (breaking change) - added macros to feature test implementation for aggregate-by-value and syscall support - changed libdyncall_s.lib and libdyncallback_s.lib order in callback test makefiles, as some toolchains are picky about order - doc: * man page updates to describe aggregate interface * manual overview changes to highlight platforms with aggregate-by-value support - test/plain: replaced tests w/ old/stale sctruct interface with new aggregate one
author Tassilo Philipp
date Thu, 21 Apr 2022 13:35:47 +0200
parents ddfb9577a00e
children
comparison
equal deleted inserted replaced
532:d4bf63ab9164 533:71c884e610f0
257 int size = dcVecSize(&self->mVecHead); 257 int size = dcVecSize(&self->mVecHead);
258 258
259 if (size < 64) { 259 if (size < 64) {
260 dcVecSkip(&self->mVecHead, 64-size); 260 dcVecSkip(&self->mVecHead, 64-size);
261 } 261 }
262 262
263 dcCall_ppc64( target, &self->mRegData, dcVecSize(&self->mVecHead) , dcVecData(&self->mVecHead)); 263 dcCall_ppc64( target, &self->mRegData, dcVecSize(&self->mVecHead) , dcVecData(&self->mVecHead));
264 } 264 }
265 265
266 void dc_callvm_call_ppc64_syscall(DCCallVM* in_self, DCpointer target) 266 void dc_callvm_call_ppc64_syscall(DCCallVM* in_self, DCpointer target)
267 { 267 {
283 , &dc_callvm_argLong_ppc64 283 , &dc_callvm_argLong_ppc64
284 , &dc_callvm_argLongLong_ppc64 284 , &dc_callvm_argLongLong_ppc64
285 , &dc_callvm_argFloat_ppc64 285 , &dc_callvm_argFloat_ppc64
286 , &dc_callvm_argDouble_ppc64 286 , &dc_callvm_argDouble_ppc64
287 , &dc_callvm_argPointer_ppc64 287 , &dc_callvm_argPointer_ppc64
288 , NULL /* argStruct */ 288 , NULL /* argAggr */
289 , (DCvoidvmfunc*) &dc_callvm_call_ppc64 289 , (DCvoidvmfunc*) &dc_callvm_call_ppc64
290 , (DCboolvmfunc*) &dc_callvm_call_ppc64 290 , (DCboolvmfunc*) &dc_callvm_call_ppc64
291 , (DCcharvmfunc*) &dc_callvm_call_ppc64 291 , (DCcharvmfunc*) &dc_callvm_call_ppc64
292 , (DCshortvmfunc*) &dc_callvm_call_ppc64 292 , (DCshortvmfunc*) &dc_callvm_call_ppc64
293 , (DCintvmfunc*) &dc_callvm_call_ppc64 293 , (DCintvmfunc*) &dc_callvm_call_ppc64
294 , (DClongvmfunc*) &dc_callvm_call_ppc64 294 , (DClongvmfunc*) &dc_callvm_call_ppc64
295 , (DClonglongvmfunc*) &dc_callvm_call_ppc64 295 , (DClonglongvmfunc*) &dc_callvm_call_ppc64
296 , (DCfloatvmfunc*) &dc_callvm_call_ppc64 296 , (DCfloatvmfunc*) &dc_callvm_call_ppc64
297 , (DCdoublevmfunc*) &dc_callvm_call_ppc64 297 , (DCdoublevmfunc*) &dc_callvm_call_ppc64
298 , (DCpointervmfunc*) &dc_callvm_call_ppc64 298 , (DCpointervmfunc*) &dc_callvm_call_ppc64
299 , NULL /* callStruct */ 299 , NULL /* callAggr */
300 , NULL /* beginAggr */
300 }; 301 };
301 302
302 #if DC__ABI_PPC64_ELF_V == 2 303 #if DC__ABI_PPC64_ELF_V == 2
303 DCCallVM_vt gVT_ppc64_ellipsis = 304 DCCallVM_vt gVT_ppc64_ellipsis =
304 { 305 {
312 , &dc_callvm_argLong_ppc64 313 , &dc_callvm_argLong_ppc64
313 , &dc_callvm_argLongLong_ppc64_ellipsis 314 , &dc_callvm_argLongLong_ppc64_ellipsis
314 , &dc_callvm_argFloat_ppc64_ellipsis 315 , &dc_callvm_argFloat_ppc64_ellipsis
315 , &dc_callvm_argDouble_ppc64_ellipsis 316 , &dc_callvm_argDouble_ppc64_ellipsis
316 , &dc_callvm_argPointer_ppc64 317 , &dc_callvm_argPointer_ppc64
317 , NULL /* argStruct */ 318 , NULL /* argAggr */
318 , (DCvoidvmfunc*) &dc_callvm_call_ppc64 319 , (DCvoidvmfunc*) &dc_callvm_call_ppc64
319 , (DCboolvmfunc*) &dc_callvm_call_ppc64 320 , (DCboolvmfunc*) &dc_callvm_call_ppc64
320 , (DCcharvmfunc*) &dc_callvm_call_ppc64 321 , (DCcharvmfunc*) &dc_callvm_call_ppc64
321 , (DCshortvmfunc*) &dc_callvm_call_ppc64 322 , (DCshortvmfunc*) &dc_callvm_call_ppc64
322 , (DCintvmfunc*) &dc_callvm_call_ppc64 323 , (DCintvmfunc*) &dc_callvm_call_ppc64
323 , (DClongvmfunc*) &dc_callvm_call_ppc64 324 , (DClongvmfunc*) &dc_callvm_call_ppc64
324 , (DClonglongvmfunc*) &dc_callvm_call_ppc64 325 , (DClonglongvmfunc*) &dc_callvm_call_ppc64
325 , (DCfloatvmfunc*) &dc_callvm_call_ppc64 326 , (DCfloatvmfunc*) &dc_callvm_call_ppc64
326 , (DCdoublevmfunc*) &dc_callvm_call_ppc64 327 , (DCdoublevmfunc*) &dc_callvm_call_ppc64
327 , (DCpointervmfunc*) &dc_callvm_call_ppc64 328 , (DCpointervmfunc*) &dc_callvm_call_ppc64
328 , NULL /* callStruct */ 329 , NULL /* callAggr */
330 , NULL /* beginAggr */
329 }; 331 };
330 #endif 332 #endif
331 333
332 DCCallVM_vt gVT_ppc64_syscall = 334 DCCallVM_vt gVT_ppc64_syscall =
333 { 335 {
341 , &dc_callvm_argLong_ppc64 343 , &dc_callvm_argLong_ppc64
342 , &dc_callvm_argLongLong_ppc64 344 , &dc_callvm_argLongLong_ppc64
343 , &dc_callvm_argFloat_ppc64 345 , &dc_callvm_argFloat_ppc64
344 , &dc_callvm_argDouble_ppc64 346 , &dc_callvm_argDouble_ppc64
345 , &dc_callvm_argPointer_ppc64 347 , &dc_callvm_argPointer_ppc64
346 , NULL /* argStruct */ 348 , NULL /* argAggr */
347 , (DCvoidvmfunc*) &dc_callvm_call_ppc64_syscall 349 , (DCvoidvmfunc*) &dc_callvm_call_ppc64_syscall
348 , (DCboolvmfunc*) &dc_callvm_call_ppc64_syscall 350 , (DCboolvmfunc*) &dc_callvm_call_ppc64_syscall
349 , (DCcharvmfunc*) &dc_callvm_call_ppc64_syscall 351 , (DCcharvmfunc*) &dc_callvm_call_ppc64_syscall
350 , (DCshortvmfunc*) &dc_callvm_call_ppc64_syscall 352 , (DCshortvmfunc*) &dc_callvm_call_ppc64_syscall
351 , (DCintvmfunc*) &dc_callvm_call_ppc64_syscall 353 , (DCintvmfunc*) &dc_callvm_call_ppc64_syscall
352 , (DClongvmfunc*) &dc_callvm_call_ppc64_syscall 354 , (DClongvmfunc*) &dc_callvm_call_ppc64_syscall
353 , (DClonglongvmfunc*) &dc_callvm_call_ppc64_syscall 355 , (DClonglongvmfunc*) &dc_callvm_call_ppc64_syscall
354 , (DCfloatvmfunc*) &dc_callvm_call_ppc64_syscall 356 , (DCfloatvmfunc*) &dc_callvm_call_ppc64_syscall
355 , (DCdoublevmfunc*) &dc_callvm_call_ppc64_syscall 357 , (DCdoublevmfunc*) &dc_callvm_call_ppc64_syscall
356 , (DCpointervmfunc*) &dc_callvm_call_ppc64_syscall 358 , (DCpointervmfunc*) &dc_callvm_call_ppc64_syscall
357 , NULL /* callStruct */ 359 , NULL /* callAggr */
360 , NULL /* beginAggr */
358 }; 361 };
359 362
360 void dc_callvm_mode_ppc64(DCCallVM* in_self, DCint mode) 363 void dc_callvm_mode_ppc64(DCCallVM* in_self, DCint mode)
361 { 364 {
362 DCCallVM_ppc64* self = (DCCallVM_ppc64*) in_self; 365 DCCallVM_ppc64* self = (DCCallVM_ppc64*) in_self;