ffi 0.5.4 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ffi might be problematic. Click here for more details.

Files changed (203) hide show
  1. data/LICENSE +1 -27
  2. data/Rakefile +2 -11
  3. data/ext/ffi_c/AbstractMemory.c +6 -8
  4. data/ext/ffi_c/AbstractMemory.h +23 -21
  5. data/ext/ffi_c/AutoPointer.c +0 -1
  6. data/ext/ffi_c/Buffer.c +23 -8
  7. data/ext/ffi_c/Call.c +28 -0
  8. data/ext/ffi_c/Call.h +5 -1
  9. data/ext/ffi_c/DynamicLibrary.c +0 -1
  10. data/ext/ffi_c/Function.c +19 -2
  11. data/ext/ffi_c/MemoryPointer.c +2 -3
  12. data/ext/ffi_c/Pointer.c +23 -9
  13. data/ext/ffi_c/Struct.c +142 -69
  14. data/ext/ffi_c/Struct.h +16 -7
  15. data/ext/ffi_c/StructLayout.c +92 -55
  16. data/ext/ffi_c/Type.c +5 -22
  17. data/ext/ffi_c/Type.h +1 -1
  18. data/ext/ffi_c/Types.c +8 -2
  19. data/ext/ffi_c/Types.h +2 -0
  20. data/ext/ffi_c/extconf.rb +11 -7
  21. data/ext/ffi_c/libffi/ChangeLog +900 -84
  22. data/ext/ffi_c/libffi/ChangeLog.libffi +311 -0
  23. data/ext/ffi_c/libffi/LICENSE +1 -1
  24. data/ext/ffi_c/libffi/Makefile.am +14 -4
  25. data/ext/ffi_c/libffi/Makefile.in +362 -211
  26. data/ext/ffi_c/libffi/README +70 -92
  27. data/ext/ffi_c/libffi/aclocal.m4 +6068 -4586
  28. data/ext/ffi_c/libffi/config.guess +125 -143
  29. data/ext/ffi_c/libffi/config.sub +103 -27
  30. data/ext/ffi_c/libffi/configure +11364 -18497
  31. data/ext/ffi_c/libffi/configure.ac +43 -4
  32. data/ext/ffi_c/libffi/doc/libffi.info +15 -15
  33. data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
  34. data/ext/ffi_c/libffi/doc/stamp-vti +4 -4
  35. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  36. data/ext/ffi_c/libffi/fficonfig.h.in +24 -3
  37. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  38. data/ext/ffi_c/libffi/include/Makefile.in +97 -50
  39. data/ext/ffi_c/libffi/include/ffi.h.in +8 -2
  40. data/ext/ffi_c/libffi/include/ffi_common.h +24 -0
  41. data/ext/ffi_c/libffi/libtool-version +1 -1
  42. data/ext/ffi_c/libffi/ltmain.sh +7346 -5870
  43. data/ext/ffi_c/libffi/m4/libtool.m4 +7360 -0
  44. data/ext/ffi_c/libffi/m4/ltoptions.m4 +368 -0
  45. data/ext/ffi_c/libffi/m4/ltsugar.m4 +123 -0
  46. data/ext/ffi_c/libffi/m4/ltversion.m4 +23 -0
  47. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +92 -0
  48. data/ext/ffi_c/libffi/man/Makefile.in +115 -62
  49. data/ext/ffi_c/libffi/man/ffi_call.3 +3 -3
  50. data/ext/ffi_c/libffi/missing +15 -8
  51. data/ext/ffi_c/libffi/src/arm/sysv.S +15 -8
  52. data/ext/ffi_c/libffi/src/avr32/ffi.c +421 -0
  53. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +50 -0
  54. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  55. data/ext/ffi_c/libffi/src/closures.c +47 -10
  56. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  57. data/ext/ffi_c/libffi/src/java_raw_api.c +0 -3
  58. data/ext/ffi_c/libffi/src/mips/ffi.c +135 -32
  59. data/ext/ffi_c/libffi/src/mips/ffitarget.h +37 -4
  60. data/ext/ffi_c/libffi/src/mips/n32.S +67 -10
  61. data/ext/ffi_c/libffi/src/mips/o32.S +8 -8
  62. data/ext/ffi_c/libffi/src/pa/ffi.c +7 -0
  63. data/ext/ffi_c/libffi/src/powerpc/aix.S +163 -64
  64. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +308 -112
  65. data/ext/ffi_c/libffi/src/powerpc/ffi.c +20 -7
  66. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +208 -80
  67. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +11 -3
  68. data/ext/ffi_c/libffi/src/powerpc/sysv.S +12 -23
  69. data/ext/ffi_c/libffi/src/s390/sysv.S +1 -1
  70. data/ext/ffi_c/libffi/src/sh/sysv.S +9 -9
  71. data/ext/ffi_c/libffi/src/sh64/ffi.c +37 -22
  72. data/ext/ffi_c/libffi/src/sh64/sysv.S +23 -14
  73. data/ext/ffi_c/libffi/src/sparc/ffi.c +21 -6
  74. data/ext/ffi_c/libffi/src/sparc/v8.S +55 -14
  75. data/ext/ffi_c/libffi/src/x86/darwin.S +10 -9
  76. data/ext/ffi_c/libffi/src/x86/ffi.c +293 -86
  77. data/ext/ffi_c/libffi/src/x86/ffi64.c +73 -19
  78. data/ext/ffi_c/libffi/src/x86/ffitarget.h +30 -0
  79. data/ext/ffi_c/libffi/src/x86/sysv.S +21 -4
  80. data/ext/ffi_c/libffi/src/x86/unix64.S +8 -4
  81. data/ext/ffi_c/libffi/src/x86/win32.S +633 -147
  82. data/ext/ffi_c/libffi/src/x86/win64.S +460 -0
  83. data/ext/ffi_c/libffi/testsuite/Makefile.am +63 -54
  84. data/ext/ffi_c/libffi/testsuite/Makefile.in +112 -77
  85. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +12 -1
  86. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -4
  87. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +7 -15
  88. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +7 -15
  89. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +7 -15
  90. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +7 -15
  91. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +7 -15
  92. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +7 -14
  93. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +7 -15
  94. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  95. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +6 -14
  96. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -12
  97. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -12
  98. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -12
  99. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -12
  100. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -12
  101. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -12
  102. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -12
  103. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +4 -12
  104. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -12
  105. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -12
  106. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -12
  107. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -12
  108. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -12
  109. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -12
  110. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -12
  111. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -12
  112. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +4 -12
  113. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -12
  114. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -12
  115. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -12
  116. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -12
  117. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -12
  118. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -12
  119. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -12
  120. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -12
  121. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -12
  122. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -12
  123. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +134 -0
  124. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +117 -0
  125. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +11 -17
  126. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -12
  127. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -12
  128. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +7 -15
  129. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -12
  130. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -12
  131. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +7 -15
  132. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  133. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +4 -12
  134. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +57 -0
  135. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +4 -13
  136. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  137. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +57 -0
  138. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +4 -12
  139. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +4 -12
  140. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +4 -12
  141. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +4 -12
  142. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +4 -12
  143. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +4 -12
  144. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  145. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +140 -0
  146. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +4 -12
  147. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +4 -12
  148. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +4 -12
  149. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +4 -12
  150. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +4 -12
  151. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +8 -16
  152. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +4 -12
  153. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +37 -0
  154. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +25 -0
  155. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +31 -0
  156. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +2 -1
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +342 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +4 -12
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +4 -12
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +4 -12
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +4 -12
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +4 -12
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +4 -12
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +4 -12
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +4 -12
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +4 -12
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +4 -12
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +4 -12
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +4 -12
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +1 -1
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +124 -0
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +10 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +4 -5
  179. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +17 -16
  180. data/ext/ffi_c/libffi/texinfo.tex +155 -427
  181. data/lib/ffi/autopointer.rb +79 -20
  182. data/lib/ffi/callback.rb +4 -10
  183. data/lib/ffi/enum.rb +28 -0
  184. data/lib/ffi/io.rb +28 -0
  185. data/lib/ffi/library.rb +237 -182
  186. data/lib/ffi/memorypointer.rb +28 -62
  187. data/lib/ffi/platform.rb +27 -0
  188. data/lib/ffi/pointer.rb +28 -0
  189. data/lib/ffi/struct.rb +55 -1
  190. data/lib/ffi/types.rb +29 -0
  191. data/lib/ffi/variadic.rb +29 -0
  192. data/spec/ffi/library_spec.rb +31 -5
  193. data/spec/ffi/rbx/attach_function_spec.rb +2 -1
  194. data/spec/ffi/rbx/memory_pointer_spec.rb +2 -1
  195. data/spec/ffi/spec_helper.rb +5 -1
  196. data/spec/ffi/struct_spec.rb +64 -0
  197. metadata +28 -8
  198. data/ext/ffi_c/libffi/TODO +0 -1
  199. data/ext/ffi_c/libffi/ltcf-c.sh +0 -861
  200. data/ext/ffi_c/libffi/ltcf-cxx.sh +0 -1069
  201. data/ext/ffi_c/libffi/ltcf-gcj.sh +0 -700
  202. data/ext/ffi_c/libffi/ltconfig +0 -2862
  203. data/ext/ffi_c/libffi/mkinstalldirs +0 -158
