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.
- checksums.yaml +5 -5
- data/dyncall/CMakeLists.txt +3 -3
- data/dyncall/ChangeLog +33 -0
- data/dyncall/ChangeLog.orig +274 -0
- data/dyncall/LICENSE +1 -1
- data/dyncall/README +3 -5
- data/dyncall/ToDo +27 -18
- data/dyncall/ToDo.orig +201 -0
- data/dyncall/autovar/autovar_ARCH.h +1 -1
- data/dyncall/buildsys/vs2005/vs2005.sln +0 -9
- data/dyncall/cconv.lang +36 -0
- data/dyncall/configure +17 -9
- data/dyncall/configure.bat +1 -1
- data/dyncall/dyncall/dyncall.h +2 -1
- data/dyncall/dyncall/dyncall_call.S +9 -1
- data/dyncall/dyncall/dyncall_call_mips_n32.S +192 -0
- data/dyncall/dyncall/dyncall_call_mips_n64.S +197 -0
- data/dyncall/dyncall/dyncall_call_mips_n64.h +2 -0
- data/dyncall/dyncall/{dyncall_call_mips_o32_gas.s → dyncall_call_mips_o32.S} +44 -42
- data/dyncall/dyncall/dyncall_call_mips_o32.h +8 -3
- data/dyncall/dyncall/dyncall_call_ppc32.S +3 -1
- data/dyncall/dyncall/dyncall_call_ppc32.h +4 -3
- data/dyncall/dyncall/dyncall_call_ppc64.S +1 -1
- data/dyncall/dyncall/dyncall_call_ppc64.h +3 -0
- data/dyncall/dyncall/dyncall_call_x64.S +27 -2
- data/dyncall/dyncall/dyncall_call_x64.h +2 -1
- data/dyncall/dyncall/dyncall_call_x64_generic_masm.asm +13 -2
- data/dyncall/dyncall/dyncall_call_x86.S +6 -6
- data/dyncall/dyncall/dyncall_call_x86.h +7 -7
- data/dyncall/dyncall/dyncall_call_x86_generic_masm.asm +6 -7
- data/dyncall/dyncall/dyncall_callvm_mips_n64.c +27 -9
- data/dyncall/dyncall/dyncall_callvm_mips_o32.c +38 -31
- data/dyncall/dyncall/dyncall_callvm_mips_o32.c.orig +247 -0
- data/dyncall/dyncall/dyncall_callvm_x64.c +57 -3
- data/dyncall/dyncall/dyncall_callvm_x86.c +32 -32
- data/dyncall/dyncall/dyncall_macros.h +11 -8
- data/dyncall/dyncall/dyncall_struct.c +12 -6
- data/dyncall/dyncall/dyncall_struct.h +1 -1
- data/dyncall/dyncall/dyncall_vector.c +13 -12
- data/dyncall/dyncall/dyncall_vector.c.orig +53 -0
- data/dyncall/dyncall/gen-masm.sh +4 -5
- data/dyncall/dyncallback/dyncall_args_mips.h +24 -6
- data/dyncall/dyncallback/dyncall_args_mips64.c +3 -3
- data/dyncall/dyncallback/dyncall_args_mips_o32.c +19 -6
- data/dyncall/dyncallback/dyncall_callback_arch.S +11 -1
- data/dyncall/dyncallback/{dyncall_callback_mips_n32_gas.s → dyncall_callback_mips_n32.S} +1 -1
- data/dyncall/dyncallback/{dyncall_callback_mips_n64_gas.s → dyncall_callback_mips_n64.S} +39 -25
- data/dyncall/dyncallback/{dyncall_callback_mips_o32_gas.s → dyncall_callback_mips_o32.S} +29 -13
- data/dyncall/dyncallback/dyncall_callback_x86_masm.asm +0 -1
- data/dyncall/dyncallback/dyncall_thunk.h +1 -1
- data/dyncall/dyncallback/gen-masm.sh +3 -5
- data/dyncall/dynload/dynload.3 +16 -4
- data/dyncall/dynload/dynload_unix.c +101 -53
- data/dyncall/dynload/dynload_windows.c +76 -3
- data/dyncall/portasm/README.txt +1 -1
- data/dyncall/portasm/gen-masm.sh +5 -1
- metadata +14 -13
- data/dyncall/buildsys/vs2005/test_plain/test_plain.vcproj +0 -202
- data/dyncall/dyncall/dyncall_call_mips_gas.S +0 -37
- data/dyncall/dyncall/dyncall_call_mips_n32_gas.s +0 -192
- data/dyncall/dyncall/dyncall_call_mips_n64_gas.s +0 -192
- 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-
|
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
|
@@ -54,6 +54,7 @@ extern "C" {
|
|
54
54
|
|
55
55
|
void dcCall_x64_sysv(DCsize stacksize, DCpointer stackdata, DCpointer regdata_i, DCpointer regdata_f, DCpointer target);
|
56
56
|
void dcCall_x64_win64(DCsize stacksize, DCpointer stackdata, DCpointer regdata, DCpointer target);
|
57
|
+
void dcCall_x64_syscall_sysv(DCpointer argdata, DCpointer target);
|
57
58
|
|
58
59
|
#ifdef __cplusplus
|
59
60
|
}
|
@@ -1,6 +1,5 @@
|
|
1
1
|
; auto-generated by gen-masm.sh
|
2
2
|
.CODE
|
3
|
-
|
4
3
|
dcCall_x64_sysv PROC
|
5
4
|
OPTION PROLOGUE:NONE, EPILOGUE:NONE
|
6
5
|
push RBP
|
@@ -34,7 +33,7 @@ OPTION PROLOGUE:NONE, EPILOGUE:NONE
|
|
34
33
|
pop RBX
|
35
34
|
pop RBP
|
36
35
|
ret
|
37
|
-
|
36
|
+
dcCall_x64_sysv ENDP
|
38
37
|
dcCall_x64_win64 PROC
|
39
38
|
OPTION PROLOGUE:NONE, EPILOGUE:NONE
|
40
39
|
push RBP
|
@@ -67,4 +66,16 @@ OPTION PROLOGUE:NONE, EPILOGUE:NONE
|
|
67
66
|
pop RBP
|
68
67
|
ret
|
69
68
|
dcCall_x64_win64 ENDP
|
69
|
+
dcCall_x64_syscall_sysv PROC
|
70
|
+
OPTION PROLOGUE:NONE, EPILOGUE:NONE
|
71
|
+
mov RAX,RSI
|
72
|
+
mov R9,qword ptr [RDI+40]
|
73
|
+
mov R8,qword ptr [RDI+32]
|
74
|
+
mov R10,qword ptr [RDI+24]
|
75
|
+
mov RDX,qword ptr [RDI+16]
|
76
|
+
mov RSI,qword ptr [RDI+8]
|
77
|
+
mov RDI,qword ptr [RDI+0]
|
78
|
+
SYSCALL
|
79
|
+
ret
|
80
|
+
dcCall_x64_syscall_sysv ENDP
|
70
81
|
END
|
@@ -182,8 +182,8 @@ END_PROC(dcCall_x86_win32_fast)
|
|
182
182
|
|
183
183
|
*/
|
184
184
|
|
185
|
-
GLOBAL(
|
186
|
-
BEGIN_PROC(
|
185
|
+
GLOBAL(dcCall_x86_syscall_int80h_linux)
|
186
|
+
BEGIN_PROC(dcCall_x86_syscall_int80h_linux)
|
187
187
|
PUSH(EBP) /* prolog. */
|
188
188
|
MOVL(ESP,EBP)
|
189
189
|
PUSH(EBX) /* save preserved. */
|
@@ -203,7 +203,7 @@ BEGIN_PROC(dcCall_x86_sys_int80h_linux)
|
|
203
203
|
MOVL(EBP,ESP) /* epilog. */
|
204
204
|
POP(EBP)
|
205
205
|
RET()
|
206
|
-
END_PROC(
|
206
|
+
END_PROC(dcCall_x86_syscall_int80h_linux)
|
207
207
|
|
208
208
|
/*--- syscall int80 bsd -----------------------------------------------------
|
209
209
|
|
@@ -212,8 +212,8 @@ END_PROC(dcCall_x86_sys_int80h_linux)
|
|
212
212
|
|
213
213
|
*/
|
214
214
|
|
215
|
-
GLOBAL(
|
216
|
-
BEGIN_PROC(
|
215
|
+
GLOBAL(dcCall_x86_syscall_int80h_bsd)
|
216
|
+
BEGIN_PROC(dcCall_x86_syscall_int80h_bsd)
|
217
217
|
PUSH(EBP) /* prolog. */
|
218
218
|
MOVL(ESP,EBP)
|
219
219
|
PUSH(ESI) /* save preserved. */
|
@@ -233,7 +233,7 @@ BEGIN_PROC(dcCall_x86_sys_int80h_bsd)
|
|
233
233
|
_do_int:
|
234
234
|
INT(LIT(HEX(80)))
|
235
235
|
RET()
|
236
|
-
END_PROC(
|
236
|
+
END_PROC(dcCall_x86_syscall_int80h_bsd)
|
237
237
|
|
238
238
|
END_ASM
|
239
239
|
|
@@ -53,14 +53,14 @@ extern "C" {
|
|
53
53
|
*/
|
54
54
|
|
55
55
|
#if defined(DC__OS_Plan9) /* No support for other cconvs on Plan9 and vice-versa. */
|
56
|
-
void dcCall_x86_plan9
|
56
|
+
void dcCall_x86_plan9 (DCpointer target, DCpointer stackdata, DCsize size);
|
57
57
|
#else
|
58
|
-
void dcCall_x86_cdecl
|
59
|
-
void dcCall_x86_win32_std
|
60
|
-
void dcCall_x86_win32_fast
|
61
|
-
void dcCall_x86_win32_msthis
|
62
|
-
void
|
63
|
-
void
|
58
|
+
void dcCall_x86_cdecl (DCpointer target, DCpointer stackdata, DCsize size);
|
59
|
+
void dcCall_x86_win32_std (DCpointer target, DCpointer stackdata, DCsize size);
|
60
|
+
void dcCall_x86_win32_fast (DCpointer target, DCpointer stackdata, DCsize size);
|
61
|
+
void dcCall_x86_win32_msthis (DCpointer target, DCpointer stackdata, DCsize size);
|
62
|
+
void dcCall_x86_syscall_int80h_linux(DCpointer target, DCpointer stackdata, DCsize size);
|
63
|
+
void dcCall_x86_syscall_int80h_bsd (DCpointer target, DCpointer stackdata, DCsize size);
|
64
64
|
#endif
|
65
65
|
|
66
66
|
#ifdef __cplusplus
|
@@ -2,7 +2,6 @@
|
|
2
2
|
.386
|
3
3
|
.MODEL FLAT
|
4
4
|
.CODE
|
5
|
-
|
6
5
|
_dcCall_x86_cdecl PROC
|
7
6
|
OPTION PROLOGUE:NONE, EPILOGUE:NONE
|
8
7
|
push EBP
|
@@ -89,10 +88,10 @@ OPTION PROLOGUE:NONE, EPILOGUE:NONE
|
|
89
88
|
pop EBP
|
90
89
|
ret
|
91
90
|
_dcCall_x86_win32_fast ENDP
|
92
|
-
|
91
|
+
_dcCall_x86_syscall_int80h_linux PROC
|
93
92
|
OPTION PROLOGUE:NONE, EPILOGUE:NONE
|
94
93
|
push EBP
|
95
|
-
|
94
|
+
mov EBP,ESP
|
96
95
|
push EBX
|
97
96
|
push ESI
|
98
97
|
push EDI
|
@@ -110,11 +109,11 @@ OPTION PROLOGUE:NONE, EPILOGUE:NONE
|
|
110
109
|
mov ESP,EBP
|
111
110
|
pop EBP
|
112
111
|
ret
|
113
|
-
|
114
|
-
|
112
|
+
_dcCall_x86_syscall_int80h_linux ENDP
|
113
|
+
_dcCall_x86_syscall_int80h_bsd PROC
|
115
114
|
OPTION PROLOGUE:NONE, EPILOGUE:NONE
|
116
115
|
push EBP
|
117
|
-
|
116
|
+
mov EBP,ESP
|
118
117
|
push ESI
|
119
118
|
push EDI
|
120
119
|
mov ESI,dword ptr [EBP+12]
|
@@ -132,5 +131,5 @@ OPTION PROLOGUE:NONE, EPILOGUE:NONE
|
|
132
131
|
_do_int:
|
133
132
|
int 80h
|
134
133
|
ret
|
135
|
-
|
134
|
+
_dcCall_x86_syscall_int80h_bsd ENDP
|
136
135
|
END
|
@@ -58,7 +58,9 @@ static void dc_callvm_reset_mips_n64(DCCallVM* in_self)
|
|
58
58
|
DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)in_self;
|
59
59
|
dcVecReset(&self->mVecHead);
|
60
60
|
self->mRegCount = 0;
|
61
|
+
#if defined(DC__ABI_HARDFLOAT)
|
61
62
|
self->mRegData.mUseDouble = 0LL;
|
63
|
+
#endif /* DC__ABI_HARDFLOAT */
|
62
64
|
}
|
63
65
|
|
64
66
|
|
@@ -75,24 +77,24 @@ static void dc_callvm_free_mips_n64(DCCallVM* in_self)
|
|
75
77
|
|
76
78
|
/* arg int -- fillup 64-bit integer register file OR push on stack */
|
77
79
|
|
78
|
-
static void dc_callvm_argLongLong_mips_n64(DCCallVM* in_self, DClonglong
|
80
|
+
static void dc_callvm_argLongLong_mips_n64(DCCallVM* in_self, DClonglong x)
|
79
81
|
{
|
80
82
|
DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)in_self;
|
81
83
|
/* fillup integer register file */
|
82
84
|
if (self->mRegCount < 8)
|
83
|
-
self->mRegData.mIntData[self->mRegCount++] =
|
85
|
+
self->mRegData.mIntData[self->mRegCount++] = x;
|
84
86
|
else
|
85
|
-
dcVecAppend(&self->mVecHead, &
|
87
|
+
dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong));
|
86
88
|
}
|
87
89
|
|
88
|
-
static void dc_callvm_argInt_mips_n64(DCCallVM* in_self, DCint
|
90
|
+
static void dc_callvm_argInt_mips_n64(DCCallVM* in_self, DCint x)
|
89
91
|
{
|
90
|
-
dc_callvm_argLongLong_mips_n64(in_self, (DClonglong)
|
92
|
+
dc_callvm_argLongLong_mips_n64(in_self, (DClonglong)x);
|
91
93
|
}
|
92
94
|
|
93
95
|
static void dc_callvm_argPointer_mips_n64(DCCallVM* in_self, DCpointer x)
|
94
96
|
{
|
95
|
-
dc_callvm_argLongLong_mips_n64(in_self, *
|
97
|
+
dc_callvm_argLongLong_mips_n64(in_self, *(DClonglong*)&x);
|
96
98
|
}
|
97
99
|
|
98
100
|
static void dc_callvm_argBool_mips_n64(DCCallVM* in_self, DCbool x)
|
@@ -117,25 +119,41 @@ static void dc_callvm_argLong_mips_n64(DCCallVM* in_self, DClong x)
|
|
117
119
|
|
118
120
|
static void dc_callvm_argDouble_mips_n64(DCCallVM* in_self, DCdouble x)
|
119
121
|
{
|
122
|
+
#if defined(DC__ABI_HARDFLOAT)
|
120
123
|
DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)in_self;
|
121
124
|
if (self->mRegCount < 8) {
|
122
125
|
self->mRegData.mUseDouble |= 1<<( self->mRegCount );
|
123
126
|
self->mRegData.mFloatData[self->mRegCount++].d = x;
|
124
127
|
} else {
|
125
|
-
dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)
|
128
|
+
dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble));
|
126
129
|
}
|
130
|
+
#else
|
131
|
+
dc_callvm_argLongLong_mips_n64(in_self, *(DClonglong*)&x);
|
132
|
+
#endif /* DC__ABI_HARDFLOAT */
|
127
133
|
}
|
128
134
|
|
129
135
|
static void dc_callvm_argFloat_mips_n64(DCCallVM* in_self, DCfloat x)
|
130
136
|
{
|
137
|
+
#if defined(DC__ABI_HARDFLOAT)
|
131
138
|
DCCallVM_mips_n64* self = (DCCallVM_mips_n64*)in_self;
|
132
139
|
if (self->mRegCount < 8) {
|
133
140
|
/*self->mRegData.mFloatData[self->mRegCount++].d = (DCdouble) x;*/
|
134
141
|
self->mRegData.mFloatData[self->mRegCount++].f = x;
|
135
142
|
} else {
|
136
|
-
dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat)
|
137
|
-
dcVecSkip(&self->mVecHead, sizeof(DCfloat)
|
143
|
+
dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat));
|
144
|
+
dcVecSkip(&self->mVecHead, sizeof(DCfloat));
|
145
|
+
}
|
146
|
+
#else
|
147
|
+
DCfloat f[] = {x,0.f};
|
148
|
+
# if defined(DC__Endian_BIG)
|
149
|
+
// floats in regs always right justified
|
150
|
+
if (((DCCallVM_mips_n64*)in_self)->mRegCount < 8) {
|
151
|
+
f[1] = f[0];
|
152
|
+
f[0] = 0.f;
|
138
153
|
}
|
154
|
+
# endif /* DC__Endian_BIG */
|
155
|
+
dc_callvm_argLongLong_mips_n64(in_self, *(DClonglong*)&f);
|
156
|
+
#endif /* DC__ABI_HARDFLOAT */
|
139
157
|
}
|
140
158
|
|
141
159
|
|
@@ -77,7 +77,7 @@ static void dc_callvm_argInt_mips_o32(DCCallVM* in_self, DCint i)
|
|
77
77
|
|
78
78
|
static void dc_callvm_argPointer_mips_o32(DCCallVM* in_self, DCpointer x)
|
79
79
|
{
|
80
|
-
dc_callvm_argInt_mips_o32(in_self, *
|
80
|
+
dc_callvm_argInt_mips_o32(in_self, *(DCint*)&x);
|
81
81
|
}
|
82
82
|
|
83
83
|
static void dc_callvm_argBool_mips_o32(DCCallVM* in_self, DCbool x)
|
@@ -100,51 +100,56 @@ static void dc_callvm_argLong_mips_o32(DCCallVM* in_self, DClong x)
|
|
100
100
|
dc_callvm_argInt_mips_o32(in_self, (DCint)x);
|
101
101
|
}
|
102
102
|
|
103
|
-
static void dc_callvm_argLongLong_mips_o32(DCCallVM* in_self, DClonglong
|
103
|
+
static void dc_callvm_argLongLong_mips_o32(DCCallVM* in_self, DClonglong x)
|
104
104
|
{
|
105
105
|
DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
|
106
|
-
|
106
|
+
|
107
107
|
/* 64-bit values need to be aligned on 8 byte boundaries */
|
108
108
|
dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4);
|
109
|
-
dcVecAppend(&self->mVecHead, &
|
110
|
-
self->mArgCount
|
109
|
+
dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong));
|
110
|
+
self->mArgCount++;
|
111
111
|
}
|
112
112
|
|
113
113
|
static void dc_callvm_argFloat_mips_o32(DCCallVM* in_self, DCfloat x)
|
114
114
|
{
|
115
115
|
DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
|
116
116
|
|
117
|
-
dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat)
|
117
|
+
dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat));
|
118
|
+
|
119
|
+
#if defined(DC__ABI_HARDFLOAT)
|
118
120
|
if (self->mArgCount < 2) {
|
119
|
-
|
121
|
+
/* @@@ unsure if we should zero init, here; seems to work as-is */
|
122
|
+
# if defined(DC__Endian_LITTLE)
|
120
123
|
self->mRegData.u[self->mArgCount].f[0] = x;
|
121
|
-
#else
|
122
|
-
self->mRegData.u[self->mArgCount].f[1] = x;
|
123
|
-
#endif
|
124
|
-
#if 0
|
124
|
+
# else
|
125
|
+
self->mRegData.u[self->mArgCount].f[1] = x; // floats in regs always right justified
|
126
|
+
# endif
|
127
|
+
# if 0
|
125
128
|
self->mRegData.u[self->mArgCount].f[1] = x;
|
126
129
|
call kernel
|
127
130
|
|
128
|
-
|
129
|
-
|
130
|
-
lwc1
|
131
|
-
lwc1
|
132
|
-
lwc1
|
133
|
-
|
134
|
-
|
135
|
-
lwc1
|
136
|
-
lwc1
|
137
|
-
lwc1
|
138
|
-
|
139
|
-
#if defined(DC__Endian_LITTLE)
|
131
|
+
mips:
|
132
|
+
lwc1 $f12, 4($5) <--- byte offset 4
|
133
|
+
lwc1 $f13, 0($5)
|
134
|
+
lwc1 $f14, 12($5) <--- byte offset 12
|
135
|
+
lwc1 $f15, 8($5)
|
136
|
+
mipsel:
|
137
|
+
lwc1 $f12, 0($5) <--- byte offset 4
|
138
|
+
lwc1 $f13, 4($5)
|
139
|
+
lwc1 $f14, 8($5) <--- byte offset 12
|
140
|
+
lwc1 $f15, 12($5)
|
141
|
+
|
142
|
+
# if defined(DC__Endian_LITTLE)
|
140
143
|
/* index 0 and 2 */
|
141
144
|
self->mRegData.floats[self->mArgCount*2] = x;
|
142
|
-
#else
|
145
|
+
# else
|
143
146
|
/* index 1 and 3 */
|
144
147
|
self->mRegData.floats[self->mArgCount*2+1] = x;
|
145
|
-
#endif
|
146
|
-
#endif
|
148
|
+
# endif
|
149
|
+
# endif
|
147
150
|
}
|
151
|
+
#endif /* DC__ABI_HARDFLOAT */
|
152
|
+
|
148
153
|
self->mArgCount++;
|
149
154
|
}
|
150
155
|
|
@@ -153,9 +158,13 @@ static void dc_callvm_argDouble_mips_o32(DCCallVM* in_self, DCdouble x)
|
|
153
158
|
DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
|
154
159
|
/* 64-bit values need to be aligned on 8 byte boundaries */
|
155
160
|
dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4);
|
156
|
-
dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)
|
161
|
+
dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble));
|
162
|
+
|
163
|
+
#if defined(DC__ABI_HARDFLOAT)
|
157
164
|
if (self->mArgCount < 2)
|
158
165
|
self->mRegData.u[self->mArgCount].d = x;
|
166
|
+
#endif /* DC__ABI_HARDFLOAT */
|
167
|
+
|
159
168
|
self->mArgCount++;
|
160
169
|
}
|
161
170
|
|
@@ -163,11 +172,9 @@ static void dc_callvm_argDouble_mips_o32(DCCallVM* in_self, DCdouble x)
|
|
163
172
|
void dc_callvm_call_mips_o32(DCCallVM* in_self, DCpointer target)
|
164
173
|
{
|
165
174
|
DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
|
166
|
-
/* at minimum provide 16-bytes
|
167
|
-
which hold the first four integer register as spill area
|
168
|
-
and are automatically loaded to $4-$7
|
169
|
-
*/
|
170
175
|
|
176
|
+
/* provide multiple of 8 (reflecting stack area alignment requirement), and
|
177
|
+
minimum of 16-bytes (to hold first 4 int regis as spill area ($4-$7)) */
|
171
178
|
size_t size = DC_MAX(16, ( ( (unsigned) dcVecSize(&self->mVecHead) ) +7UL ) & (-8UL) );
|
172
179
|
|
173
180
|
dcCall_mips_o32(target, &self->mRegData, size, dcVecData(&self->mVecHead));
|
@@ -0,0 +1,247 @@
|
|
1
|
+
/*
|
2
|
+
|
3
|
+
Package: dyncall
|
4
|
+
Library: dyncall
|
5
|
+
File: dyncall/dyncall_callvm_mips_o32.c
|
6
|
+
Description: mips "o32" ABI callvm 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
|
+
/*
|
29
|
+
|
30
|
+
dyncall callvm for mips o32 abi
|
31
|
+
|
32
|
+
REVISION
|
33
|
+
2010/06/03 initial
|
34
|
+
|
35
|
+
NOTES:
|
36
|
+
we need an argument counter for supporting floating point arguments
|
37
|
+
correctly.
|
38
|
+
|
39
|
+
first two (if any) double/float arguments are mapped via a common structure --
|
40
|
+
code must take care to write the right float argument indices which
|
41
|
+
differs on C and Assembly-side depending on endianness. (therefore
|
42
|
+
both sources have two variants 'mipseb' and 'mipsel'.)
|
43
|
+
(only for the first two float/double arguments) see float/double handling
|
44
|
+
|
45
|
+
although, the abi does not expect usage of floats if first argument is
|
46
|
+
not floating point, the call kernel can be used universal for all cases.
|
47
|
+
|
48
|
+
*/
|
49
|
+
|
50
|
+
|
51
|
+
#include "dyncall_callvm_mips_o32.h"
|
52
|
+
#include "dyncall_alloc.h"
|
53
|
+
#include "dyncall_utils.h"
|
54
|
+
|
55
|
+
|
56
|
+
static void dc_callvm_reset_mips_o32(DCCallVM* in_self)
|
57
|
+
{
|
58
|
+
DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
|
59
|
+
dcVecReset(&self->mVecHead);
|
60
|
+
self->mArgCount = 0;
|
61
|
+
}
|
62
|
+
|
63
|
+
|
64
|
+
static void dc_callvm_free_mips_o32(DCCallVM* in_self)
|
65
|
+
{
|
66
|
+
dcFreeMem(in_self);
|
67
|
+
}
|
68
|
+
|
69
|
+
/* arg int -- fillup integer register file OR push on stack */
|
70
|
+
|
71
|
+
static void dc_callvm_argInt_mips_o32(DCCallVM* in_self, DCint i)
|
72
|
+
{
|
73
|
+
DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
|
74
|
+
dcVecAppend(&self->mVecHead, &i, sizeof(DCint));
|
75
|
+
self->mArgCount++;
|
76
|
+
}
|
77
|
+
|
78
|
+
static void dc_callvm_argPointer_mips_o32(DCCallVM* in_self, DCpointer x)
|
79
|
+
{
|
80
|
+
dc_callvm_argInt_mips_o32(in_self, *(DCint*)&x);
|
81
|
+
}
|
82
|
+
|
83
|
+
static void dc_callvm_argBool_mips_o32(DCCallVM* in_self, DCbool x)
|
84
|
+
{
|
85
|
+
dc_callvm_argInt_mips_o32(in_self, (DCint)x);
|
86
|
+
}
|
87
|
+
|
88
|
+
static void dc_callvm_argChar_mips_o32(DCCallVM* in_self, DCchar x)
|
89
|
+
{
|
90
|
+
dc_callvm_argInt_mips_o32(in_self, (DCint)x);
|
91
|
+
}
|
92
|
+
|
93
|
+
static void dc_callvm_argShort_mips_o32(DCCallVM* in_self, DCshort x)
|
94
|
+
{
|
95
|
+
dc_callvm_argInt_mips_o32(in_self, (DCint)x);
|
96
|
+
}
|
97
|
+
|
98
|
+
static void dc_callvm_argLong_mips_o32(DCCallVM* in_self, DClong x)
|
99
|
+
{
|
100
|
+
dc_callvm_argInt_mips_o32(in_self, (DCint)x);
|
101
|
+
}
|
102
|
+
|
103
|
+
static void dc_callvm_argLongLong_mips_o32(DCCallVM* in_self, DClonglong x)
|
104
|
+
{
|
105
|
+
DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
|
106
|
+
|
107
|
+
/* 64-bit values need to be aligned on 8 byte boundaries */
|
108
|
+
dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4);
|
109
|
+
dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong));
|
110
|
+
self->mArgCount++;
|
111
|
+
}
|
112
|
+
|
113
|
+
static void dc_callvm_argFloat_mips_o32(DCCallVM* in_self, DCfloat x)
|
114
|
+
{
|
115
|
+
DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
|
116
|
+
|
117
|
+
dcVecAppend(&self->mVecHead, &x, sizeof(DCfloat));
|
118
|
+
|
119
|
+
#if defined(DC__ABI_HARDFLOAT)
|
120
|
+
if (self->mArgCount < 2) {
|
121
|
+
/* @@@ unsure if we should zero init, here; seems to work as-is */
|
122
|
+
# if defined(DC__Endian_LITTLE)
|
123
|
+
self->mRegData.u[self->mArgCount].f[0] = x;
|
124
|
+
# else
|
125
|
+
self->mRegData.u[self->mArgCount].f[1] = x; // floats in regs always right justified
|
126
|
+
# endif
|
127
|
+
# if 0
|
128
|
+
self->mRegData.u[self->mArgCount].f[1] = x;
|
129
|
+
call kernel
|
130
|
+
|
131
|
+
mips:
|
132
|
+
lwc1 $f12, 4($5) <--- byte offset 4
|
133
|
+
lwc1 $f13, 0($5)
|
134
|
+
lwc1 $f14, 12($5) <--- byte offset 12
|
135
|
+
lwc1 $f15, 8($5)
|
136
|
+
mipsel:
|
137
|
+
lwc1 $f12, 0($5) <--- byte offset 4
|
138
|
+
lwc1 $f13, 4($5)
|
139
|
+
lwc1 $f14, 8($5) <--- byte offset 12
|
140
|
+
lwc1 $f15, 12($5)
|
141
|
+
|
142
|
+
# if defined(DC__Endian_LITTLE)
|
143
|
+
/* index 0 and 2 */
|
144
|
+
self->mRegData.floats[self->mArgCount*2] = x;
|
145
|
+
# else
|
146
|
+
/* index 1 and 3 */
|
147
|
+
self->mRegData.floats[self->mArgCount*2+1] = x;
|
148
|
+
# endif
|
149
|
+
# endif
|
150
|
+
}
|
151
|
+
#endif /* DC__ABI_HARDFLOAT */
|
152
|
+
|
153
|
+
self->mArgCount++;
|
154
|
+
}
|
155
|
+
|
156
|
+
static void dc_callvm_argDouble_mips_o32(DCCallVM* in_self, DCdouble x)
|
157
|
+
{
|
158
|
+
DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
|
159
|
+
/* 64-bit values need to be aligned on 8 byte boundaries */
|
160
|
+
dcVecSkip(&self->mVecHead, dcVecSize(&self->mVecHead) & 4);
|
161
|
+
dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble));
|
162
|
+
|
163
|
+
#if defined(DC__ABI_HARDFLOAT)
|
164
|
+
if (self->mArgCount < 2)
|
165
|
+
self->mRegData.u[self->mArgCount].d = x;
|
166
|
+
#endif /* DC__ABI_HARDFLOAT */
|
167
|
+
|
168
|
+
self->mArgCount++;
|
169
|
+
}
|
170
|
+
|
171
|
+
/* Call. */
|
172
|
+
void dc_callvm_call_mips_o32(DCCallVM* in_self, DCpointer target)
|
173
|
+
{
|
174
|
+
DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
|
175
|
+
/* at minimum provide 16-bytes
|
176
|
+
which hold the first four integer register as spill area
|
177
|
+
and are automatically loaded to $4-$7
|
178
|
+
*/
|
179
|
+
|
180
|
+
size_t size = DC_MAX(16, ( ( (unsigned) dcVecSize(&self->mVecHead) ) +7UL ) & (-8UL) );
|
181
|
+
|
182
|
+
dcCall_mips_o32(target, &self->mRegData, size, dcVecData(&self->mVecHead));
|
183
|
+
}
|
184
|
+
|
185
|
+
static void dc_callvm_mode_mips_o32(DCCallVM* in_self, DCint mode);
|
186
|
+
|
187
|
+
DCCallVM_vt gVT_mips_o32 =
|
188
|
+
{
|
189
|
+
&dc_callvm_free_mips_o32
|
190
|
+
, &dc_callvm_reset_mips_o32
|
191
|
+
, &dc_callvm_mode_mips_o32
|
192
|
+
, &dc_callvm_argBool_mips_o32
|
193
|
+
, &dc_callvm_argChar_mips_o32
|
194
|
+
, &dc_callvm_argShort_mips_o32
|
195
|
+
, &dc_callvm_argInt_mips_o32
|
196
|
+
, &dc_callvm_argLong_mips_o32
|
197
|
+
, &dc_callvm_argLongLong_mips_o32
|
198
|
+
, &dc_callvm_argFloat_mips_o32
|
199
|
+
, &dc_callvm_argDouble_mips_o32
|
200
|
+
, &dc_callvm_argPointer_mips_o32
|
201
|
+
, NULL /* argStruct */
|
202
|
+
, (DCvoidvmfunc*) &dc_callvm_call_mips_o32
|
203
|
+
, (DCboolvmfunc*) &dc_callvm_call_mips_o32
|
204
|
+
, (DCcharvmfunc*) &dc_callvm_call_mips_o32
|
205
|
+
, (DCshortvmfunc*) &dc_callvm_call_mips_o32
|
206
|
+
, (DCintvmfunc*) &dc_callvm_call_mips_o32
|
207
|
+
, (DClongvmfunc*) &dc_callvm_call_mips_o32
|
208
|
+
, (DClonglongvmfunc*) &dc_callvm_call_mips_o32
|
209
|
+
, (DCfloatvmfunc*) &dc_callvm_call_mips_o32
|
210
|
+
, (DCdoublevmfunc*) &dc_callvm_call_mips_o32
|
211
|
+
, (DCpointervmfunc*) &dc_callvm_call_mips_o32
|
212
|
+
, NULL /* callStruct */
|
213
|
+
};
|
214
|
+
|
215
|
+
/* mode: only a single mode available currently. */
|
216
|
+
static void dc_callvm_mode_mips_o32(DCCallVM* in_self, DCint mode)
|
217
|
+
{
|
218
|
+
DCCallVM_mips_o32* self = (DCCallVM_mips_o32*)in_self;
|
219
|
+
DCCallVM_vt* vt;
|
220
|
+
|
221
|
+
switch(mode) {
|
222
|
+
case DC_CALL_C_DEFAULT:
|
223
|
+
case DC_CALL_C_MIPS32_O32:
|
224
|
+
case DC_CALL_C_ELLIPSIS:
|
225
|
+
case DC_CALL_C_ELLIPSIS_VARARGS:
|
226
|
+
vt = &gVT_mips_o32;
|
227
|
+
break;
|
228
|
+
default:
|
229
|
+
self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE;
|
230
|
+
return;
|
231
|
+
}
|
232
|
+
dc_callvm_base_init(&self->mInterface, vt);
|
233
|
+
}
|
234
|
+
|
235
|
+
/* Public API. */
|
236
|
+
DCCallVM* dcNewCallVM(DCsize size)
|
237
|
+
{
|
238
|
+
DCCallVM_mips_o32* p = (DCCallVM_mips_o32*)dcAllocMem(sizeof(DCCallVM_mips_o32)+size);
|
239
|
+
|
240
|
+
dc_callvm_mode_mips_o32((DCCallVM*)p, DC_CALL_C_DEFAULT);
|
241
|
+
|
242
|
+
dcVecInit(&p->mVecHead, size);
|
243
|
+
dc_callvm_reset_mips_o32((DCCallVM*)p);
|
244
|
+
|
245
|
+
return (DCCallVM*)p;
|
246
|
+
}
|
247
|
+
|