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
@@ -0,0 +1,197 @@
1
+ /*
2
+
3
+ Package: dyncall
4
+ Library: dyncall
5
+ File: dyncall/dyncall_call_mips_n64.S
6
+ Description: mips "n64" abi call kernel implementation in GNU Assembler
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
+ .section .mdebug.abi64
27
+ .previous
28
+ .abicalls
29
+ .text
30
+ .align 2
31
+ .globl dcCall_mips_n64
32
+ .ent dcCall_mips_n64
33
+ dcCall_mips_n64:
34
+
35
+ /* Stack-frame prolog */
36
+
37
+ # .frame $fp,64,$31 /* vars=16, regs=3/0, args=0, extra=16 */
38
+ # .mask 0xd0000000,-8
39
+ # .fmask 0x00000000,0
40
+ dsubu $sp,$sp,64
41
+ sd $31,48($sp) /* save return address register (ra) */
42
+ sd $30,40($sp) /* save frame pointer register (fp) */
43
+ sd $28,32($sp) /* save global pointer register (gp) */
44
+ move $fp,$sp
45
+
46
+
47
+ /* arguments: */
48
+
49
+ /* $4 target function */
50
+ /* $5 register data */
51
+ /* $6 stack size */
52
+ /* $7 stack data */
53
+
54
+
55
+ /* allocate argument stack space */
56
+
57
+ dsubu $sp, $sp, $6
58
+
59
+ /* copy stack data */
60
+
61
+ /* n64 abi call assumptions:
62
+ - stack data is 16-byte aligned.
63
+ - no extra-storage for arguments passed via registers.
64
+ */
65
+
66
+ /* $12 source pointer (parameter stack data) */
67
+ /* $14 destination (stack pointer) */
68
+ /* $6 byte count */
69
+
70
+ move $12, $7
71
+ move $14, $sp
72
+
73
+ .next:
74
+ beq $6, $0, .skip
75
+ # nop
76
+ daddiu $6, $6, -8
77
+ ld $2, 0($12)
78
+ sd $2, 0($14)
79
+ daddiu $12,$12, 8
80
+ daddiu $14,$14, 8
81
+ b .next
82
+ .skip:
83
+ move $25, $4
84
+
85
+ /* load registers */
86
+
87
+ /* locals: */
88
+ /* $13 = register data */
89
+ move $13, $5
90
+
91
+ /* load parameter registers (only ints on hardfloat) */
92
+
93
+ ld $4 , 0($13)
94
+ ld $5 , 8($13)
95
+ ld $6 ,16($13)
96
+ ld $7 ,24($13)
97
+ ld $8 ,32($13)
98
+ ld $9 ,40($13)
99
+ ld $10,48($13)
100
+ ld $11,56($13)
101
+
102
+ #if defined(DC__ABI_HARDFLOAT)
103
+
104
+ /* $14 = useDouble flags */
105
+ ld $14, 128($13)
106
+
107
+ /* load float-or-double floating pointer parameter registers
108
+ a 64-bit bitmask given at byte offset 128 of regdata indicates
109
+ if loading a float (bit cleared) or double (bit set), starting
110
+ at bit position 0 in bitmask.
111
+ */
112
+ .t0:
113
+ and $15, $14, 1
114
+ bgtz $15, .d0
115
+ .f0:
116
+ l.s $f12, 64($13)
117
+ j .t1
118
+ .d0:
119
+ l.d $f12, 64($13)
120
+
121
+ .t1:
122
+ and $15, $14, 2
123
+ bgtz $15, .d1
124
+ .f1:
125
+ l.s $f13, 72($13)
126
+ j .t2
127
+ .d1:
128
+ l.d $f13, 72($13)
129
+ .t2:
130
+ and $15, $14, 4
131
+ bgtz $15, .d2
132
+ .f2:
133
+ l.s $f14, 80($13)
134
+ j .t3
135
+ .d2:
136
+ l.d $f14, 80($13)
137
+ .t3:
138
+ and $15, $14, 8
139
+ bgtz $15, .d3
140
+ .f3:
141
+ l.s $f15, 88($13)
142
+ j .t4
143
+ .d3:
144
+ l.d $f15, 88($13)
145
+ .t4:
146
+ and $15, $14, 16
147
+ bgtz $15, .d4
148
+ .f4:
149
+ l.s $f16, 96($13)
150
+ j .t5
151
+ .d4:
152
+ l.d $f16, 96($13)
153
+ .t5:
154
+ and $15, $14, 32
155
+ bgtz $15, .d5
156
+ .f5:
157
+ l.s $f17,104($13)
158
+ j .t6
159
+ .d5:
160
+ l.d $f17,104($13)
161
+ .t6:
162
+ and $15, $14, 64
163
+ bgtz $15, .d6
164
+ .f6:
165
+ l.s $f18,112($13)
166
+ j .t7
167
+ .d6:
168
+ l.d $f18,112($13)
169
+ .t7:
170
+ and $15, $14, 128
171
+ bgtz $15, .d7
172
+ .f7:
173
+ l.s $f19,120($13)
174
+ j .fregend
175
+ .d7:
176
+ l.d $f19,120($13)
177
+
178
+ #endif /* DC__ABI_HARDFLOAT) */
179
+
180
+ .fregend:
181
+
182
+ /* jump-and-link to register $25 */
183
+
184
+ jal $31, $25
185
+ nop /* branch-delay slot - no nop according to gcc assembly */
186
+ /* output, but let's play safe */
187
+
188
+ /* Stack-frame epilog */
189
+ move $sp,$fp
190
+ ld $ra,48($sp) /* restore ra register */
191
+ ld $fp,40($sp) /* restore fp register */
192
+ ld $gp,32($sp) /* restore gp register */
193
+ daddu $sp,$sp,64
194
+ j $ra
195
+ .end dcCall_mips_n64
196
+ .size dcCall_mips_n64, .-dcCall_mips_n64
197
+
@@ -53,8 +53,10 @@ extern "C" {
53
53
  struct DCRegData_mips_n64
54
54
  {
55
55
  DClonglong mIntData[8];
56
+ #if defined(DC__ABI_HARDFLOAT)
56
57
  union { DCfloat f; DCdouble d; } mFloatData[8];
57
58
  DClonglong mUseDouble; /* bitmask: lower 8 bits specify to use float or double from union array. */
59
+ #endif /* DC__ABI_HARDFLOAT */
58
60
  };
59
61
 
60
62
  void dcCall_mips_n64(DCpointer target, struct DCRegData_mips_n64* regdata, DCsize stksize, DCpointer stkdata);
@@ -2,11 +2,11 @@
2
2
 
3
3
  Package: dyncall
4
4
  Library: dyncall
5
- File: dyncall/dyncall_call_mips_o32_gas.s
5
+ File: dyncall/dyncall_call_mips_o32.S
6
6
  Description: mips "o32" abi call kernel implementation in GNU Assembler
7
7
  License:
8
8
 
9
- Copyright (c) 2007-2011 Daniel Adler <dadler@uni-goettingen.de>,
9
+ Copyright (c) 2007-2018 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
@@ -23,8 +23,8 @@
23
23
 
24
24
  */
25
25
  /* $4 target function */
26
- /* $5 register data */
27
- /* $6 stack size (min 16-byte aligned to 8-bytes already) */
26
+ /* $5 register data */
27
+ /* $6 stack size (guaranteed to be >= 16b and multiple of 8b) */
28
28
  /* $7 stack data */
29
29
 
30
30
 
@@ -33,22 +33,22 @@
33
33
  .previous
34
34
  .abicalls
35
35
  .text
36
- .align 2
37
- .globl dcCall_mips_o32
38
- .ent dcCall_mips_o32
39
- .type dcCall_mips_o32, @function
36
+ .align 2
37
+ .globl dcCall_mips_o32
38
+ .ent dcCall_mips_o32
39
+ .type dcCall_mips_o32, @function
40
40
  dcCall_mips_o32:
41
- .frame $fp,40,$31 /* vars=8, regs=2/0, args=16, gp=8 */
42
- .mask 0xc0000000,-4
43
- .fmask 0x00000000,0
44
- .set noreorder
41
+ .frame $fp,40,$31 /* vars=8, regs=2/0, args=16, gp=8 */
42
+ .mask 0xc0000000,-4
43
+ .fmask 0x00000000,0
44
+ .set noreorder
45
45
 
46
- addiu $sp,$sp,-8
47
- sw $31,4($sp) /* save link register */
48
- sw $fp,0($sp) /* save frame pointer */
46
+ addiu $sp, $sp, -8
47
+ sw $31, 4($sp) /* save link register */
48
+ sw $fp, 0($sp) /* save frame pointer */
49
49
  nop
50
- move $fp,$sp /* frame pointer = sp */
51
- sub $sp, $sp, $6 /* increment stack */
50
+ move $fp, $sp /* frame pointer = sp */
51
+ sub $sp, $sp, $6 /* increment stack */
52
52
 
53
53
  /* copy stack data */
54
54
 
@@ -56,52 +56,54 @@ dcCall_mips_o32:
56
56
  /* $14 destination (stack pointer) */
57
57
  /* $6 byte count */
58
58
 
59
- move $12, $7
60
- move $14, $sp
59
+ move $12, $7
60
+ move $14, $sp
61
61
 
62
62
  .next:
63
- beq $6, $0, .skip
63
+ beq $6, $0, .skip
64
64
  nop
65
- lw $2, 0($12)
65
+ lw $2, 0($12)
66
66
  nop
67
- sw $2, 0($14)
68
- addiu $12,$12, 4
69
- addiu $14,$14, 4
70
- addiu $6, $6, -4
71
- j .next
67
+ sw $2, 0($14)
68
+ addiu $12, $12, 4
69
+ addiu $14, $14, 4
70
+ addiu $6, $6, -4
71
+ j .next
72
72
  nop
73
73
  .skip:
74
74
 
75
- /* load two double-precision floating-point argument registers ($f12, $f14) */
75
+ #if defined(DC__ABI_HARDFLOAT)
76
+ /* load two double-precision floating-point argument registers ($f12, $f14) - not for softfloat */
76
77
 
77
78
  l.d $f12, 0($5)
78
79
  l.d $f14, 8($5)
80
+ #endif
79
81
 
80
82
  /* prepare call */
81
83
 
82
- move $12, $7 /* $12 stack data */
83
- move $25, $4 /* $25 target function */
84
+ move $12, $7 /* $12 stack data */
85
+ move $25, $4 /* $25 target function */
84
86
 
85
87
  /* load first four integer arguments ($4-$7) */
86
88
 
87
- lw $4, 0($12)
88
- lw $5, 4($12)
89
- lw $6, 8($12)
90
- lw $7,12($12)
89
+ lw $4, 0($12)
90
+ lw $5, 4($12)
91
+ lw $6, 8($12)
92
+ lw $7, 12($12)
91
93
 
92
94
  /* call target function */
93
95
 
94
- jalr $25
96
+ jalr $25
95
97
  nop
96
- move $sp,$fp /* restore stack pointer */
98
+ move $sp, $fp /* restore stack pointer */
97
99
  nop
98
- lw $31,4($sp) /* restore return address */
99
- lw $fp,0($sp) /* restore frame pointer */
100
- addiu $sp,$sp,8 /* end stack frame */
101
- j $31 /* return */
100
+ lw $31, 4($sp) /* restore return address */
101
+ lw $fp, 0($sp) /* restore frame pointer */
102
+ addiu $sp, $sp, 8 /* end stack frame */
103
+ j $31 /* return */
102
104
  nop
103
105
 
104
- .set reorder
105
- .end dcCall_mips_o32
106
- .ident "handwritten"
106
+ .set reorder
107
+ .end dcCall_mips_o32
108
+ .ident "handwritten"
107
109
 
@@ -37,10 +37,13 @@ extern "C" {
37
37
  /* Call-kernel register data:
38
38
 
39
39
  Details:
40
+
40
41
  The structure holds the argument data for transfering float/double arguments
41
42
  via registers as well.
42
- The call-kernel implements loads two doubles, which involves four
43
- 32-bit floating pointer registers.
43
+ The call-kernel on hardfloat platforms implements loads two doubles, which
44
+ involves four 32-bit floating pointer registers. It's unused for softfloat
45
+ platforms.
46
+
44
47
  Float arguments map as following:
45
48
 
46
49
  float argument 0 is at u[0][0] for little, u[0][1] for big endian and
@@ -49,12 +52,14 @@ extern "C" {
49
52
 
50
53
  */
51
54
 
52
- typedef struct DCRegData_mips_o32_
55
+ typedef struct
53
56
  {
57
+ #if defined(DC__ABI_HARDFLOAT)
54
58
  union {
55
59
  double d;
56
60
  float f[2];
57
61
  } u[2];
62
+ #endif /* DC__ABI_HARDFLOAT */
58
63
  } DCRegData_mips_o32;
59
64
 
60
65
 
@@ -268,6 +268,7 @@ ENTRY_C(dcCall_ppc32_sysv)
268
268
 
269
269
  .align 2
270
270
 
271
+ /* @@@ Bus Error on Darwin */
271
272
  GLOBAL_C(dcCall_ppc32_syscall)
272
273
  ENTRY_C(dcCall_ppc32_syscall)
273
274
  mflr r0 /* r0 = return address */
@@ -282,10 +283,11 @@ ENTRY_C(dcCall_ppc32_syscall)
282
283
  lwz r5 , 8(r11)
283
284
  lwz r6 ,12(r11)
284
285
  lwz r7 ,16(r11)
286
+ /* @@@ missing r8,r9,10 on some platforms? */
285
287
  sc
286
288
 
287
289
  lwz r1, 0(r1) /* restore stack */
288
290
  lwz r0, 4(r1) /* r0 = return address */
289
291
  mtlr r0 /* setup link register */
290
292
  blr
291
-
293
+
@@ -47,13 +47,14 @@ struct DCRegData_ppc32_
47
47
  */
48
48
 
49
49
  /* Darwin ABI */
50
-
51
50
  void dcCall_ppc32_darwin (DCpointer target, struct DCRegData_ppc32_* ppc32data, DCsize stksize, DCpointer stkdata);
52
51
 
53
- /* System V (Linux) ABI */
54
-
52
+ /* System V ABI */
55
53
  void dcCall_ppc32_sysv (DCpointer target, struct DCRegData_ppc32_* ppc32data, DCsize stksize, DCpointer stkdata);
56
54
 
55
+ /* syscall @@@ Bus Error on Darwin */
56
+ void dcCall_ppc32_syscall (DCpointer target, struct DCRegData_ppc32_* ppc32data, DCsize stksize, DCpointer stkdata);
57
+
57
58
  #ifdef __cplusplus
58
59
  }
59
60
  #endif
@@ -197,7 +197,7 @@ ENTRY_C(dcCall_ppc64_syscall)
197
197
  ld r5 ,16(r11)
198
198
  ld r6 ,24(r11)
199
199
  ld r7 ,32(r11)
200
-
200
+ /* @@@ missing r8,r9,10 on some platforms? */
201
201
  sc /* system call */
202
202
 
203
203
  /* epilog */
@@ -47,6 +47,9 @@ struct DCRegData_ppc64_
47
47
 
48
48
  void dcCall_ppc64(DCpointer target, struct DCRegData_ppc64_* ppc64data, DCsize stksize, DCpointer stkdata);
49
49
 
50
+ /* syscall */
51
+ void dcCall_ppc64_syscall(DCpointer target, struct DCRegData_ppc64_* ppc64data, DCsize stksize, DCpointer stkdata);
52
+
50
53
  #ifdef __cplusplus
51
54
  }