@@ -1,6 +1,6 @@
1
1
  /* -----------------------------------------------------------------------
2
- ffi.c - Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de>
3
- Copyright (c) 2008 Red Hat, Inc.
2
+ ffi64.c - Copyright (c) 2002, 2007 Bo Thorsen <bo@suse.de>
3
+ Copyright (c) 2008 Red Hat, Inc.
4
4
 
5
5
  x86-64 Foreign Function Interface
6
6
 
@@ -145,13 +145,35 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
145
145
  case FFI_TYPE_UINT64:
146
146
  case FFI_TYPE_SINT64:
147
147
  case FFI_TYPE_POINTER:
148
- if (byte_offset + type->size <= 4)
149
- classes[0] = X86_64_INTEGERSI_CLASS;
150
- else
151
- classes[0] = X86_64_INTEGER_CLASS;
152
- return 1;
148
+ {
149
+ int size = byte_offset + type->size;
150
+
151
+ if (size <= 4)
152
+ {
153
+ classes[0] = X86_64_INTEGERSI_CLASS;
154
+ return 1;
155
+ }
156
+ else if (size <= 8)
157
+ {
158
+ classes[0] = X86_64_INTEGER_CLASS;
159
+ return 1;
160
+ }
161
+ else if (size <= 12)
162
+ {
163
+ classes[0] = X86_64_INTEGER_CLASS;
164
+ classes[1] = X86_64_INTEGERSI_CLASS;
165
+ return 2;
166
+ }
167
+ else if (size <= 16)
168
+ {
169
+ classes[0] = classes[1] = X86_64_INTEGERSI_CLASS;
170
+ return 2;
171
+ }
172
+ else
173
+ FFI_ASSERT (0);
174
+ }
153
175
  case FFI_TYPE_FLOAT:
154
- if (byte_offset == 0)
176
+ if (!(byte_offset % 8))
155
177
  classes[0] = X86_64_SSESF_CLASS;
156
178
  else
157
179
  classes[0] = X86_64_SSE_CLASS;
@@ -171,13 +193,21 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
171
193
  int i;
172
194
  enum x86_64_reg_class subclasses[MAX_CLASSES];
173
195
 
174
- /* If the struct is larger than 16 bytes, pass it on the stack. */
175
- if (type->size > 16)
196
+ /* If the struct is larger than 32 bytes, pass it on the stack. */
197
+ if (type->size > 32)
176
198
  return 0;
177
199
 
178
200
  for (i = 0; i < words; i++)
179
201
  classes[i] = X86_64_NO_CLASS;
180
202
 
203
+ /* Zero sized arrays or structures are NO_CLASS. We return 0 to
204
+ signalize memory class, so handle it as special case. */
205
+ if (!words)
206
+ {
207
+ classes[0] = X86_64_NO_CLASS;
208
+ return 1;
209
+ }
210
+
181
211
  /* Merge the fields of structure. */
182
212
  for (ptr = type->elements; *ptr != NULL; ptr++)
183
213
  {
@@ -198,6 +228,20 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
198
228
  byte_offset += (*ptr)->size;
199
229
  }
200
230
 
231
+ if (words > 2)
232
+ {
233
+ /* When size > 16 bytes, if the first one isn't
234
+ X86_64_SSE_CLASS or any other ones aren't
235
+ X86_64_SSEUP_CLASS, everything should be passed in
236
+ memory. */
237
+ if (classes[0] != X86_64_SSE_CLASS)
238
+ return 0;
239
+
240
+ for (i = 1; i < words; i++)
241
+ if (classes[i] != X86_64_SSEUP_CLASS)
242
+ return 0;
243
+ }
244
+
201
245
  /* Final merger cleanup. */
202
246
  for (i = 0; i < words; i++)
203
247
  {
@@ -207,15 +251,25 @@ classify_argument (ffi_type *type, enum x86_64_reg_class classes[],
207
251
  return 0;
208
252
 
209
253
  /* The X86_64_SSEUP_CLASS should be always preceded by
210
- X86_64_SSE_CLASS. */
254
+ X86_64_SSE_CLASS or X86_64_SSEUP_CLASS. */
211
255
  if (classes[i] == X86_64_SSEUP_CLASS
212
- && (i == 0 || classes[i - 1] != X86_64_SSE_CLASS))
213
- classes[i] = X86_64_SSE_CLASS;
256
+ && classes[i - 1] != X86_64_SSE_CLASS
257
+ && classes[i - 1] != X86_64_SSEUP_CLASS)
258
+ {
259
+ /* The first one should never be X86_64_SSEUP_CLASS. */
260
+ FFI_ASSERT (i != 0);
261
+ classes[i] = X86_64_SSE_CLASS;
262
+ }
214
263
 
215
- /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */
264
+ /* If X86_64_X87UP_CLASS isn't preceded by X86_64_X87_CLASS,
265
+ everything should be passed in memory. */
216
266
  if (classes[i] == X86_64_X87UP_CLASS
217
- && (i == 0 || classes[i - 1] != X86_64_X87_CLASS))
218
- classes[i] = X86_64_SSE_CLASS;
267
+ && (classes[i - 1] != X86_64_X87_CLASS))
268
+ {
269
+ /* The first one should never be X86_64_X87UP_CLASS. */
270
+ FFI_ASSERT (i != 0);
271
+ return 0;
272
+ }
219
273
  }
220
274
  return words;
221
275
  }
@@ -528,10 +582,10 @@ ffi_closure_unix64_inner(ffi_closure *closure, void *rvalue,
528
582
  argp += arg_types[i]->size;
529
583
  }
