rbdc 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. checksums.yaml +5 -5
  2. data/dyncall/CMakeLists.txt +3 -3
  3. data/dyncall/ChangeLog +33 -0
  4. data/dyncall/ChangeLog.orig +274 -0
  5. data/dyncall/LICENSE +1 -1
  6. data/dyncall/README +3 -5
  7. data/dyncall/ToDo +27 -18
  8. data/dyncall/ToDo.orig +201 -0
  9. data/dyncall/autovar/autovar_ARCH.h +1 -1
  10. data/dyncall/buildsys/vs2005/vs2005.sln +0 -9
  11. data/dyncall/cconv.lang +36 -0
  12. data/dyncall/configure +17 -9
  13. data/dyncall/configure.bat +1 -1
  14. data/dyncall/dyncall/dyncall.h +2 -1
  15. data/dyncall/dyncall/dyncall_call.S +9 -1
  16. data/dyncall/dyncall/dyncall_call_mips_n32.S +192 -0
  17. data/dyncall/dyncall/dyncall_call_mips_n64.S +197 -0
  18. data/dyncall/dyncall/dyncall_call_mips_n64.h +2 -0
  19. data/dyncall/dyncall/{dyncall_call_mips_o32_gas.s → dyncall_call_mips_o32.S} +44 -42
  20. data/dyncall/dyncall/dyncall_call_mips_o32.h +8 -3
  21. data/dyncall/dyncall/dyncall_call_ppc32.S +3 -1
  22. data/dyncall/dyncall/dyncall_call_ppc32.h +4 -3
  23. data/dyncall/dyncall/dyncall_call_ppc64.S +1 -1
  24. data/dyncall/dyncall/dyncall_call_ppc64.h +3 -0
  25. data/dyncall/dyncall/dyncall_call_x64.S +27 -2
  26. data/dyncall/dyncall/dyncall_call_x64.h +2 -1
  27. data/dyncall/dyncall/dyncall_call_x64_generic_masm.asm +13 -2
  28. data/dyncall/dyncall/dyncall_call_x86.S +6 -6
  29. data/dyncall/dyncall/dyncall_call_x86.h +7 -7
  30. data/dyncall/dyncall/dyncall_call_x86_generic_masm.asm +6 -7
  31. data/dyncall/dyncall/dyncall_callvm_mips_n64.c +27 -9
  32. data/dyncall/dyncall/dyncall_callvm_mips_o32.c +38 -31
  33. data/dyncall/dyncall/dyncall_callvm_mips_o32.c.orig +247 -0
  34. data/dyncall/dyncall/dyncall_callvm_x64.c +57 -3
  35. data/dyncall/dyncall/dyncall_callvm_x86.c +32 -32
  36. data/dyncall/dyncall/dyncall_macros.h +11 -8
  37. data/dyncall/dyncall/dyncall_struct.c +12 -6
  38. data/dyncall/dyncall/dyncall_struct.h +1 -1
  39. data/dyncall/dyncall/dyncall_vector.c +13 -12
  40. data/dyncall/dyncall/dyncall_vector.c.orig +53 -0
  41. data/dyncall/dyncall/gen-masm.sh +4 -5
  42. data/dyncall/dyncallback/dyncall_args_mips.h +24 -6
  43. data/dyncall/dyncallback/dyncall_args_mips64.c +3 -3
  44. data/dyncall/dyncallback/dyncall_args_mips_o32.c +19 -6
  45. data/dyncall/dyncallback/dyncall_callback_arch.S +11 -1
  46. data/dyncall/dyncallback/{dyncall_callback_mips_n32_gas.s → dyncall_callback_mips_n32.S} +1 -1
  47. data/dyncall/dyncallback/{dyncall_callback_mips_n64_gas.s → dyncall_callback_mips_n64.S} +39 -25
  48. data/dyncall/dyncallback/{dyncall_callback_mips_o32_gas.s → dyncall_callback_mips_o32.S} +29 -13
  49. data/dyncall/dyncallback/dyncall_callback_x86_masm.asm +0 -1
  50. data/dyncall/dyncallback/dyncall_thunk.h +1 -1
  51. data/dyncall/dyncallback/gen-masm.sh +3 -5
  52. data/dyncall/dynload/dynload.3 +16 -4
  53. data/dyncall/dynload/dynload_unix.c +101 -53
  54. data/dyncall/dynload/dynload_windows.c +76 -3
  55. data/dyncall/portasm/README.txt +1 -1
  56. data/dyncall/portasm/gen-masm.sh +5 -1
  57. metadata +14 -13
  58. data/dyncall/buildsys/vs2005/test_plain/test_plain.vcproj +0 -202
  59. data/dyncall/dyncall/dyncall_call_mips_gas.S +0 -37
  60. data/dyncall/dyncall/dyncall_call_mips_n32_gas.s +0 -192
  61. data/dyncall/dyncall/dyncall_call_mips_n64_gas.s +0 -192
  62. data/dyncall/dyncallback/dyncall_callback_mips_gas.S +0 -38
@@ -6,7 +6,7 @@
6
6
  Description:
7
7
  License:
8
8
 
9
- Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>,
9
+ Copyright (c) 2007-2020 Daniel Adler <dadler@uni-goettingen.de>,
10
10
  Tassilo Philipp <tphilipp@potion-studios.com>
11
11
 
12
12
  Permission to use, copy, modify, and distribute this software for any
@@ -167,7 +167,7 @@ DCCallVM_vt gVT_x64 =
167
167
  , &dc_callvm_mode_x64
168
168
  , &dc_callvm_argBool_x64
169
169
  , &dc_callvm_argChar_x64
170
- , &dc_callvm_argShort_x64
170
+ , &dc_callvm_argShort_x64
171
171
  , &dc_callvm_argInt_x64
172
172
  , &dc_callvm_argLong_x64
173
173
  , &dc_callvm_argLongLong_x64
@@ -188,7 +188,54 @@ DCCallVM_vt gVT_x64 =
188
188
  , NULL /* callStruct */
189
189
  };
190
190
 
191
- /* mode: only a single mode available currently. */
191
+
192
+ /* --- syscall ------------------------------------------------------------- */
193
+
194
+ #include <assert.h>
195
+ void dc_callvm_call_x64_syscall_sysv(DCCallVM* in_self, DCpointer target)
196
+ {
197
+ DCCallVM_x64* self;
198
+
199
+ /* syscalls can have up to 6 args, required to be "Only values of class INTEGER or class MEMORY" (from */
200
+ /* SysV manual), so we can use self->mRegData.i directly; verify this has space for at least 6 values, though. */
201
+ assert(numIntRegs >= 6);
202
+
203
+ self = (DCCallVM_x64*)in_self;
204
+ dcCall_x64_syscall_sysv(self->mRegData.i, target);
205
+ }
206
+
207
+ DCCallVM_vt gVT_x64_syscall_sysv =
208
+ {
209
+ &dc_callvm_free_x64
210
+ , &dc_callvm_reset_x64
211
+ , &dc_callvm_mode_x64
212
+ , &dc_callvm_argBool_x64
213
+ , &dc_callvm_argChar_x64
214
+ , &dc_callvm_argShort_x64
215
+ , &dc_callvm_argInt_x64
216
+ , &dc_callvm_argLong_x64
217
+ , &dc_callvm_argLongLong_x64
218
+ , &dc_callvm_argFloat_x64
219
+ , &dc_callvm_argDouble_x64
220
+ , &dc_callvm_argPointer_x64
221
+ , NULL /* argStruct */
222
+ , (DCvoidvmfunc*) &dc_callvm_call_x64_syscall_sysv
223
+ , (DCboolvmfunc*) &dc_callvm_call_x64_syscall_sysv
224
+ , (DCcharvmfunc*) &dc_callvm_call_x64_syscall_sysv
225
+ , (DCshortvmfunc*) &dc_callvm_call_x64_syscall_sysv
226
+ , (DCintvmfunc*) &dc_callvm_call_x64_syscall_sysv
227
+ , (DClongvmfunc*) &dc_callvm_call_x64_syscall_sysv
228
+ , (DClonglongvmfunc*) &dc_callvm_call_x64_syscall_sysv
229
+ , (DCfloatvmfunc*) &dc_callvm_call_x64_syscall_sysv
230
+ , (DCdoublevmfunc*) &dc_callvm_call_x64_syscall_sysv
231
+ , (DCpointervmfunc*) &dc_callvm_call_x64_syscall_sysv
232
+ , NULL /* callStruct */
233
+ };
234
+
235
+
236
+
237
+ /* mode */
238
+
192
239
  static void dc_callvm_mode_x64(DCCallVM* in_self, DCint mode)
