Mercurial > pub > dyncall > dyncall
annotate dyncall/dyncall_callvm_sparc64.c @ 251:3f7c69fadfc3
- regression fix for changing writable to executable memory for platforms where
mmap has no MAP_ANON (usually older platforms, e.g. solaris 7)
author | Tassilo Philipp |
---|---|
date | Sun, 14 May 2017 02:26:21 +0200 |
parents | 183594497726 |
children | f5577f6bf97a |
rev | line source |
---|---|
0 | 1 /* |
2 | |
3 Package: dyncall | |
4 Library: dyncall | |
178
183594497726
- renamed sparc_v9 -> sparc64 for consistency (with other platforms using 32/64 suffix instead of instrset name)
cslag
parents:
84
diff
changeset
|
5 File: dyncall/dyncall_callvm_sparc64.c |
183594497726
- renamed sparc_v9 -> sparc64 for consistency (with other platforms using 32/64 suffix instead of instrset name)
cslag
parents:
84
diff
changeset
|
6 Description: Call VM for sparc64 (v9) ABI. |
0 | 7 License: |
8 | |
9 Copyright (c) 2011-2015 Daniel Adler <dadler@uni-goettingen.de> | |
10 | |
11 Permission to use, copy, modify, and distribute this software for any | |
12 purpose with or without fee is hereby granted, provided that the above | |
13 copyright notice and this permission notice appear in all copies. | |
14 | |
15 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
16 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
17 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
18 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
22 | |
23 */ | |
24 | |
25 | |
26 | |
178
183594497726
- renamed sparc_v9 -> sparc64 for consistency (with other platforms using 32/64 suffix instead of instrset name)
cslag
parents:
84
diff
changeset
|
27 #include "dyncall_callvm_sparc64.h" |
183594497726
- renamed sparc_v9 -> sparc64 for consistency (with other platforms using 32/64 suffix instead of instrset name)
cslag
parents:
84
diff
changeset
|
28 #include "dyncall_call_sparc64.h" |
0 | 29 #include "dyncall_alloc.h" |
30 | |
31 /* Reset argument buffer. */ | |
32 static void dc_callvm_reset_v9(DCCallVM* in_self) | |
33 { | |
34 DCCallVM_v9* self = (DCCallVM_v9*)in_self; | |
84 | 35 dcVecResize(&self->mVecHead, 0); |
0 | 36 } |
37 | |
38 | |
39 /* Destructor. */ | |
40 static void dc_callvm_free_v9(DCCallVM* in_self) | |
41 { | |
42 dcFreeMem(in_self); | |
43 } | |
44 | |
45 static void dc_callvm_argLongLong_v9(DCCallVM* in_self, DClonglong x) | |
46 { | |
47 DCCallVM_v9* self = (DCCallVM_v9*)in_self; | |
48 dcVecAppend(&self->mVecHead, &x, sizeof(DClonglong)); | |
49 } | |
50 | |
51 /* all integers are promoted to 64-bit. */ | |
52 static void dc_callvm_argLong_v9 (DCCallVM* in_self, DClong x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } | |
53 static void dc_callvm_argInt_v9 (DCCallVM* in_self, DCint x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } | |
54 static void dc_callvm_argBool_v9 (DCCallVM* in_self, DCbool x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } | |
55 static void dc_callvm_argChar_v9 (DCCallVM* in_self, DCchar x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } | |
56 static void dc_callvm_argShort_v9 (DCCallVM* in_self, DCshort x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } | |
57 static void dc_callvm_argPointer_v9(DCCallVM* in_self, DCpointer x) { dc_callvm_argLongLong_v9(in_self, (DClonglong) x ); } | |
58 | |
59 static void dc_callvm_argDouble_v9(DCCallVM* in_self, DCdouble x) | |
60 { | |
61 DCCallVM_v9* self = (DCCallVM_v9*)in_self; | |
62 dcVecAppend(&self->mVecHead, &x, sizeof(DCdouble)); | |
63 } | |
64 | |
65 static void dc_callvm_argDouble_v9_ellipsis(DCCallVM* in_self, DCdouble x) | |
66 { | |
67 union { | |
68 long long l; | |
69 double d; | |
70 } u; | |
71 u.d = x; | |
72 dc_callvm_argLongLong_v9(in_self, u.l); | |
73 } | |
74 | |
75 static void dc_callvm_argFloat_v9_ellipsis(DCCallVM* in_self, DCfloat x) | |
76 { | |
77 dc_callvm_argDouble_v9_ellipsis(in_self, (DCdouble) x); | |
78 } | |
79 | |
80 static void dc_callvm_argFloat_v9(DCCallVM* in_self, DCfloat x) | |
81 { | |
82 union { | |
83 double d; | |
84 float f[2]; | |
85 } u; | |
86 u.f[1] = x; | |
87 dc_callvm_argDouble_v9(in_self, u.d); | |
88 } | |
89 | |
90 static void dc_callvm_mode_v9(DCCallVM* in_self, DCint mode); | |
91 | |
92 DCCallVM_vt gVT_v9_ellipsis = | |
93 { | |
94 &dc_callvm_free_v9, | |
95 &dc_callvm_reset_v9, | |
96 &dc_callvm_mode_v9, | |
97 &dc_callvm_argBool_v9, | |
98 &dc_callvm_argChar_v9, | |
99 &dc_callvm_argShort_v9, | |
100 &dc_callvm_argInt_v9, | |
101 &dc_callvm_argLong_v9, | |
102 &dc_callvm_argLongLong_v9, | |
103 &dc_callvm_argFloat_v9_ellipsis, | |
104 &dc_callvm_argDouble_v9_ellipsis, | |
105 &dc_callvm_argPointer_v9, | |
106 NULL /* argStruct */, | |
107 (DCvoidvmfunc*) &dcCall_v9, | |
108 (DCboolvmfunc*) &dcCall_v9, | |
109 (DCcharvmfunc*) &dcCall_v9, | |
110 (DCshortvmfunc*) &dcCall_v9, | |
111 (DCintvmfunc*) &dcCall_v9, | |
112 (DClongvmfunc*) &dcCall_v9, | |
113 (DClonglongvmfunc*) &dcCall_v9, | |
114 (DCfloatvmfunc*) &dcCall_v9, | |
115 (DCdoublevmfunc*) &dcCall_v9, | |
116 (DCpointervmfunc*) &dcCall_v9, | |
117 NULL /* callStruct */ | |
118 }; | |
119 | |
120 /* CallVM virtual table. */ | |
121 DCCallVM_vt gVT_v9 = | |
122 { | |
123 &dc_callvm_free_v9, | |
124 &dc_callvm_reset_v9, | |
125 &dc_callvm_mode_v9, | |
126 &dc_callvm_argBool_v9, | |
127 &dc_callvm_argChar_v9, | |
128 &dc_callvm_argShort_v9, | |
129 &dc_callvm_argInt_v9, | |
130 &dc_callvm_argLong_v9, | |
131 &dc_callvm_argLongLong_v9, | |
132 &dc_callvm_argFloat_v9, | |
133 &dc_callvm_argDouble_v9, | |
134 &dc_callvm_argPointer_v9, | |
135 NULL /* argStruct */, | |
136 (DCvoidvmfunc*) &dcCall_v9, | |
137 (DCboolvmfunc*) &dcCall_v9, | |
138 (DCcharvmfunc*) &dcCall_v9, | |
139 (DCshortvmfunc*) &dcCall_v9, | |
140 (DCintvmfunc*) &dcCall_v9, | |
141 (DClongvmfunc*) &dcCall_v9, | |
142 (DClonglongvmfunc*) &dcCall_v9, | |
143 (DCfloatvmfunc*) &dcCall_v9, | |
144 (DCdoublevmfunc*) &dcCall_v9, | |
145 (DCpointervmfunc*) &dcCall_v9, | |
146 NULL /* callStruct */ | |
147 }; | |
148 | |
149 /* mode: only a single mode available currently. */ | |
150 static void dc_callvm_mode_v9(DCCallVM* in_self, DCint mode) | |
151 { | |
84 | 152 DCCallVM_v9* self = (DCCallVM_v9*)in_self; |
153 DCCallVM_vt* vt; | |
154 | |
0 | 155 switch(mode) { |
156 case DC_CALL_C_DEFAULT: | |
84 | 157 case DC_CALL_C_SPARC64: |
0 | 158 case DC_CALL_C_ELLIPSIS: |
84 | 159 vt = &gVT_v9; |
0 | 160 break; |
161 case DC_CALL_C_ELLIPSIS_VARARGS: | |
84 | 162 vt = &gVT_v9_ellipsis; |
0 | 163 break; |
164 default: | |
84 | 165 self->mInterface.mError = DC_ERROR_UNSUPPORTED_MODE; |
166 return; | |
0 | 167 } |
84 | 168 dc_callvm_base_init(&self->mInterface, vt); |
0 | 169 } |
170 | |
171 /* Public API. */ | |
172 DCCallVM* dcNewCallVM(DCsize size) | |
173 { | |
84 | 174 DCCallVM_v9* p = (DCCallVM_v9*)dcAllocMem(sizeof(DCCallVM_v9)+size); |
175 | |
176 dc_callvm_mode_v9((DCCallVM*)p, DC_CALL_C_DEFAULT); | |
177 | |
178 dcVecInit(&p->mVecHead,size); | |
179 dc_callvm_reset_v9(&p->mInterface); | |
180 | |
181 return (DCCallVM*)p; | |
0 | 182 } |
183 |