530
584
  /* If the argument is in a single register, or two consecutive
531
- registers, then we can use that address directly. */
585
+ integer registers, then we can use that address directly. */
532
586
  else if (n == 1
533
- || (n == 2
534
- && SSE_CLASS_P (classes[0]) == SSE_CLASS_P (classes[1])))
587
+ || (n == 2 && !(SSE_CLASS_P (classes[0])
588
+ || SSE_CLASS_P (classes[1]))))
535
589
  {
536
590
  /* The argument is in a single register. */
537
591
  if (SSE_CLASS_P (classes[0]))
@@ -36,11 +36,26 @@
36
36
  #define X86
37
37
  #endif
38
38
 
39
+ #ifdef X86_WIN64
40
+ #define FFI_SIZEOF_ARG 8
41
+ #define USE_BUILTIN_FFS 0 // not yet implemented in mingw-64
42
+ #endif
43
+
39
44
  /* ---- Generic type definitions ----------------------------------------- */
40
45
 
41
46
  #ifndef LIBFFI_ASM
47
+ #ifdef X86_WIN64
48
+ #ifdef _MSC_VER
49
+ typedef unsigned __int64 ffi_arg;
50
+ typedef __int64 ffi_sarg;
51
+ #else
52
+ typedef unsigned long long ffi_arg;
53
+ typedef long long ffi_sarg;
54
+ #endif
55
+ #else
42
56
  typedef unsigned long ffi_arg;
43
57
  typedef signed long ffi_sarg;
58
+ #endif
44
59
 
45
60
  typedef enum ffi_abi {
46
61
  FFI_FIRST_ABI = 0,
@@ -53,6 +68,11 @@ typedef enum ffi_abi {
53
68
  FFI_DEFAULT_ABI = FFI_SYSV,
54
69
  #endif
55
70
 
71
+ #ifdef X86_WIN64
72
+ FFI_WIN64,
73
+ FFI_DEFAULT_ABI = FFI_WIN64,
74
+ #else
75
+
56
76
  /* ---- Intel x86 and AMD x86-64 - */
57
77
  #if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__))
58
78
  FFI_SYSV,
@@ -63,6 +83,7 @@ typedef enum ffi_abi {
63
83
  FFI_DEFAULT_ABI = FFI_UNIX64,
64
84
  #endif
65
85
  #endif
86
+ #endif /* X86_WIN64 */
66
87
 
67
88
  FFI_LAST_ABI = FFI_DEFAULT_ABI + 1
68
89
  } ffi_abi;
@@ -73,6 +94,7 @@ typedef enum ffi_abi {
73
94
  #define FFI_CLOSURES 1
74
95
  #define FFI_TYPE_SMALL_STRUCT_1B (FFI_TYPE_LAST + 1)
75
96
  #define FFI_TYPE_SMALL_STRUCT_2B (FFI_TYPE_LAST + 2)
97
+ #define FFI_TYPE_SMALL_STRUCT_4B (FFI_TYPE_LAST + 3)
76
98
 
77
99
  #if defined (X86_64) || (defined (__x86_64__) && defined (X86_DARWIN))
78
100
  #define FFI_TRAMPOLINE_SIZE 24
@@ -81,10 +103,18 @@ typedef enum ffi_abi {
81
103
  #ifdef X86_WIN32
82
104
  #define FFI_TRAMPOLINE_SIZE 13
83
105
  #else
106
+ #ifdef X86_WIN64
107
+ #define FFI_TRAMPOLINE_SIZE 29
108
+ #define FFI_NATIVE_RAW_API 0
109
+ #define FFI_NO_RAW_API 1
110
+ #else
84
111
  #define FFI_TRAMPOLINE_SIZE 10
85
112
  #endif
113
+ #endif
114
+ #ifndef X86_WIN64
86
115
  #define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */
87
116
  #endif
117
+ #endif
88
118
 
89
119
  #endif
90
120
 
@@ -242,9 +242,20 @@ ffi_closure_SYSV:
242
242
 
243
243
  #if !FFI_NO_RAW_API
244
244
 
245
+ /* Precalculate for e.g. the Solaris 10/x86 assembler. */
246
+ #if FFI_TRAMPOLINE_SIZE == 10
247
+ #define RAW_CLOSURE_CIF_OFFSET 12
248
+ #define RAW_CLOSURE_FUN_OFFSET 16
249
+ #define RAW_CLOSURE_USER_DATA_OFFSET 20
250
+ #elif FFI_TRAMPOLINE_SIZE == 24
251
+ #define RAW_CLOSURE_CIF_OFFSET 24
252
+ #define RAW_CLOSURE_FUN_OFFSET 28
253
+ #define RAW_CLOSURE_USER_DATA_OFFSET 32
254
+ #else
245
255
  #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
246
256
  #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
247
257
  #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
258
+ #endif
248
259
  #define CIF_FLAGS_OFFSET 20
249
260
 
250
261
  .align 4
@@ -343,10 +354,12 @@ ffi_closure_raw_SYSV:
343
354
  .long .LEFDE1-.LASFDE1 /* FDE Length */
344
355
  .LASFDE1:
345
356
  .long .LASFDE1-.Lframe1 /* FDE CIE offset */
346
- #ifdef __PIC__
357
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
347
358
  .long .LFB1-. /* FDE initial location */
359
+ #elif defined __PIC__
360
+ .long .LFB1@rel
348
361
  #else
349
- .long .LFB1 /* FDE initial location */
362
+ .long .LFB1
350
363
  #endif
351
364
  .long .LFE1-.LFB1 /* FDE address range */
352
365
  #ifdef __PIC__
@@ -368,8 +381,10 @@ ffi_closure_raw_SYSV:
368
381
  .long .LEFDE2-.LASFDE2 /* FDE Length */
369
382
  .LASFDE2:
370
383
  .long .LASFDE2-.Lframe1 /* FDE CIE offset */
371
- #ifdef __PIC__
384
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
372
385
  .long .LFB2-. /* FDE initial location */
386
+ #elif defined __PIC__
387
+ .long .LFB2@rel
373
388
  #else
374
389
  .long .LFB2
375
390
  #endif
@@ -402,8 +417,10 @@ ffi_closure_raw_SYSV:
402
417
  .long .LEFDE3-.LASFDE3 /* FDE Length */
403
418
  .LASFDE3:
404
419
  .long .LASFDE3-.Lframe1 /* FDE CIE offset */
405
- #ifdef __PIC__
420
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
406
421
  .long .LFB3-. /* FDE initial location */
422
+ #elif defined __PIC__
423
+ .long .LFB3@rel
407
424
  #else
408
425
  .long .LFB3
409
426
  #endif
@@ -89,7 +89,6 @@ ffi_call_unix64:
89
89
  addq %r11, %r10
90
90
  jmp *%r10
91
91
 
92
- .section .rodata
93
92
  .Lstore_table:
94
93
  .long .Lst_void-.Lstore_table /* FFI_TYPE_VOID */
95
94
  .long .Lst_sint32-.Lstore_table /* FFI_TYPE_INT */
@@ -107,7 +106,6 @@ ffi_call_unix64:
107
106
  .long .Lst_struct-.Lstore_table /* FFI_TYPE_STRUCT */
108
107
  .long .Lst_int64-.Lstore_table /* FFI_TYPE_POINTER */
109
108
 
110
- .text
111
109
  .align 2
112
110
  .Lst_void:
113
111
  ret
@@ -240,7 +238,6 @@ ffi_closure_unix64:
240
238
  addq %r11, %r10
241
239
  jmp *%r10
242
240
 
243
- .section .rodata
244
241
  .Lload_table:
245
242
  .long .Lld_void-.Lload_table /* FFI_TYPE_VOID */
246
243
  .long .Lld_int32-.Lload_table /* FFI_TYPE_INT */
@@ -258,7 +255,6 @@ ffi_closure_unix64:
258
255
  .long .Lld_struct-.Lload_table /* FFI_TYPE_STRUCT */
259
256
  .long .Lld_int64-.Lload_table /* FFI_TYPE_POINTER */
260
257
 
261
- .text
262
258
  .align 2
263
259
  .Lld_void:
264
260
  ret
@@ -351,7 +347,11 @@ ffi_closure_unix64:
351
347
  .long .LEFDE1-.LASFDE1 /* FDE Length */
352
348
  .LASFDE1:
353
349
  .long .LASFDE1-.Lframe1 /* FDE CIE offset */
350
+ #if HAVE_AS_X86_PCREL
354
351
  .long .LUW0-. /* FDE initial location */
352
+ #else
353
+ .long .LUW0@rel
354
+ #endif
355
355
  .long .LUW4-.LUW0 /* FDE address range */
356
356
  .uleb128 0x0 /* Augmentation size */
357
357
 
@@ -389,7 +389,11 @@ ffi_closure_unix64:
389
389
  .long .LEFDE3-.LASFDE3 /* FDE Length */
390
390
  .LASFDE3:
391
391
  .long .LASFDE3-.Lframe1 /* FDE CIE offset */
392
+ #if HAVE_AS_X86_PCREL
392
393
  .long .LUW5-. /* FDE initial location */
394
+ #else
395
+ .long .LUW5@rel
396
+ #endif
393
397
  .long .LUW9-.LUW5 /* FDE address range */
394
398
  .uleb128 0x0 /* Augmentation size */
395
399
 
@@ -1,5 +1,5 @@
1
1
  /* -----------------------------------------------------------------------
2
- win32.S - Copyright (c) 1996, 1998, 2001, 2002 Red Hat, Inc.
2
+ win32.S - Copyright (c) 1996, 1998, 2001, 2002, 2009 Red Hat, Inc.
3
3
  Copyright (c) 2001 John Beniton
4
4
  Copyright (c) 2002 Ranjit Mathew
5
5
 
@@ -17,32 +17,33 @@
17
17
  The above copyright notice and this permission notice shall be included
18
18
  in all copies or substantial portions of the Software.
19
19
 
20
- THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS
21
- OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
23
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
24
- ANY CLAIM, DAMAGES OR
25
- OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
26
- ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27
- OTHER DEALINGS IN THE SOFTWARE.
28
- ----------------------------------------------------------------------- */
20
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
21
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
24
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
25
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27
+ DEALINGS IN THE SOFTWARE.
28
+ -----------------------------------------------------------------------
29
+ */
29
30
 
30
31
  #define LIBFFI_ASM
31
32
  #include <fficonfig.h>
32
33
  #include <ffi.h>
33
34
 
34
- .text
35
-
36
- .globl ffi_prep_args
35
+ .text
37
36
 
38
37
  # This assumes we are using gas.
39
38
  .balign 16
40
- .globl _ffi_call_SYSV
41
-
39
+ .globl _ffi_call_SYSV
40
+ .def _ffi_call_SYSV; .scl 2; .type 32; .endef
42
41
  _ffi_call_SYSV:
42
+ .LFB1:
43
43
  pushl %ebp
44
+ .LCFI0:
44
45
  movl %esp,%ebp
45
-
46
+ .LCFI1:
46
47
  # Make room for all of the new args.
47
48
  movl 16(%ebp),%ecx
48
49
  subl %ecx,%esp
@@ -62,100 +63,137 @@ _ffi_call_SYSV:
62
63
 
63
64
  call *28(%ebp)
64
65
 
65
- # Remove the space we pushed for the args
66
- movl 16(%ebp),%ecx
67
- addl %ecx,%esp
68
-
69
66
  # Load %ecx with the return type code
70
67
  movl 20(%ebp),%ecx
71
68
 
72
69
  # If the return value pointer is NULL, assume no return value.
73
70
  cmpl $0,24(%ebp)
74
- jne retint
71
+ jne 0f
75
72
 
76
73
  # Even if there is no space for the return value, we are
77
74
  # obliged to handle floating-point values.
78
75
  cmpl $FFI_TYPE_FLOAT,%ecx
79
- jne noretval
76
+ jne .Lnoretval
80
77
  fstp %st(0)
81
78
 
82
- jmp epilogue
83
-
84
- retint:
85
- cmpl $FFI_TYPE_INT,%ecx
86
- jne retfloat
79
+ jmp .Lepilogue
80
+
81
+ 0:
82
+ call 1f
83
+ # Do not insert anything here between the call and the jump table.
84
+ .Lstore_table:
85
+ .long .Lnoretval /* FFI_TYPE_VOID */
86
+ .long .Lretint /* FFI_TYPE_INT */
87
+ .long .Lretfloat /* FFI_TYPE_FLOAT */
88
+ .long .Lretdouble /* FFI_TYPE_DOUBLE */
89
+ .long .Lretlongdouble /* FFI_TYPE_LONGDOUBLE */
90
+ .long .Lretuint8 /* FFI_TYPE_UINT8 */
91
+ .long .Lretsint8 /* FFI_TYPE_SINT8 */
92
+ .long .Lretuint16 /* FFI_TYPE_UINT16 */
93
+ .long .Lretsint16 /* FFI_TYPE_SINT16 */
94
+ .long .Lretint /* FFI_TYPE_UINT32 */
95
+ .long .Lretint /* FFI_TYPE_SINT32 */
96
+ .long .Lretint64 /* FFI_TYPE_UINT64 */
97
+ .long .Lretint64 /* FFI_TYPE_SINT64 */
98
+ .long .Lretstruct /* FFI_TYPE_STRUCT */
99
+ .long .Lretint /* FFI_TYPE_POINTER */
100
+ .long .Lretstruct1b /* FFI_TYPE_SMALL_STRUCT_1B */
101
+ .long .Lretstruct2b /* FFI_TYPE_SMALL_STRUCT_2B */
102
+ .long .Lretstruct4b /* FFI_TYPE_SMALL_STRUCT_4B */
103
+ 1:
104
+ add %ecx, %ecx
105
+ add %ecx, %ecx
106
+ add (%esp),%ecx
107
+ add $4, %esp
108
+ jmp *(%ecx)
109
+
110
+ /* Sign/zero extend as appropriate. */
111
+ .Lretsint8:
112
+ movsbl %al, %eax
113
+ jmp .Lretint
114
+
115
+ .Lretsint16:
116
+ movswl %ax, %eax
117
+ jmp .Lretint
118
+
119
+ .Lretuint8:
120
+ movzbl %al, %eax
121
+ jmp .Lretint
122
+
123
+ .Lretuint16:
124
+ movzwl %ax, %eax
125
+ jmp .Lretint
126
+
127
+ .Lretint:
87
128
  # Load %ecx with the pointer to storage for the return value
88
129
  movl 24(%ebp),%ecx
89
130
  movl %eax,0(%ecx)
90
- jmp epilogue
131
+ jmp .Lepilogue
91
132
 
92
- retfloat:
93
- cmpl $FFI_TYPE_FLOAT,%ecx
94
- jne retdouble
133
+ .Lretfloat:
95
134
  # Load %ecx with the pointer to storage for the return value
96
135
  movl 24(%ebp),%ecx
97
136
  fstps (%ecx)
98
- jmp epilogue
137
+ jmp .Lepilogue
99
138
 
100
- retdouble:
101
- cmpl $FFI_TYPE_DOUBLE,%ecx
102
- jne retlongdouble
139
+ .Lretdouble:
103
140
  # Load %ecx with the pointer to storage for the return value
104
141
  movl 24(%ebp),%ecx
105
142
  fstpl (%ecx)
106
- jmp epilogue
143
+ jmp .Lepilogue
107
144
 
108
- retlongdouble:
109
- cmpl $FFI_TYPE_LONGDOUBLE,%ecx
110
- jne retint64
145
+ .Lretlongdouble:
111
146
  # Load %ecx with the pointer to storage for the return value
112
147
  movl 24(%ebp),%ecx
113
148
  fstpt (%ecx)
114
- jmp epilogue
149
+ jmp .Lepilogue
115
150
 
116
- retint64:
117
- cmpl $FFI_TYPE_SINT64,%ecx
118
- jne retstruct1b
151
+ .Lretint64:
119
152
  # Load %ecx with the pointer to storage for the return value
120
153
  movl 24(%ebp),%ecx
121
154
  movl %eax,0(%ecx)
122
155
  movl %edx,4(%ecx)
123
-
124
- retstruct1b:
125
- cmpl $FFI_TYPE_SINT8,%ecx
126
- jne retstruct2b
156
+ jmp .Lepilogue
157
+
158
+ .Lretstruct1b:
127
159
  # Load %ecx with the pointer to storage for the return value
128
160
  movl 24(%ebp),%ecx
129
161
  movb %al,0(%ecx)
130
- jmp epilogue
162
+ jmp .Lepilogue
131
163
 
132
- retstruct2b:
133
- cmpl $FFI_TYPE_SINT16,%ecx
134
- jne retstruct
164
+ .Lretstruct2b:
135
165
  # Load %ecx with the pointer to storage for the return value
136
166
  movl 24(%ebp),%ecx
137
167
  movw %ax,0(%ecx)
138
- jmp epilogue
139
-
140
- retstruct:
168
+ jmp .Lepilogue
169
+
170
+ .Lretstruct4b:
171
+ # Load %ecx with the pointer to storage for the return value
172
+ movl 24(%ebp),%ecx
173
+ movl %eax,0(%ecx)
174
+ jmp .Lepilogue
175
+
176
+ .Lretstruct:
141
177
  # Nothing to do!
142
178
 
143
- noretval:
144
- epilogue:
179
+ .Lnoretval:
180
+ .Lepilogue:
145
181
  movl %ebp,%esp
146
182
  popl %ebp
147
183
  ret
148
-
149
184
  .ffi_call_SYSV_end:
185
+ .LFE1:
150
186
 
151
187
  # This assumes we are using gas.
152
188
  .balign 16
153
- .globl _ffi_call_STDCALL
154
-
189
+ .globl _ffi_call_STDCALL
190
+ .def _ffi_call_STDCALL; .scl 2; .type 32; .endef
155
191
  _ffi_call_STDCALL:
192
+ .LFB2:
156
193
  pushl %ebp
194
+ .LCFI2:
157
195
  movl %esp,%ebp
158
-
196
+ .LCFI3:
159
197
  # Make room for all of the new args.
160
198
  movl 16(%ebp),%ecx
161
199
  subl %ecx,%esp
@@ -182,103 +220,133 @@ _ffi_call_STDCALL:
182
220
 
183
221
  # If the return value pointer is NULL, assume no return value.
184
222
  cmpl $0,24(%ebp)
185
- jne sc_retint
223
+ jne 0f
186
224
 
187
225
  # Even if there is no space for the return value, we are
188
226
  # obliged to handle floating-point values.
189
227
  cmpl $FFI_TYPE_FLOAT,%ecx
190
- jne sc_noretval
228
+ jne .Lsc_noretval
191
229
  fstp %st(0)
192
230
 
193
- jmp sc_epilogue
231
+ jmp .Lsc_epilogue
232
+
233
+ 0:
234
+ call 1f
235
+ # Do not insert anything here between the call and the jump table.
236
+ .Lsc_store_table:
237
+ .long .Lsc_noretval /* FFI_TYPE_VOID */
238
+ .long .Lsc_retint /* FFI_TYPE_INT */
239
+ .long .Lsc_retfloat /* FFI_TYPE_FLOAT */
240
+ .long .Lsc_retdouble /* FFI_TYPE_DOUBLE */
241
+ .long .Lsc_retlongdouble /* FFI_TYPE_LONGDOUBLE */
242
+ .long .Lsc_retuint8 /* FFI_TYPE_UINT8 */
243
+ .long .Lsc_retsint8 /* FFI_TYPE_SINT8 */
244
+ .long .Lsc_retuint16 /* FFI_TYPE_UINT16 */
245
+ .long .Lsc_retsint16 /* FFI_TYPE_SINT16 */
246
+ .long .Lsc_retint /* FFI_TYPE_UINT32 */
247
+ .long .Lsc_retint /* FFI_TYPE_SINT32 */
248
+ .long .Lsc_retint64 /* FFI_TYPE_UINT64 */
249
+ .long .Lsc_retint64 /* FFI_TYPE_SINT64 */
250
+ .long .Lsc_retstruct /* FFI_TYPE_STRUCT */
251
+ .long .Lsc_retint /* FFI_TYPE_POINTER */
252
+ .long .Lsc_retstruct1b /* FFI_TYPE_SMALL_STRUCT_1B */
253
+ .long .Lsc_retstruct2b /* FFI_TYPE_SMALL_STRUCT_2B */
254
+ .long .Lsc_retstruct4b /* FFI_TYPE_SMALL_STRUCT_4B */
255
+
256
+ 1:
257
+ add %ecx, %ecx
258
+ add %ecx, %ecx
259
+ add (%esp),%ecx
260
+ add $4, %esp
261
+ jmp *(%ecx)
262
+
263
+ /* Sign/zero extend as appropriate. */
264
+ .Lsc_retsint8:
265
+ movsbl %al, %eax
266
+ jmp .Lsc_retint
194
267
 
195
- sc_retint:
196
- cmpl $FFI_TYPE_INT,%ecx
197
- jne sc_retfloat
268
+ .Lsc_retsint16:
269
+ movswl %ax, %eax
270
+ jmp .Lsc_retint
271
+
272
+ .Lsc_retuint8:
273
+ movzbl %al, %eax
274
+ jmp .Lsc_retint
275
+
276
+ .Lsc_retuint16:
277
+ movzwl %ax, %eax
278
+ jmp .Lsc_retint
279
+
280
+ .Lsc_retint:
198
281
  # Load %ecx with the pointer to storage for the return value
199
282
  movl 24(%ebp),%ecx
200
283
  movl %eax,0(%ecx)
201
- jmp sc_epilogue
284
+ jmp .Lsc_epilogue
202
285
 
203
- sc_retfloat:
204
- cmpl $FFI_TYPE_FLOAT,%ecx
205
- jne sc_retdouble
286
+ .Lsc_retfloat:
206
287
  # Load %ecx with the pointer to storage for the return value
207
288
  movl 24(%ebp),%ecx
208
289
  fstps (%ecx)
209
- jmp sc_epilogue
290
+ jmp .Lsc_epilogue
210
291
 
211
- sc_retdouble:
212
- cmpl $FFI_TYPE_DOUBLE,%ecx
213
- jne sc_retlongdouble
292
+ .Lsc_retdouble:
214
293
  # Load %ecx with the pointer to storage for the return value
215
294
  movl 24(%ebp),%ecx
216
295
  fstpl (%ecx)
217
- jmp sc_epilogue
296
+ jmp .Lsc_epilogue
218
297
 
219
- sc_retlongdouble:
220
- cmpl $FFI_TYPE_LONGDOUBLE,%ecx
221
- jne sc_retint64
298
+ .Lsc_retlongdouble:
222
299
  # Load %ecx with the pointer to storage for the return value
223
300
  movl 24(%ebp),%ecx
224
301
  fstpt (%ecx)
225
- jmp sc_epilogue
302
+ jmp .Lsc_epilogue
226
303
 
227
- sc_retint64:
228
- cmpl $FFI_TYPE_SINT64,%ecx
229
- jne sc_retstruct1b
304
+ .Lsc_retint64:
230
305
  # Load %ecx with the pointer to storage for the return value
231
306
  movl 24(%ebp),%ecx
232
307
  movl %eax,0(%ecx)
233
308
  movl %edx,4(%ecx)
309
+ jmp .Lsc_epilogue
234
310
 
235
- sc_retstruct1b:
236
- cmpl $FFI_TYPE_SINT8,%ecx
237
- jne sc_retstruct2b
311
+ .Lsc_retstruct1b:
238
312
  # Load %ecx with the pointer to storage for the return value
239
313
  movl 24(%ebp),%ecx
240
314
  movb %al,0(%ecx)
241
- jmp sc_epilogue
315
+ jmp .Lsc_epilogue
242
316
 
243
- sc_retstruct2b:
244
- cmpl $FFI_TYPE_SINT16,%ecx
245
- jne sc_retstruct
317
+ .Lsc_retstruct2b:
246
318
  # Load %ecx with the pointer to storage for the return value
247
319
  movl 24(%ebp),%ecx
248
320
  movw %ax,0(%ecx)
249
- jmp sc_epilogue
321
+ jmp .Lsc_epilogue
250
322
 
251
- sc_retstruct:
323
+ .Lsc_retstruct4b:
324
+ # Load %ecx with the pointer to storage for the return value
325
+ movl 24(%ebp),%ecx
326
+ movl %eax,0(%ecx)
327
+ jmp .Lsc_epilogue
328
+
329
+ .Lsc_retstruct:
252
330
  # Nothing to do!
253
331
 
254
- sc_noretval:
255
- sc_epilogue:
332
+ .Lsc_noretval:
333
+ .Lsc_epilogue:
256
334
  movl %ebp,%esp
257
335
  popl %ebp
258
336
  ret
259
-
260
337
  .ffi_call_STDCALL_end:
338
+ .LFE2:
261
339
 
262
- .globl _ffi_closure_STDCALL
263
- _ffi_closure_STDCALL:
264
- pushl %ebp
265
- movl %esp, %ebp
266
- subl $40, %esp
267
- leal -24(%ebp), %edx
268
- movl %edx, -12(%ebp) /* resp */
269
- leal 12(%ebp), %edx /* account for stub return address on stack */
270
- movl %edx, 4(%esp) /* args */
271
- leal -12(%ebp), %edx
272
- movl %edx, (%esp) /* &resp */
273
- call _ffi_closure_SYSV_inner
274
- movl -12(%ebp), %ecx
275
- jmp .Lcls_return_result
276
- .ffi_closure_STDCALL_end:
277
-
278
- .globl _ffi_closure_SYSV
340
+ # This assumes we are using gas.
341
+ .balign 16
342
+ .globl _ffi_closure_SYSV
343
+ .def _ffi_closure_SYSV; .scl 2; .type 32; .endef
279
344
  _ffi_closure_SYSV:
345
+ .LFB3:
280
346
  pushl %ebp
347
+ .LCFI4:
281
348
  movl %esp, %ebp
349
+ .LCFI5:
282
350
  subl $40, %esp
283
351
  leal -24(%ebp), %edx
284
352
  movl %edx, -12(%ebp) /* resp */
@@ -288,48 +356,100 @@ _ffi_closure_SYSV:
288
356
  movl %edx, (%esp) /* &resp */
289
357
  call _ffi_closure_SYSV_inner
290
358
  movl -12(%ebp), %ecx
291
- .Lcls_return_result:
292
- cmpl $FFI_TYPE_INT, %eax
293
- je .Lcls_retint
294
- cmpl $FFI_TYPE_FLOAT, %eax
295
- je .Lcls_retfloat
296
- cmpl $FFI_TYPE_DOUBLE, %eax
297
- je .Lcls_retdouble
298
- cmpl $FFI_TYPE_LONGDOUBLE, %eax
299
- je .Lcls_retldouble
300
- cmpl $FFI_TYPE_SINT64, %eax
301
- je .Lcls_retllong
302
- cmpl $FFI_TYPE_SINT8, %eax /* 1-byte struct */
303
- je .Lcls_retstruct1
304
- cmpl $FFI_TYPE_SINT16, %eax /* 2-bytes struct */
305
- je .Lcls_retstruct2
306
- .Lcls_epilogue:
307
- movl %ebp, %esp
308
- popl %ebp
309
- ret
359
+
360
+ 0:
361
+ call 1f
362
+ # Do not insert anything here between the call and the jump table.
363
+ .Lcls_store_table:
364
+ .long .Lcls_noretval /* FFI_TYPE_VOID */
365
+ .long .Lcls_retint /* FFI_TYPE_INT */
366
+ .long .Lcls_retfloat /* FFI_TYPE_FLOAT */
367
+ .long .Lcls_retdouble /* FFI_TYPE_DOUBLE */
368
+ .long .Lcls_retldouble /* FFI_TYPE_LONGDOUBLE */
369
+ .long .Lcls_retuint8 /* FFI_TYPE_UINT8 */
370
+ .long .Lcls_retsint8 /* FFI_TYPE_SINT8 */
371
+ .long .Lcls_retuint16 /* FFI_TYPE_UINT16 */
372
+ .long .Lcls_retsint16 /* FFI_TYPE_SINT16 */
373
+ .long .Lcls_retint /* FFI_TYPE_UINT32 */
374
+ .long .Lcls_retint /* FFI_TYPE_SINT32 */
375
+ .long .Lcls_retllong /* FFI_TYPE_UINT64 */
376
+ .long .Lcls_retllong /* FFI_TYPE_SINT64 */
377
+ .long .Lcls_retstruct /* FFI_TYPE_STRUCT */
378
+ .long .Lcls_retint /* FFI_TYPE_POINTER */
379
+ .long .Lcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
380
+ .long .Lcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
381
+ .long .Lcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
382
+
383
+ 1:
384
+ add %eax, %eax
385
+ add %eax, %eax
386
+ add (%esp),%eax
387
+ add $4, %esp
388
+ jmp *(%eax)
389
+
390
+ /* Sign/zero extend as appropriate. */
391
+ .Lcls_retsint8:
392
+ movsbl (%ecx), %eax
393
+ jmp .Lcls_epilogue
394
+
395
+ .Lcls_retsint16:
396
+ movswl (%ecx), %eax
397
+ jmp .Lcls_epilogue
398
+
399
+ .Lcls_retuint8:
400
+ movzbl (%ecx), %eax
401
+ jmp .Lcls_epilogue
402
+
403
+ .Lcls_retuint16:
404
+ movzwl (%ecx), %eax
405
+ jmp .Lcls_epilogue
406
+
310
407
  .Lcls_retint:
311
408
  movl (%ecx), %eax
312
409
  jmp .Lcls_epilogue
410
+
313
411
  .Lcls_retfloat:
314
412
  flds (%ecx)
315
413
  jmp .Lcls_epilogue
414
+
316
415
  .Lcls_retdouble:
317
416
  fldl (%ecx)
318
417
  jmp .Lcls_epilogue
418
+
319
419
  .Lcls_retldouble:
320
420
  fldt (%ecx)
321
421
  jmp .Lcls_epilogue
422
+
322
423
  .Lcls_retllong:
323
424
  movl (%ecx), %eax
324
425
  movl 4(%ecx), %edx
325
426
  jmp .Lcls_epilogue
427
+
326
428
  .Lcls_retstruct1:
327
429
  movsbl (%ecx), %eax
328
430
  jmp .Lcls_epilogue
431
+
329
432
  .Lcls_retstruct2:
330
433
  movswl (%ecx), %eax
331
434
  jmp .Lcls_epilogue
435
+
436
+ .Lcls_retstruct4:
437
+ movl (%ecx), %eax
438
+ jmp .Lcls_epilogue
439
+
440
+ .Lcls_retstruct:
441
+ # Caller expects us to pop struct return value pointer hidden arg.
442
+ movl %ebp, %esp
443
+ popl %ebp
444
+ ret $0x4
445
+
446
+ .Lcls_noretval:
447
+ .Lcls_epilogue:
448
+ movl %ebp, %esp
449
+ popl %ebp
450
+ ret
332
451
  .ffi_closure_SYSV_end:
452
+ .LFE3:
333
453
 
334
454
  #if !FFI_NO_RAW_API
335
455
 
@@ -338,12 +458,18 @@ _ffi_closure_SYSV:
338
458
  #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
339
459
  #define CIF_FLAGS_OFFSET 20
340
460
 
341
- .balign 16
342
- .globl _ffi_closure_raw_SYSV
461
+ # This assumes we are using gas.
462
+ .balign 16
463
+ .globl _ffi_closure_raw_SYSV
464
+ .def _ffi_closure_raw_SYSV; .scl 2; .type 32; .endef
343
465
  _ffi_closure_raw_SYSV:
466
+ .LFB4:
344
467
  pushl %ebp
468
+ .LCFI6:
345
469
  movl %esp, %ebp
470
+ .LCFI7:
346
471
  pushl %esi
472
+ .LCFI8:
347
473
  subl $36, %esp
348
474
  movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */
349
475
  movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
@@ -355,37 +481,397 @@ _ffi_closure_raw_SYSV:
355
481
  movl %esi, (%esp) /* cif */
356
482
  call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */
357
483
  movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */
358
- cmpl $FFI_TYPE_INT, %eax
359
- je .Lrcls_retint
360
- cmpl $FFI_TYPE_FLOAT, %eax
361
- je .Lrcls_retfloat
362
- cmpl $FFI_TYPE_DOUBLE, %eax
363
- je .Lrcls_retdouble
364
- cmpl $FFI_TYPE_LONGDOUBLE, %eax
365
- je .Lrcls_retldouble
366
- cmpl $FFI_TYPE_SINT64, %eax
367
- je .Lrcls_retllong
368
- .Lrcls_epilogue:
369
- addl $36, %esp
370
- popl %esi
371
- popl %ebp
372
- ret
484
+ 0:
485
+ call 1f
486
+ # Do not insert anything here between the call and the jump table.
487
+ .Lrcls_store_table:
488
+ .long .Lrcls_noretval /* FFI_TYPE_VOID */
489
+ .long .Lrcls_retint /* FFI_TYPE_INT */
490
+ .long .Lrcls_retfloat /* FFI_TYPE_FLOAT */
491
+ .long .Lrcls_retdouble /* FFI_TYPE_DOUBLE */
492
+ .long .Lrcls_retldouble /* FFI_TYPE_LONGDOUBLE */
493
+ .long .Lrcls_retuint8 /* FFI_TYPE_UINT8 */
494
+ .long .Lrcls_retsint8 /* FFI_TYPE_SINT8 */
495
+ .long .Lrcls_retuint16 /* FFI_TYPE_UINT16 */
496
+ .long .Lrcls_retsint16 /* FFI_TYPE_SINT16 */
497
+ .long .Lrcls_retint /* FFI_TYPE_UINT32 */
498
+ .long .Lrcls_retint /* FFI_TYPE_SINT32 */
499
+ .long .Lrcls_retllong /* FFI_TYPE_UINT64 */
500
+ .long .Lrcls_retllong /* FFI_TYPE_SINT64 */
501
+ .long .Lrcls_retstruct /* FFI_TYPE_STRUCT */
502
+ .long .Lrcls_retint /* FFI_TYPE_POINTER */
503
+ .long .Lrcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
504
+ .long .Lrcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
505
+ .long .Lrcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
506
+ 1:
507
+ add %eax, %eax
508
+ add %eax, %eax
509
+ add (%esp),%eax
510
+ add $4, %esp
511
+ jmp *(%eax)
512
+
513
+ /* Sign/zero extend as appropriate. */
514
+ .Lrcls_retsint8:
515
+ movsbl -24(%ebp), %eax
516
+ jmp .Lrcls_epilogue
517
+
518
+ .Lrcls_retsint16:
519
+ movswl -24(%ebp), %eax
520
+ jmp .Lrcls_epilogue
521
+
522
+ .Lrcls_retuint8:
523
+ movzbl -24(%ebp), %eax
524
+ jmp .Lrcls_epilogue
525
+
526
+ .Lrcls_retuint16:
527
+ movzwl -24(%ebp), %eax
528
+ jmp .Lrcls_epilogue
529
+
373
530
  .Lrcls_retint:
374
531
  movl -24(%ebp), %eax
375
532
  jmp .Lrcls_epilogue
533
+
376
534
  .Lrcls_retfloat:
377
535
  flds -24(%ebp)
378
536
  jmp .Lrcls_epilogue
537
+
379
538
  .Lrcls_retdouble:
380
539
  fldl -24(%ebp)
381
540
  jmp .Lrcls_epilogue
541
+
382
542
  .Lrcls_retldouble:
383
543
  fldt -24(%ebp)
384
544
  jmp .Lrcls_epilogue
545
+
385
546
  .Lrcls_retllong:
386
547
  movl -24(%ebp), %eax
387
548
  movl -20(%ebp), %edx
388
549
  jmp .Lrcls_epilogue
550
+
551
+ .Lrcls_retstruct1:
552
+ movsbl -24(%ebp), %eax
553
+ jmp .Lrcls_epilogue
554
+
555
+ .Lrcls_retstruct2:
556
+ movswl -24(%ebp), %eax
557
+ jmp .Lrcls_epilogue
558
+
559
+ .Lrcls_retstruct4:
560
+ movl -24(%ebp), %eax
561
+ jmp .Lrcls_epilogue
562
+
563
+ .Lrcls_retstruct:
564
+ # Nothing to do!
565
+
566
+ .Lrcls_noretval:
567
+ .Lrcls_epilogue:
568
+ addl $36, %esp
569
+ popl %esi
570
+ popl %ebp
571
+ ret
389
572
  .ffi_closure_raw_SYSV_end:
573
+ .LFE4:
574
+
575
+ #endif /* !FFI_NO_RAW_API */
390
576
 
577
+ # This assumes we are using gas.
578
+ .balign 16
579
+ .globl _ffi_closure_STDCALL
580
+ .def _ffi_closure_STDCALL; .scl 2; .type 32; .endef
581
+ _ffi_closure_STDCALL:
582
+ .LFB5:
583
+ pushl %ebp
584
+ .LCFI9:
585
+ movl %esp, %ebp
586
+ .LCFI10:
587
+ subl $40, %esp
588
+ leal -24(%ebp), %edx
589
+ movl %edx, -12(%ebp) /* resp */
590
+ leal 12(%ebp), %edx /* account for stub return address on stack */
591
+ movl %edx, 4(%esp) /* args */
592
+ leal -12(%ebp), %edx
593
+ movl %edx, (%esp) /* &resp */
594
+ call _ffi_closure_SYSV_inner
595
+ movl -12(%ebp), %ecx
596
+ 0:
597
+ call 1f
598
+ # Do not insert anything here between the call and the jump table.
599
+ .Lscls_store_table:
600
+ .long .Lscls_noretval /* FFI_TYPE_VOID */
601
+ .long .Lscls_retint /* FFI_TYPE_INT */
602
+ .long .Lscls_retfloat /* FFI_TYPE_FLOAT */
603
+ .long .Lscls_retdouble /* FFI_TYPE_DOUBLE */
604
+ .long .Lscls_retldouble /* FFI_TYPE_LONGDOUBLE */
605
+ .long .Lscls_retuint8 /* FFI_TYPE_UINT8 */
606
+ .long .Lscls_retsint8 /* FFI_TYPE_SINT8 */
607
+ .long .Lscls_retuint16 /* FFI_TYPE_UINT16 */
608
+ .long .Lscls_retsint16 /* FFI_TYPE_SINT16 */
609
+ .long .Lscls_retint /* FFI_TYPE_UINT32 */
610
+ .long .Lscls_retint /* FFI_TYPE_SINT32 */
611
+ .long .Lscls_retllong /* FFI_TYPE_UINT64 */
612
+ .long .Lscls_retllong /* FFI_TYPE_SINT64 */
613
+ .long .Lscls_retstruct /* FFI_TYPE_STRUCT */
614
+ .long .Lscls_retint /* FFI_TYPE_POINTER */
615
+ .long .Lscls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
616
+ .long .Lscls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
617
+ .long .Lscls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
618
+ 1:
619
+ add %eax, %eax
620
+ add %eax, %eax
621
+ add (%esp),%eax
622
+ add $4, %esp
623
+ jmp *(%eax)
624
+
625
+ /* Sign/zero extend as appropriate. */
626
+ .Lscls_retsint8:
627
+ movsbl (%ecx), %eax
628
+ jmp .Lscls_epilogue
629
+
630
+ .Lscls_retsint16:
631
+ movswl (%ecx), %eax
632
+ jmp .Lscls_epilogue
633
+
634
+ .Lscls_retuint8:
635
+ movzbl (%ecx), %eax
636
+ jmp .Lscls_epilogue
637
+
638
+ .Lscls_retuint16:
639
+ movzwl (%ecx), %eax
640
+ jmp .Lscls_epilogue
641
+
642
+ .Lscls_retint:
643
+ movl (%ecx), %eax
644
+ jmp .Lscls_epilogue
645
+
646
+ .Lscls_retfloat:
647
+ flds (%ecx)
648
+ jmp .Lscls_epilogue
649
+
650
+ .Lscls_retdouble:
651
+ fldl (%ecx)
652
+ jmp .Lscls_epilogue
653
+
654
+ .Lscls_retldouble:
655
+ fldt (%ecx)
656
+ jmp .Lscls_epilogue
657
+
658
+ .Lscls_retllong:
659
+ movl (%ecx), %eax
660
+ movl 4(%ecx), %edx
661
+ jmp .Lscls_epilogue
662
+
663
+ .Lscls_retstruct1:
664
+ movsbl (%ecx), %eax
665
+ jmp .Lscls_epilogue
666
+
667
+ .Lscls_retstruct2:
668
+ movswl (%ecx), %eax
669
+ jmp .Lscls_epilogue
670
+
671
+ .Lscls_retstruct4:
672
+ movl (%ecx), %eax
673
+ jmp .Lscls_epilogue
674
+
675
+ .Lscls_retstruct:
676
+ # Nothing to do!
677
+
678
+ .Lscls_noretval:
679
+ .Lscls_epilogue:
680
+ movl %ebp, %esp
681
+ popl %ebp
682
+ ret
683
+ .ffi_closure_STDCALL_end:
684
+ .LFE5:
685
+
686
+ .section .eh_frame,"w"
687
+ .Lframe1:
688
+ .LSCIE1:
689
+ .long .LECIE1-.LASCIE1 /* Length of Common Information Entry */
690
+ .LASCIE1:
691
+ .long 0x0 /* CIE Identifier Tag */
692
+ .byte 0x1 /* CIE Version */
693
+ #ifdef __PIC__
694
+ .ascii "zR\0" /* CIE Augmentation */
695
+ #else
696
+ .ascii "\0" /* CIE Augmentation */
697
+ #endif
698
+ .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */
699
+ .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */
700
+ .byte 0x8 /* CIE RA Column */
701
+ #ifdef __PIC__
702
+ .byte 0x1 /* .uleb128 0x1; Augmentation size */
703
+ .byte 0x1b /* FDE Encoding (pcrel sdata4) */
704
+ #endif
705
+ .byte 0xc /* DW_CFA_def_cfa CFA = r4 + 4 = 4(%esp) */
706
+ .byte 0x4 /* .uleb128 0x4 */
707
+ .byte 0x4 /* .uleb128 0x4 */
708
+ .byte 0x88 /* DW_CFA_offset, column 0x8 %eip at CFA + 1 * -4 */
709
+ .byte 0x1 /* .uleb128 0x1 */
710
+ .align 4
711
+ .LECIE1:
712
+
713
+ .LSFDE1:
714
+ .long .LEFDE1-.LASFDE1 /* FDE Length */
715
+ .LASFDE1:
716
+ .long .LASFDE1-.Lframe1 /* FDE CIE offset */
717
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
718
+ .long .LFB1-. /* FDE initial location */
719
+ #else
720
+ .long .LFB1
721
+ #endif
722
+ .long .LFE1-.LFB1 /* FDE address range */
723
+ #ifdef __PIC__
724
+ .byte 0x0 /* .uleb128 0x0; Augmentation size */
725
+ #endif
726
+ /* DW_CFA_xxx CFI instructions go here. */
727
+
728
+ .byte 0x4 /* DW_CFA_advance_loc4 */
729
+ .long .LCFI0-.LFB1
730
+ .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
731
+ .byte 0x8 /* .uleb128 0x8 */
732
+ .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
733
+ .byte 0x2 /* .uleb128 0x2 */
734
+
735
+ .byte 0x4 /* DW_CFA_advance_loc4 */
736
+ .long .LCFI1-.LCFI0
737
+ .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
738
+ .byte 0x5 /* .uleb128 0x5 */
739
+
740
+ /* End of DW_CFA_xxx CFI instructions. */
741
+ .align 4
742
+ .LEFDE1:
743
+
744
+
745
+ .LSFDE2:
746
+ .long .LEFDE2-.LASFDE2 /* FDE Length */
747
+ .LASFDE2:
748
+ .long .LASFDE2-.Lframe1 /* FDE CIE offset */
749
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
750
+ .long .LFB2-. /* FDE initial location */
751
+ #else
752
+ .long .LFB2
753
+ #endif
754
+ .long .LFE2-.LFB2 /* FDE address range */
755
+ #ifdef __PIC__
756
+ .byte 0x0 /* .uleb128 0x0; Augmentation size */
757
+ #endif
758
+ /* DW_CFA_xxx CFI instructions go here. */
759
+
760
+ .byte 0x4 /* DW_CFA_advance_loc4 */
761
+ .long .LCFI2-.LFB2
762
+ .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
763
+ .byte 0x8 /* .uleb128 0x8 */
764
+ .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
765
+ .byte 0x2 /* .uleb128 0x2 */
766
+
767
+ .byte 0x4 /* DW_CFA_advance_loc4 */
768
+ .long .LCFI3-.LCFI2
769
+ .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
770
+ .byte 0x5 /* .uleb128 0x5 */
771
+
772
+ /* End of DW_CFA_xxx CFI instructions. */
773
+ .align 4
774
+ .LEFDE2:
775
+
776
+
777
+ .LSFDE3:
778
+ .long .LEFDE3-.LASFDE3 /* FDE Length */
779
+ .LASFDE3:
780
+ .long .LASFDE3-.Lframe1 /* FDE CIE offset */
781
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
782
+ .long .LFB3-. /* FDE initial location */
783
+ #else
784
+ .long .LFB3
785
+ #endif
786
+ .long .LFE3-.LFB3 /* FDE address range */
787
+ #ifdef __PIC__
788
+ .byte 0x0 /* .uleb128 0x0; Augmentation size */
789
+ #endif
790
+ /* DW_CFA_xxx CFI instructions go here. */
791
+
792
+ .byte 0x4 /* DW_CFA_advance_loc4 */
793
+ .long .LCFI4-.LFB3
794
+ .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
795
+ .byte 0x8 /* .uleb128 0x8 */
796
+ .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
797
+ .byte 0x2 /* .uleb128 0x2 */
798
+
799
+ .byte 0x4 /* DW_CFA_advance_loc4 */
800
+ .long .LCFI5-.LCFI4
801
+ .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
802
+ .byte 0x5 /* .uleb128 0x5 */
803
+
804
+ /* End of DW_CFA_xxx CFI instructions. */
805
+ .align 4
806
+ .LEFDE3:
807
+
808
+ #if !FFI_NO_RAW_API
809
+
810
+ .LSFDE4:
811
+ .long .LEFDE4-.LASFDE4 /* FDE Length */
812
+ .LASFDE4:
813
+ .long .LASFDE4-.Lframe1 /* FDE CIE offset */
814
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
815
+ .long .LFB4-. /* FDE initial location */
816
+ #else
817
+ .long .LFB4
391
818
  #endif
819
+ .long .LFE4-.LFB4 /* FDE address range */
820
+ #ifdef __PIC__
821
+ .byte 0x0 /* .uleb128 0x0; Augmentation size */
822
+ #endif
823
+ /* DW_CFA_xxx CFI instructions go here. */
824
+
825
+ .byte 0x4 /* DW_CFA_advance_loc4 */
826
+ .long .LCFI6-.LFB4
827
+ .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
828
+ .byte 0x8 /* .uleb128 0x8 */
829
+ .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
830
+ .byte 0x2 /* .uleb128 0x2 */
831
+
832
+ .byte 0x4 /* DW_CFA_advance_loc4 */
833
+ .long .LCFI7-.LCFI6
834
+ .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
835
+ .byte 0x5 /* .uleb128 0x5 */
836
+
837
+ .byte 0x4 /* DW_CFA_advance_loc4 */
838
+ .long .LCFI8-.LCFI7
839
+ .byte 0x86 /* DW_CFA_offset, column 0x6 %esi at CFA + 3 * -4 */
840
+ .byte 0x3 /* .uleb128 0x3 */
841
+
842
+ /* End of DW_CFA_xxx CFI instructions. */
843
+ .align 4
844
+ .LEFDE4:
845
+
846
+ #endif /* !FFI_NO_RAW_API */
847
+
848
+ .LSFDE5:
849
+ .long .LEFDE5-.LASFDE5 /* FDE Length */
850
+ .LASFDE5:
851
+ .long .LASFDE5-.Lframe1 /* FDE CIE offset */
852
+ #if defined __PIC__ && defined HAVE_AS_X86_PCREL
853
+ .long .LFB5-. /* FDE initial location */
854
+ #else
855
+ .long .LFB5
856
+ #endif
857
+ .long .LFE5-.LFB5 /* FDE address range */
858
+ #ifdef __PIC__
859
+ .byte 0x0 /* .uleb128 0x0; Augmentation size */
860
+ #endif
861
+ /* DW_CFA_xxx CFI instructions go here. */
862
+
863
+ .byte 0x4 /* DW_CFA_advance_loc4 */
864
+ .long .LCFI9-.LFB5
865
+ .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
866
+ .byte 0x8 /* .uleb128 0x8 */
867
+ .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
868
+ .byte 0x2 /* .uleb128 0x2 */
869
+
870
+ .byte 0x4 /* DW_CFA_advance_loc4 */
871
+ .long .LCFI10-.LCFI9
872
+ .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
873
+ .byte 0x5 /* .uleb128 0x5 */
874
+
875
+ /* End of DW_CFA_xxx CFI instructions. */
876
+ .align 4
877
+ .LEFDE5: