1 /* -----------------------------------------------------------------------
2 win32.S - Copyright (c) 1996, 1998, 2001, 2002, 2009 Red Hat, Inc.
3 Copyright (c) 2001 John Beniton
4 Copyright (c) 2002 Ranjit Mathew
5 Copyright (c) 2009 Daniel Witte
8 X86 Foreign Function Interface
10 Permission is hereby granted, free of charge, to any person obtaining
11 a copy of this software and associated documentation files (the
12 ``Software''), to deal in the Software without restriction, including
13 without limitation the rights to use, copy, modify, merge, publish,
14 distribute, sublicense, and/or sell copies of the Software, and to
15 permit persons to whom the Software is furnished to do so, subject to
16 the following conditions:
18 The above copyright notice and this permission notice shall be included
19 in all copies or substantial portions of the Software.
21 THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
22 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
25 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
26 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
28 DEALINGS IN THE SOFTWARE.
29 -----------------------------------------------------------------------
33 #include <fficonfig.h>
41 EXTRN ffi_closure_SYSV_inner:NEAR
45 ffi_call_win32 PROC NEAR,
46 ffi_prep_args : NEAR PTR DWORD,
47 ecif : NEAR PTR DWORD,
51 rvalue : NEAR PTR DWORD,
54 ;; Make room for all of the new args.
60 ;; Place all of the ffi_prep_args in position
65 ;; Return stack to previous state and call the function
68 ;; Handle thiscall and fastcall
69 cmp cif_abi, 3 ;; FFI_THISCALL
71 cmp cif_abi, 4 ;; FFI_FASTCALL
73 mov ecx, DWORD PTR [esp]
74 mov edx, DWORD PTR [esp+4]
78 mov ecx, DWORD PTR [esp]
83 ;; cdecl: we restore esp in the epilogue, so there's no need to
84 ;; remove the space we pushed for the args.
85 ;; stdcall: the callee has already cleaned the stack.
87 ;; Load ecx with the return type code
90 ;; If the return value pointer is NULL, assume no return value.
94 ;; Even if there is no space for the return value, we are
95 ;; obliged to handle floating-point values.
96 cmp ecx, FFI_TYPE_FLOAT
103 jmp [ca_jumpdata + 4 * ecx]
105 ;; Do not insert anything here between label and jump table.
106 dd offset ca_epilogue ;; FFI_TYPE_VOID
107 dd offset ca_retint ;; FFI_TYPE_INT
108 dd offset ca_retfloat ;; FFI_TYPE_FLOAT
109 dd offset ca_retdouble ;; FFI_TYPE_DOUBLE
110 dd offset ca_retlongdouble ;; FFI_TYPE_LONGDOUBLE
111 dd offset ca_retuint8 ;; FFI_TYPE_UINT8
112 dd offset ca_retsint8 ;; FFI_TYPE_SINT8
113 dd offset ca_retuint16 ;; FFI_TYPE_UINT16
114 dd offset ca_retsint16 ;; FFI_TYPE_SINT16
115 dd offset ca_retint ;; FFI_TYPE_UINT32
116 dd offset ca_retint ;; FFI_TYPE_SINT32
117 dd offset ca_retint64 ;; FFI_TYPE_UINT64
118 dd offset ca_retint64 ;; FFI_TYPE_SINT64
119 dd offset ca_epilogue ;; FFI_TYPE_STRUCT
120 dd offset ca_retint ;; FFI_TYPE_POINTER
121 dd offset ca_retstruct1b ;; FFI_TYPE_SMALL_STRUCT_1B
122 dd offset ca_retstruct2b ;; FFI_TYPE_SMALL_STRUCT_2B
123 dd offset ca_retint ;; FFI_TYPE_SMALL_STRUCT_4B
124 dd offset ca_epilogue ;; FFI_TYPE_MS_STRUCT
126 /* Sign/zero extend as appropriate. */
144 ;; Load %ecx with the pointer to storage for the return value
150 ;; Load %ecx with the pointer to storage for the return value
157 ;; Load %ecx with the pointer to storage for the return value
163 ;; Load %ecx with the pointer to storage for the return value
169 ;; Load %ecx with the pointer to storage for the return value
175 ;; Load %ecx with the pointer to storage for the return value
181 ;; Load %ecx with the pointer to storage for the return value
187 ;; Epilogue code is autogenerated.
191 ffi_closure_THISCALL PROC NEAR FORCEFRAME
194 mov [ebp - 12], edx /* resp */
195 lea edx, [ebp + 12] /* account for stub return address on stack */
197 ffi_closure_THISCALL ENDP
199 ffi_closure_SYSV PROC NEAR FORCEFRAME
200 ;; the ffi_closure ctx is passed in eax by the trampoline.
204 mov [ebp - 12], edx ;; resp
207 mov [esp + 8], edx ;; args
209 mov [esp + 4], edx ;; &resp
210 mov [esp], eax ;; closure
211 call ffi_closure_SYSV_inner
215 jmp [cs_jumpdata + 4 * eax]
217 ;; Do not insert anything here between the label and jump table.
218 dd offset cs_epilogue ;; FFI_TYPE_VOID
219 dd offset cs_retint ;; FFI_TYPE_INT
220 dd offset cs_retfloat ;; FFI_TYPE_FLOAT
221 dd offset cs_retdouble ;; FFI_TYPE_DOUBLE
222 dd offset cs_retlongdouble ;; FFI_TYPE_LONGDOUBLE
223 dd offset cs_retuint8 ;; FFI_TYPE_UINT8
224 dd offset cs_retsint8 ;; FFI_TYPE_SINT8
225 dd offset cs_retuint16 ;; FFI_TYPE_UINT16
226 dd offset cs_retsint16 ;; FFI_TYPE_SINT16
227 dd offset cs_retint ;; FFI_TYPE_UINT32
228 dd offset cs_retint ;; FFI_TYPE_SINT32
229 dd offset cs_retint64 ;; FFI_TYPE_UINT64
230 dd offset cs_retint64 ;; FFI_TYPE_SINT64
231 dd offset cs_retstruct ;; FFI_TYPE_STRUCT
232 dd offset cs_retint ;; FFI_TYPE_POINTER
233 dd offset cs_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B
234 dd offset cs_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B
235 dd offset cs_retint ;; FFI_TYPE_SMALL_STRUCT_4B
236 dd offset cs_retmsstruct ;; FFI_TYPE_MS_STRUCT
239 movzx eax, BYTE PTR [ecx]
243 movsx eax, BYTE PTR [ecx]
247 movzx eax, WORD PTR [ecx]
251 movsx eax, WORD PTR [ecx]
276 ;; Caller expects us to pop struct return value pointer hidden arg.
277 ;; Epilogue code is autogenerated.
281 ;; Caller expects us to return a pointer to the real return value.
283 ;; Caller doesn't expects us to pop struct return value pointer hidden arg.
287 ;; Epilogue code is autogenerated.
289 ffi_closure_SYSV ENDP
293 #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) AND NOT 3)
294 #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
295 #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
296 #define CIF_FLAGS_OFFSET 20
298 ffi_closure_raw_THISCALL PROC NEAR USES esi FORCEFRAME
300 mov esi, [eax + RAW_CLOSURE_CIF_OFFSET] ;; closure->cif
301 mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data
305 ffi_closure_raw_THISCALL ENDP
307 ffi_closure_raw_SYSV PROC NEAR USES esi FORCEFRAME
308 ;; the ffi_closure ctx is passed in eax by the trampoline.
311 mov esi, [eax + RAW_CLOSURE_CIF_OFFSET] ;; closure->cif
312 mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data
313 mov [esp + 12], edx ;; user_data
316 mov [esp + 8], edx ;; raw_args
318 mov [esp + 4], edx ;; &res
319 mov [esp], esi ;; cif
320 call DWORD PTR [eax + RAW_CLOSURE_FUN_OFFSET] ;; closure->fun
321 mov eax, [esi + CIF_FLAGS_OFFSET] ;; cif->flags
325 jmp [cr_jumpdata + 4 * eax]
327 ;; Do not insert anything here between the label and jump table.
328 dd offset cr_epilogue ;; FFI_TYPE_VOID
329 dd offset cr_retint ;; FFI_TYPE_INT
330 dd offset cr_retfloat ;; FFI_TYPE_FLOAT
331 dd offset cr_retdouble ;; FFI_TYPE_DOUBLE
332 dd offset cr_retlongdouble ;; FFI_TYPE_LONGDOUBLE
333 dd offset cr_retuint8 ;; FFI_TYPE_UINT8
334 dd offset cr_retsint8 ;; FFI_TYPE_SINT8
335 dd offset cr_retuint16 ;; FFI_TYPE_UINT16
336 dd offset cr_retsint16 ;; FFI_TYPE_SINT16
337 dd offset cr_retint ;; FFI_TYPE_UINT32
338 dd offset cr_retint ;; FFI_TYPE_SINT32
339 dd offset cr_retint64 ;; FFI_TYPE_UINT64
340 dd offset cr_retint64 ;; FFI_TYPE_SINT64
341 dd offset cr_epilogue ;; FFI_TYPE_STRUCT
342 dd offset cr_retint ;; FFI_TYPE_POINTER
343 dd offset cr_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B
344 dd offset cr_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B
345 dd offset cr_retint ;; FFI_TYPE_SMALL_STRUCT_4B
346 dd offset cr_epilogue ;; FFI_TYPE_MS_STRUCT
349 movzx eax, BYTE PTR [ecx]
353 movsx eax, BYTE PTR [ecx]
357 movzx eax, WORD PTR [ecx]
361 movsx eax, WORD PTR [ecx]
386 ;; Epilogue code is autogenerated.
388 ffi_closure_raw_SYSV ENDP
390 #endif /* !FFI_NO_RAW_API */
392 ffi_closure_STDCALL PROC NEAR FORCEFRAME
393 ;; the ffi_closure ctx is passed in eax by the trampoline.
397 mov [ebp - 12], edx ;; resp
398 lea edx, [ebp + 12] ;; account for stub return address on stack
399 mov [esp + 8], edx ;; args
401 mov [esp + 4], edx ;; &resp
402 mov [esp], eax ;; closure
403 call ffi_closure_SYSV_inner
407 jmp [cd_jumpdata + 4 * eax]
409 ;; Do not insert anything here between the label and jump table.
410 dd offset cd_epilogue ;; FFI_TYPE_VOID
411 dd offset cd_retint ;; FFI_TYPE_INT
412 dd offset cd_retfloat ;; FFI_TYPE_FLOAT
413 dd offset cd_retdouble ;; FFI_TYPE_DOUBLE
414 dd offset cd_retlongdouble ;; FFI_TYPE_LONGDOUBLE
415 dd offset cd_retuint8 ;; FFI_TYPE_UINT8
416 dd offset cd_retsint8 ;; FFI_TYPE_SINT8
417 dd offset cd_retuint16 ;; FFI_TYPE_UINT16
418 dd offset cd_retsint16 ;; FFI_TYPE_SINT16
419 dd offset cd_retint ;; FFI_TYPE_UINT32
420 dd offset cd_retint ;; FFI_TYPE_SINT32
421 dd offset cd_retint64 ;; FFI_TYPE_UINT64
422 dd offset cd_retint64 ;; FFI_TYPE_SINT64
423 dd offset cd_epilogue ;; FFI_TYPE_STRUCT
424 dd offset cd_retint ;; FFI_TYPE_POINTER
425 dd offset cd_retsint8 ;; FFI_TYPE_SMALL_STRUCT_1B
426 dd offset cd_retsint16 ;; FFI_TYPE_SMALL_STRUCT_2B
427 dd offset cd_retint ;; FFI_TYPE_SMALL_STRUCT_4B
430 movzx eax, BYTE PTR [ecx]
434 movsx eax, BYTE PTR [ecx]
438 movzx eax, WORD PTR [ecx]
442 movsx eax, WORD PTR [ecx]
467 ;; Epilogue code is autogenerated.
469 ffi_closure_STDCALL ENDP
478 # This assumes we are using gas.
480 .globl _ffi_call_win32
482 .def _ffi_call_win32; .scl 2; .type 32; .endef
490 # Make room for all of the new args.
496 # Place all of the ffi_prep_args in position
501 # Return stack to previous state and call the function
504 # Handle fastcall and thiscall
505 cmpl $3, 16(%ebp) # FFI_THISCALL
507 cmpl $4, 16(%ebp) # FFI_FASTCALL
519 # FIXME: Align the stack to a 128-bit boundary to avoid
520 # potential performance hits.
524 # stdcall functions pop arguments off the stack themselves
526 # Load %ecx with the return type code
529 # If the return value pointer is NULL, assume no return value.
533 # Even if there is no space for the return value, we are
534 # obliged to handle floating-point values.
535 cmpl $FFI_TYPE_FLOAT,%ecx
543 # Do not insert anything here between the call and the jump table.
545 .long .Lnoretval /* FFI_TYPE_VOID */
546 .long .Lretint /* FFI_TYPE_INT */
547 .long .Lretfloat /* FFI_TYPE_FLOAT */
548 .long .Lretdouble /* FFI_TYPE_DOUBLE */
549 .long .Lretlongdouble /* FFI_TYPE_LONGDOUBLE */
550 .long .Lretuint8 /* FFI_TYPE_UINT8 */
551 .long .Lretsint8 /* FFI_TYPE_SINT8 */
552 .long .Lretuint16 /* FFI_TYPE_UINT16 */
553 .long .Lretsint16 /* FFI_TYPE_SINT16 */
554 .long .Lretint /* FFI_TYPE_UINT32 */
555 .long .Lretint /* FFI_TYPE_SINT32 */
556 .long .Lretint64 /* FFI_TYPE_UINT64 */
557 .long .Lretint64 /* FFI_TYPE_SINT64 */
558 .long .Lretstruct /* FFI_TYPE_STRUCT */
559 .long .Lretint /* FFI_TYPE_POINTER */
560 .long .Lretstruct1b /* FFI_TYPE_SMALL_STRUCT_1B */
561 .long .Lretstruct2b /* FFI_TYPE_SMALL_STRUCT_2B */
562 .long .Lretstruct4b /* FFI_TYPE_SMALL_STRUCT_4B */
563 .long .Lretstruct /* FFI_TYPE_MS_STRUCT */
571 /* Sign/zero extend as appropriate. */
589 # Load %ecx with the pointer to storage for the return value
595 # Load %ecx with the pointer to storage for the return value
601 # Load %ecx with the pointer to storage for the return value
607 # Load %ecx with the pointer to storage for the return value
613 # Load %ecx with the pointer to storage for the return value
620 # Load %ecx with the pointer to storage for the return value
626 # Load %ecx with the pointer to storage for the return value
632 # Load %ecx with the pointer to storage for the return value
647 .globl _ffi_closure_THISCALL
649 .def _ffi_closure_THISCALL; .scl 2; .type 32; .endef
651 _ffi_closure_THISCALL:
656 movl %edx, -12(%ebp) /* resp */
657 leal 12(%ebp), %edx /* account for stub return address on stack */
661 # This assumes we are using gas.
663 .globl _ffi_closure_SYSV
665 .def _ffi_closure_SYSV; .scl 2; .type 32; .endef
675 movl %edx, -12(%ebp) /* resp */
678 movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */
680 movl %edx, (%esp) /* &resp */
681 call _ffi_closure_SYSV_inner
686 # Do not insert anything here between the call and the jump table.
688 .long .Lcls_noretval /* FFI_TYPE_VOID */
689 .long .Lcls_retint /* FFI_TYPE_INT */
690 .long .Lcls_retfloat /* FFI_TYPE_FLOAT */
691 .long .Lcls_retdouble /* FFI_TYPE_DOUBLE */
692 .long .Lcls_retldouble /* FFI_TYPE_LONGDOUBLE */
693 .long .Lcls_retuint8 /* FFI_TYPE_UINT8 */
694 .long .Lcls_retsint8 /* FFI_TYPE_SINT8 */
695 .long .Lcls_retuint16 /* FFI_TYPE_UINT16 */
696 .long .Lcls_retsint16 /* FFI_TYPE_SINT16 */
697 .long .Lcls_retint /* FFI_TYPE_UINT32 */
698 .long .Lcls_retint /* FFI_TYPE_SINT32 */
699 .long .Lcls_retllong /* FFI_TYPE_UINT64 */
700 .long .Lcls_retllong /* FFI_TYPE_SINT64 */
701 .long .Lcls_retstruct /* FFI_TYPE_STRUCT */
702 .long .Lcls_retint /* FFI_TYPE_POINTER */
703 .long .Lcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
704 .long .Lcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
705 .long .Lcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
706 .long .Lcls_retmsstruct /* FFI_TYPE_MS_STRUCT */
715 /* Sign/zero extend as appropriate. */
766 # Caller expects us to pop struct return value pointer hidden arg.
772 # Caller expects us to return a pointer to the real return value.
774 # Caller doesn't expects us to pop struct return value pointer hidden arg.
782 .ffi_closure_SYSV_end:
787 #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
788 #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
789 #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
790 #define CIF_FLAGS_OFFSET 20
792 .globl _ffi_closure_raw_THISCALL
794 .def _ffi_closure_raw_THISCALL; .scl 2; .type 32; .endef
796 _ffi_closure_raw_THISCALL:
801 movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */
802 movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
803 movl %edx, 12(%esp) /* user_data */
804 leal 12(%ebp), %edx /* __builtin_dwarf_cfa () */
806 # This assumes we are using gas.
808 .globl _ffi_closure_raw_SYSV
810 .def _ffi_closure_raw_SYSV; .scl 2; .type 32; .endef
812 _ffi_closure_raw_SYSV:
821 movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */
822 movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
823 movl %edx, 12(%esp) /* user_data */
824 leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */
826 movl %edx, 8(%esp) /* raw_args */
828 movl %edx, 4(%esp) /* &res */
829 movl %esi, (%esp) /* cif */
830 call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */
831 movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */
834 # Do not insert anything here between the call and the jump table.
836 .long .Lrcls_noretval /* FFI_TYPE_VOID */
837 .long .Lrcls_retint /* FFI_TYPE_INT */
838 .long .Lrcls_retfloat /* FFI_TYPE_FLOAT */
839 .long .Lrcls_retdouble /* FFI_TYPE_DOUBLE */
840 .long .Lrcls_retldouble /* FFI_TYPE_LONGDOUBLE */
841 .long .Lrcls_retuint8 /* FFI_TYPE_UINT8 */
842 .long .Lrcls_retsint8 /* FFI_TYPE_SINT8 */
843 .long .Lrcls_retuint16 /* FFI_TYPE_UINT16 */
844 .long .Lrcls_retsint16 /* FFI_TYPE_SINT16 */
845 .long .Lrcls_retint /* FFI_TYPE_UINT32 */
846 .long .Lrcls_retint /* FFI_TYPE_SINT32 */
847 .long .Lrcls_retllong /* FFI_TYPE_UINT64 */
848 .long .Lrcls_retllong /* FFI_TYPE_SINT64 */
849 .long .Lrcls_retstruct /* FFI_TYPE_STRUCT */
850 .long .Lrcls_retint /* FFI_TYPE_POINTER */
851 .long .Lrcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
852 .long .Lrcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
853 .long .Lrcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
854 .long .Lrcls_retstruct /* FFI_TYPE_MS_STRUCT */
862 /* Sign/zero extend as appropriate. */
864 movsbl -24(%ebp), %eax
868 movswl -24(%ebp), %eax
872 movzbl -24(%ebp), %eax
876 movzwl -24(%ebp), %eax
901 movsbl -24(%ebp), %eax
905 movswl -24(%ebp), %eax
921 .ffi_closure_raw_SYSV_end:
924 #endif /* !FFI_NO_RAW_API */
926 # This assumes we are using gas.
928 .globl _ffi_closure_STDCALL
930 .def _ffi_closure_STDCALL; .scl 2; .type 32; .endef
932 _ffi_closure_STDCALL:
940 movl %edx, -12(%ebp) /* resp */
941 leal 12(%ebp), %edx /* account for stub return address on stack */
942 movl %edx, 4(%esp) /* args */
944 movl %edx, (%esp) /* &resp */
945 call _ffi_closure_SYSV_inner
949 # Do not insert anything here between the call and the jump table.
951 .long .Lscls_noretval /* FFI_TYPE_VOID */
952 .long .Lscls_retint /* FFI_TYPE_INT */
953 .long .Lscls_retfloat /* FFI_TYPE_FLOAT */
954 .long .Lscls_retdouble /* FFI_TYPE_DOUBLE */
955 .long .Lscls_retldouble /* FFI_TYPE_LONGDOUBLE */
956 .long .Lscls_retuint8 /* FFI_TYPE_UINT8 */
957 .long .Lscls_retsint8 /* FFI_TYPE_SINT8 */
958 .long .Lscls_retuint16 /* FFI_TYPE_UINT16 */
959 .long .Lscls_retsint16 /* FFI_TYPE_SINT16 */
960 .long .Lscls_retint /* FFI_TYPE_UINT32 */
961 .long .Lscls_retint /* FFI_TYPE_SINT32 */
962 .long .Lscls_retllong /* FFI_TYPE_UINT64 */
963 .long .Lscls_retllong /* FFI_TYPE_SINT64 */
964 .long .Lscls_retstruct /* FFI_TYPE_STRUCT */
965 .long .Lscls_retint /* FFI_TYPE_POINTER */
966 .long .Lscls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
967 .long .Lscls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
968 .long .Lscls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
976 /* Sign/zero extend as appropriate. */
1034 .ffi_closure_STDCALL_end:
1038 .section .eh_frame,"w"
1042 .long .LECIE1-.LASCIE1 /* Length of Common Information Entry */
1044 .long 0x0 /* CIE Identifier Tag */
1045 .byte 0x1 /* CIE Version */
1047 .ascii "zR\0" /* CIE Augmentation */
1049 .ascii "\0" /* CIE Augmentation */
1051 .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */
1052 .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */
1053 .byte 0x8 /* CIE RA Column */
1055 .byte 0x1 /* .uleb128 0x1; Augmentation size */
1056 .byte 0x1b /* FDE Encoding (pcrel sdata4) */
1058 .byte 0xc /* DW_CFA_def_cfa CFA = r4 + 4 = 4(%esp) */
1059 .byte 0x4 /* .uleb128 0x4 */
1060 .byte 0x4 /* .uleb128 0x4 */
1061 .byte 0x88 /* DW_CFA_offset, column 0x8 %eip at CFA + 1 * -4 */
1062 .byte 0x1 /* .uleb128 0x1 */
1067 .long .LEFDE1-.LASFDE1 /* FDE Length */
1069 .long .LASFDE1-.Lframe1 /* FDE CIE offset */
1070 #if defined __PIC__ && defined HAVE_AS_X86_PCREL
1071 .long .LFB1-. /* FDE initial location */
1075 .long .LFE1-.LFB1 /* FDE address range */
1077 .byte 0x0 /* .uleb128 0x0; Augmentation size */
1079 /* DW_CFA_xxx CFI instructions go here. */
1081 .byte 0x4 /* DW_CFA_advance_loc4 */
1083 .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
1084 .byte 0x8 /* .uleb128 0x8 */
1085 .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
1086 .byte 0x2 /* .uleb128 0x2 */
1088 .byte 0x4 /* DW_CFA_advance_loc4 */
1090 .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
1091 .byte 0x5 /* .uleb128 0x5 */
1093 /* End of DW_CFA_xxx CFI instructions. */
1099 .long .LEFDE3-.LASFDE3 /* FDE Length */
1101 .long .LASFDE3-.Lframe1 /* FDE CIE offset */
1102 #if defined __PIC__ && defined HAVE_AS_X86_PCREL
1103 .long .LFB3-. /* FDE initial location */
1107 .long .LFE3-.LFB3 /* FDE address range */
1109 .byte 0x0 /* .uleb128 0x0; Augmentation size */
1111 /* DW_CFA_xxx CFI instructions go here. */
1113 .byte 0x4 /* DW_CFA_advance_loc4 */
1115 .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
1116 .byte 0x8 /* .uleb128 0x8 */
1117 .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
1118 .byte 0x2 /* .uleb128 0x2 */
1120 .byte 0x4 /* DW_CFA_advance_loc4 */
1122 .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
1123 .byte 0x5 /* .uleb128 0x5 */
1125 /* End of DW_CFA_xxx CFI instructions. */
1132 .long .LEFDE4-.LASFDE4 /* FDE Length */
1134 .long .LASFDE4-.Lframe1 /* FDE CIE offset */
1135 #if defined __PIC__ && defined HAVE_AS_X86_PCREL
1136 .long .LFB4-. /* FDE initial location */
1140 .long .LFE4-.LFB4 /* FDE address range */
1142 .byte 0x0 /* .uleb128 0x0; Augmentation size */
1144 /* DW_CFA_xxx CFI instructions go here. */
1146 .byte 0x4 /* DW_CFA_advance_loc4 */
1148 .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
1149 .byte 0x8 /* .uleb128 0x8 */
1150 .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
1151 .byte 0x2 /* .uleb128 0x2 */
1153 .byte 0x4 /* DW_CFA_advance_loc4 */
1155 .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
1156 .byte 0x5 /* .uleb128 0x5 */
1158 .byte 0x4 /* DW_CFA_advance_loc4 */
1160 .byte 0x86 /* DW_CFA_offset, column 0x6 %esi at CFA + 3 * -4 */
1161 .byte 0x3 /* .uleb128 0x3 */
1163 /* End of DW_CFA_xxx CFI instructions. */
1167 #endif /* !FFI_NO_RAW_API */
1170 .long .LEFDE5-.LASFDE5 /* FDE Length */
1172 .long .LASFDE5-.Lframe1 /* FDE CIE offset */
1173 #if defined __PIC__ && defined HAVE_AS_X86_PCREL
1174 .long .LFB5-. /* FDE initial location */
1178 .long .LFE5-.LFB5 /* FDE address range */
1180 .byte 0x0 /* .uleb128 0x0; Augmentation size */
1182 /* DW_CFA_xxx CFI instructions go here. */
1184 .byte 0x4 /* DW_CFA_advance_loc4 */
1186 .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
1187 .byte 0x8 /* .uleb128 0x8 */
1188 .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
1189 .byte 0x2 /* .uleb128 0x2 */
1191 .byte 0x4 /* DW_CFA_advance_loc4 */
1192 .long .LCFI10-.LCFI9
1193 .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
1194 .byte 0x5 /* .uleb128 0x5 */
1196 /* End of DW_CFA_xxx CFI instructions. */
1200 #endif /* !_MSC_VER */