193
240
  {
194
241
  DCCallVM_x64* self = (DCCallVM_x64*)in_self;
@@ -205,6 +252,13 @@ static void dc_callvm_mode_x64(DCCallVM* in_self, DCint mode)
205
252
  case DC_CALL_C_ELLIPSIS_VARARGS:
206
253
  vt = &gVT_x64;
207
254
  break;
255
+ case DC_CALL_SYS_DEFAULT:
256
+ # if defined DC_UNIX
257
+ case DC_CALL_SYS_X64_SYSCALL_SYSV:
258
+ vt = &gVT_x64_syscall_sysv; break;
259
+ # else
260
+ self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return;
261
+ # endif
208
262
  default:
209
263
  self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
210
264
  return;
@@ -6,7 +6,7 @@
6
6
  Description: Call VM for x86 architecture implementation
7
7
  License:
8
8
 
9
- Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>,
9
+ Copyright (c) 2007-2020 Daniel Adler <dadler@uni-goettingen.de>,
10
10
  Tassilo Philipp <tphilipp@potion-studios.com>
11
11
 
12
12
  Permission to use, copy, modify, and distribute this software for any
@@ -499,19 +499,19 @@ DCCallVM_vt gVT_x86_win32_this_ms =
499
499
 
500
500
  /* call syscall */
501
501
 
502
- void dc_callvm_call_x86_sys_int80h_linux(DCCallVM* in_self, DCpointer target)
502
+ void dc_callvm_call_x86_syscall_int80h_linux(DCCallVM* in_self, DCpointer target)
503
503
  {
504
504
  DCCallVM_x86* self = (DCCallVM_x86*) in_self;
505
- dcCall_x86_sys_int80h_linux( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) );
505
+ dcCall_x86_syscall_int80h_linux( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) );
506
506
  }
507
507
 
508
- void dc_callvm_call_x86_sys_int80h_bsd(DCCallVM* in_self, DCpointer target)
508
+ void dc_callvm_call_x86_syscall_int80h_bsd(DCCallVM* in_self, DCpointer target)
509
509
  {
510
510
  DCCallVM_x86* self = (DCCallVM_x86*) in_self;
511
- dcCall_x86_sys_int80h_bsd( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) );
511
+ dcCall_x86_syscall_int80h_bsd( target, dcVecData(&self->mVecHead), dcVecSize(&self->mVecHead) );
512
512
  }
513
513
 
514
- DCCallVM_vt gVT_x86_sys_int80h_linux =
514
+ DCCallVM_vt gVT_x86_syscall_int80h_linux =
515
515
  {
516
516
  &dc_callvm_free_x86
517
517
  , &dc_callvm_reset_x86
@@ -526,20 +526,20 @@ DCCallVM_vt gVT_x86_sys_int80h_linux =
526
526
  , &dc_callvm_argDouble_x86
527
527
  , &dc_callvm_argPointer_x86
528
528
  , NULL /* argStruct */
529
- , (DCvoidvmfunc*) &dc_callvm_call_x86_sys_int80h_linux
530
- , (DCboolvmfunc*) &dc_callvm_call_x86_sys_int80h_linux
531
- , (DCcharvmfunc*) &dc_callvm_call_x86_sys_int80h_linux
532
- , (DCshortvmfunc*) &dc_callvm_call_x86_sys_int80h_linux
533
- , (DCintvmfunc*) &dc_callvm_call_x86_sys_int80h_linux
534
- , (DClongvmfunc*) &dc_callvm_call_x86_sys_int80h_linux
535
- , (DClonglongvmfunc*) &dc_callvm_call_x86_sys_int80h_linux
536
- , (DCfloatvmfunc*) &dc_callvm_call_x86_sys_int80h_linux
537
- , (DCdoublevmfunc*) &dc_callvm_call_x86_sys_int80h_linux
538
- , (DCpointervmfunc*) &dc_callvm_call_x86_sys_int80h_linux
529
+ , (DCvoidvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
530
+ , (DCboolvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
531
+ , (DCcharvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
532
+ , (DCshortvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
533
+ , (DCintvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
534
+ , (DClongvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
535
+ , (DClonglongvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
536
+ , (DCfloatvmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
537
+ , (DCdoublevmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
538
+ , (DCpointervmfunc*) &dc_callvm_call_x86_syscall_int80h_linux
539
539
  , NULL /* callStruct */
540
540
  };
541
541
 
542
- DCCallVM_vt gVT_x86_sys_int80h_bsd =
542
+ DCCallVM_vt gVT_x86_syscall_int80h_bsd =
543
543
  {
544
544
  &dc_callvm_free_x86
545
545
  , &dc_callvm_reset_x86
@@ -554,16 +554,16 @@ DCCallVM_vt gVT_x86_sys_int80h_bsd =
554
554
  , &dc_callvm_argDouble_x86
555
555
  , &dc_callvm_argPointer_x86
556
556
  , NULL /* argStruct */
557
- , (DCvoidvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd
558
- , (DCboolvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd
559
- , (DCcharvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd
560
- , (DCshortvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd
561
- , (DCintvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd
562
- , (DClongvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd
563
- , (DClonglongvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd
564
- , (DCfloatvmfunc*) &dc_callvm_call_x86_sys_int80h_bsd
565
- , (DCdoublevmfunc*) &dc_callvm_call_x86_sys_int80h_bsd
566
- , (DCpointervmfunc*) &dc_callvm_call_x86_sys_int80h_bsd
557
+ , (DCvoidvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
558
+ , (DCboolvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
559
+ , (DCcharvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
560
+ , (DCshortvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
561
+ , (DCintvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
562
+ , (DClongvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
563
+ , (DClonglongvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
564
+ , (DCfloatvmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
565
+ , (DCdoublevmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
566
+ , (DCpointervmfunc*) &dc_callvm_call_x86_syscall_int80h_bsd
567
567
  , NULL /* callStruct */
568
568
  };
569
569
 
@@ -592,18 +592,18 @@ void dc_callvm_mode_x86(DCCallVM* in_self, DCint mode)
592
592
  case DC_CALL_C_X86_WIN32_THIS_MS: vt = &gVT_x86_win32_this_ms; break;
593
593
  case DC_CALL_C_X86_WIN32_FAST_GNU: vt = &gVT_x86_win32_fast_gnu; break;
594
594
  case DC_CALL_C_X86_WIN32_THIS_GNU: vt = &gVT_x86_cdecl; break;
595
- case DC_CALL_SYS_DEFAULT:
595
+ case DC_CALL_SYS_DEFAULT:
596
596
  # if defined DC_UNIX
597
597
  # if defined DC__OS_Linux
598
- vt = &gVT_x86_sys_int80h_linux; break;
598
+ vt = &gVT_x86_syscall_int80h_linux; break;
599
599
  # else
600
- vt = &gVT_x86_sys_int80h_bsd; break;
600
+ vt = &gVT_x86_syscall_int80h_bsd; break;
601
601
  # endif
602
602
  # else
603
603
  self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; return;
604
604
  # endif
605
- case DC_CALL_SYS_X86_INT80H_LINUX: vt = &gVT_x86_sys_int80h_linux; break;
606
- case DC_CALL_SYS_X86_INT80H_BSD: vt = &gVT_x86_sys_int80h_bsd; break;
605
+ case DC_CALL_SYS_X86_INT80H_LINUX: vt = &gVT_x86_syscall_int80h_linux; break;
606
+ case DC_CALL_SYS_X86_INT80H_BSD: vt = &gVT_x86_syscall_int80h_bsd; break;
607
607
  #endif
608
608
  default:
609
609
  self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
@@ -189,7 +189,7 @@
189
189
  # define DC__Arch_MIPS
190
190
  #elif defined(__arm__)
191
191
  # define DC__Arch_ARM
192
- #elif defined(__aarch64__)
192
+ #elif defined(__aarch64__) || defined(__arm64) || defined(__arm64__)
193
193
  # define DC__Arch_ARM64
194
194
  #elif defined(__sh__)
195
195
  # define DC__Arch_SuperH
@@ -238,16 +238,21 @@
238
238
  #endif /* ARM */
239
239
 
240
240
  #if defined(DC__Arch_MIPS) || defined(DC__Arch_MIPS64)
241
- # if defined(_ABIO32) || defined(_MIPS_ARCH_MIPS1) || defined(_MIPS_ARCH_MIPS2)
241
+ # if defined(_ABIO32) || defined(__mips_o32) || defined(_MIPS_ARCH_MIPS1) || defined(_MIPS_ARCH_MIPS2)
242
242
  # define DC__ABI_MIPS_O32
243
- # elif defined(_ABI64) || defined(_mips_n64)
243
+ # elif defined(_ABI64) || defined(__mips_n64)
244
244
  # define DC__ABI_MIPS_N64
245
245
  # elif defined(_ABIN32)
246
246
  # define DC__ABI_MIPS_N32
247
247
  # else
248
248
  # define DC__ABI_MIPS_EABI
249
249
  # endif
250
- /*@@@implement/support: __mips_hard_float*/
250
+ /* Set extra flag to know if FP hardware ABI, default to yes, if unsure */
251
+ # if (defined(__mips_hard_float) && (__mips_hard_float == 1)) || !defined(__mips_soft_float) || (__mips_soft_float != 1)
252
+ # define DC__ABI_HARDFLOAT /* @@@ make this general for all archs? */
253
+ # else
254
+ # define DC__ABI_SOFTFLOAT
255
+ # endif
251
256
  #endif /* MIPS */
252
257
 
253
258
  #if defined(DC__Arch_PPC64)
@@ -266,16 +271,14 @@
266
271
  # define DC__Endian_BIG
267
272
  #else /* all others are bi-endian */
268
273
  /* @@@check flags used on following bi-endianness archs:
269
- DC__Arch_ARM
270
- DC__Arch_ARM64
271
274
  DC__Arch_Itanium
272
275
  DC__Arch_PPC32
273
276
  DC__Arch_PPC64
274
277
  DC__Arch_SuperH
275
278
  */
276
- # if (defined(DC__Arch_PPC64) && (DC__ABI_PPC64_ELF_V == 1)) || defined(_BIG_ENDIAN) || defined(MIPSEB) || defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__)
279
+ # if (defined(DC__Arch_PPC64) && (DC__ABI_PPC64_ELF_V == 1)) || defined(_BIG_ENDIAN) || defined(__BIG_ENDIAN__) || defined(MIPSEB) || defined(_MIPSEB) || defined(__MIPSEB) || defined(__MIPSEB__) || defined(__ARMEB__) || defined(__AARCH64EB__)
277
280
  # define DC__Endian_BIG
278
- # elif (defined(DC__Arch_PPC64) && (DC__ABI_PPC64_ELF_V == 2)) || defined(_LITTLE_ENDIAN) || defined(MIPSEL) || defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__)
281
+ # elif (defined(DC__Arch_PPC64) && (DC__ABI_PPC64_ELF_V == 2)) || defined(_LITTLE_ENDIAN) || defined(__LITTLE_ENDIAN__) || defined(MIPSEL) || defined(_MIPSEL) || defined(__MIPSEL) || defined(__MIPSEL__) || defined(__ARMEL__) || defined(__AARCH64EL__)
279
282
  # define DC__Endian_LITTLE
280
283
  # elif defined(DC__Arch_Sparc64) && !defined(__BYTE_ORDER__) /* Sparc64 default is big-endian, except if explicitly defined */
281
284
  # define DC__Endian_BIG
@@ -54,7 +54,7 @@ void dcStructField(DCstruct* s, DCint type, DCint alignment, DCsize arrayLength)
54
54
  return;
55
55
  }
56
56
  assert(s && s->pCurrentStruct);
57
- assert(s->pCurrentStruct->nextField <= (DCint)s->pCurrentStruct->fieldCount - 1);
57
+ assert(s->pCurrentStruct->nextField < (DCint)s->pCurrentStruct->fieldCount);
58
58
  f = s->pCurrentStruct->pFields + (s->pCurrentStruct->nextField++);
59
59
  f->type = type;
60
60
  f->alignment = alignment;
@@ -107,6 +107,8 @@ static void dcComputeStructSize(DCstruct* s)
107
107
  {
108
108
  DCsize i;
109
109
  assert(s);
110
+
111
+ /* compute field sizes and alignments, recurse if needed */
110
112
  for (i = 0; i < s->fieldCount; i++) {
111
113
  DCfield *f = s->pFields + i;
112
114
  DCsize fieldAlignment;
@@ -114,19 +116,23 @@ static void dcComputeStructSize(DCstruct* s)
114
116
  dcComputeStructSize(f->pSubStruct);
115
117
  f->size = f->pSubStruct->size;
116
118
  fieldAlignment = f->pSubStruct->alignment;
117
- } else {
119
+ } else
118
120
  fieldAlignment = f->size;
119
- }
121
+
120
122
  if (!f->alignment)
121
123
  f->alignment = fieldAlignment;
122
-
124
+
125
+ /* if field alignment > struct alignment, choose former */
123
126
  if (f->alignment > s->alignment)
124
127
  s->alignment = f->alignment;
125
-
128
+
129
+ /* if array, it's x times the size */
126
130
  f->size *= f->arrayLength;
127
-
131
+
128
132
  /*printf("FIELD %d, size = %d, alignment = %d\n", (int)i, (int)f->size, (int)f->alignment);@@@*/
129
133
  }
134
+
135
+ /* compute overall struct size */
130
136
  for (i = 0; i < s->fieldCount; i++) {
131
137
  DCfield *f = s->pFields + i;
132
138
  dcAlign(&s->size, f->alignment);
@@ -53,7 +53,7 @@ struct DCstruct_ {
53
53
  DCsize size, alignment, fieldCount;
54
54
 
55
55
  /* struct building uses a state machine. */
56
- DCint nextField; /* == -1 if struct is closed */
56
+ DCint nextField; /* == -1 if struct is closed */
57
57
  DCstruct *pCurrentStruct, *pLastStruct; /* == this, unless we're in a sub struct */
58
58
  };
59
59
 
@@ -34,18 +34,19 @@ void dcVecAppend(DCVecHead* pHead, const void* pData, size_t size)
34
34
  size_t newSize = pHead->mSize + size;
35
35
  if(newSize <= pHead->mTotal)
36
36
  {
37
- void* dst = (DCchar*)dcVecData(pHead) + pHead->mSize;
38
- switch (size) {
39
- case 1: *(DCchar *)dst = *(const DCchar *)pData; break;
40
- case 2: *(DCshort *)dst = *(const DCshort *)pData; break;
41
- case 4: *(DCint *)dst = *(const DCint *)pData; break;
42
- case 8: *(DCint *)( ( (char*)dst )+4) = *(const DCint *)( ( (char*)pData )+4);
43
- *(DCint *)dst = *(const DCint *)pData; break;
44
- /* On sparc 32-bit, this one crashes if ptrs are not aligned.
45
- case 8: *(DClonglong*)dst = *(const DClonglong*)pData; break;
46
- */
47
- default: memcpy(dst, pData, size); /* for all the rest. */
48
- }
37
+ void* dst = (DCchar*)dcVecData(pHead) + pHead->mSize;
38
+ switch (size) {
39
+ case 1: *(DCchar *)dst = *(const DCchar *)pData; break;
40
+ case 2: *(DCshort *)dst = *(const DCshort *)pData; break;
41
+ case 4: *(DCint *)dst = *(const DCint *)pData; break;
42
+ case 8: *(DCint *)( ( (char*)dst )+4) = *(const DCint *)( ( (char*)pData )+4);
43
+ *(DCint *)dst = *(const DCint *)pData; break;
44
+ /* On sparc 32-bit, this one crashes if ptrs are not aligned, so use above.
45
+ case 8: *(DClonglong*)dst = *(const DClonglong*)pData; break;
46
+ */
47
+
48
+ default: memcpy(dst, pData, size); /* for all the rest. */
49
+ }
49
50
  pHead->mSize = newSize;
50
51
  }
51
52
  /*else @@@ warning? error?*/
@@ -0,0 +1,53 @@
1
+ /*
2
+
3
+ Package: dyncall
4
+ Library: dyncall
5
+ File: dyncall/dyncall_vector.c
6
+ Description: Simple dynamic vector container type implementation
7
+ License:
8
+
9
+ Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>,
10
+ Tassilo Philipp <tphilipp@potion-studios.com>
11
+
12
+ Permission to use, copy, modify, and distribute this software for any
13
+ purpose with or without fee is hereby granted, provided that the above
14
+ copyright notice and this permission notice appear in all copies.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
17
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
18
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
19
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
21
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
22
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23
+
24
+ */
25
+
26
+
27
+
28
+ #include "dyncall_vector.h"
29
+ #include <string.h>
30
+
31
+
32
+ void dcVecAppend(DCVecHead* pHead, const void* pData, size_t size)
33
+ {
34
+ size_t newSize = pHead->mSize + size;
35
+ if(newSize <= pHead->mTotal)
36
+ {
37
+ void* dst = (DCchar*)dcVecData(pHead) + pHead->mSize;
38
+ switch (size) {
39
+ case 1: *(DCchar *)dst = *(const DCchar *)pData; break;
40
+ case 2: *(DCshort *)dst = *(const DCshort *)pData; break;
41
+ case 4: *(DCint *)dst = *(const DCint *)pData; break;
42
+ case 8: *(DCint *)( ( (char*)dst )+4) = *(const DCint *)( ( (char*)pData )+4);
43
+ *(DCint *)dst = *(const DCint *)pData; break;
44
+ /* On sparc 32-bit, this one crashes if ptrs are not aligned.
45
+ case 8: *(DClonglong*)dst = *(const DClonglong*)pData; break;
46
+ */
47
+ default: memcpy(dst, pData, size); /* for all the rest. */
48
+ }
49
+ pHead->mSize = newSize;
50
+ }
51
+ /*else @@@ warning? error?*/
52
+ }
53
+
@@ -1,7 +1,6 @@
1
1
  #!/bin/sh
2
+ cd `dirname $0`
3
+
4
+ ../portasm/gen-masm.sh dyncall_call_x86 _generic_masm
5
+ ../portasm/gen-masm.sh dyncall_call_x64 _generic_masm
2
6
 
3
- # Uses portasm to generates MASM sources for intel platforms.
4
- printf "; auto-generated by `basename $0`\r\n" > dyncall_call_x86_generic_masm.asm
5
- printf "; auto-generated by `basename $0`\r\n" > dyncall_call_x64_generic_masm.asm
6
- gcc -E -P -DGEN_MASM dyncall_call_x86.S | awk '{printf "%s\r\n", $0}' >> dyncall_call_x86_generic_masm.asm
7
- gcc -E -P -DGEN_MASM dyncall_call_x64.S | awk '{printf "%s\r\n", $0}' >> dyncall_call_x64_generic_masm.asm
@@ -33,19 +33,37 @@ struct DCArgs
33
33
  {
34
34
  /* Don't change order or types, laid out for asm code to fill in! */
35
35
  #if defined(DC__Arch_MIPS) && defined(DC__ABI_MIPS_O32)
36
- DCint freg_count;
36
+
37
+ DCint freg_count; /* unused on soft-float targets, but keep as 4b-padding */
38
+
37
39
  #else
40
+
41
+ # if defined(DC__Arch_MIPS)
42
+
38
43
  # define DCARGS_MIPS_NUM_IREGS 8
39
44
  # define DCARGS_MIPS_NUM_FREGS 8
40
- # if defined(DC__Arch_MIPS)
41
45
  DCint ireg_data[DCARGS_MIPS_NUM_IREGS];
42
46
  DCfloat freg_data[DCARGS_MIPS_NUM_FREGS];
43
47
  struct { DCshort i; DCshort f; } reg_count;
44
- # elif defined(DC__Arch_MIPS64)
45
- DClonglong ireg_data[DCARGS_MIPS_NUM_IREGS];
46
- DCdouble freg_data[DCARGS_MIPS_NUM_FREGS];
47
- DClonglong reg_count;
48
+
49
+ # elif defined(DC__Arch_MIPS64)
50
+
51
+ /* single counter for both, int & float: mips64 uses 8 max, total, either */
52
+ /* skipping over other/type's reg, or only using int regs on soft-float */
53
+ # define DCARGS_MIPS_NUM_REGS 8
54
+ # if defined(DC__ABI_SOFTFLOAT)
55
+ union
56
+ # else
57
+ struct
48
58
  # endif
59
+ {
60
+ DClonglong ireg_data[DCARGS_MIPS_NUM_REGS];
61
+ DCdouble freg_data[DCARGS_MIPS_NUM_REGS];
62
+ };
63
+ DClonglong reg_count;
64
+
65
+ # endif
66
+
49
67
  #endif
50
68
  DCuchar* stackptr;
51
69
  };