52
55
  #endif
@@ -6,7 +6,7 @@
6
6
  Description: All x64 abi call kernel 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
@@ -60,7 +60,7 @@ BEGIN_PROC(dcCall_x64_sysv)
60
60
 
61
61
  ADD(LIT(31),RDI) /* Align stack to 32-byte. */
62
62
  AND(LIT(-32),RDI)
63
- ADD(LIT(8),RDI) /* Adjust by 8-byte for the return-address. */
63
+ ADD(LIT(8),RDI) /* Adjust by 8-byte for the return-address. */
64
64
  SUB(RDI,RSP) /* Setup stack frame by subtracting the size of arguments. */
65
65
 
66
66
  MOV(RDI,RCX) /* Store number of bytes to copy to stack in RCX (for rep movsb). */
@@ -143,5 +143,30 @@ BEGIN_PROC(dcCall_x64_win64)
143
143
 
144
144
  END_PROC(dcCall_x64_win64)
145
145
 
146
+ /*---------------------------------------------------------------------------
147
+
148
+ Call Kernel for x64 System V syscalls
149
+
150
+ Input:
151
+ RDI : pointer to arguments
152
+ RSI : syscall id
153
+
154
+ */
155
+
156
+ GLOBAL(dcCall_x64_syscall_sysv)
157
+ BEGIN_PROC(dcCall_x64_syscall_sysv)
158
+
159
+ MOV(RSI,RAX) /* load system call id. */
160
+ MOV(QWORD(RDI,40),R9) /* copy first six int/pointer arguments to RDI, RSI, RDX, R10, R8, R9. */
161
+ MOV(QWORD(RDI,32),R8)
162
+ MOV(QWORD(RDI,24),R10)
163
+ MOV(QWORD(RDI,16),RDX)
164
+ MOV(QWORD(RDI,8),RSI)
165
+ MOV(QWORD(RDI,0),RDI) /* Set RDI last to not overwrite it to soon. */
166
+ SYSCALL
167
+ RET()
168
+
169
+ END_PROC(dcCall_x64_syscall_sysv)
170
+
146
171
  END_ASM
147
172