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,
50 rvalue : NEAR PTR DWORD,
53 ;; Make room for all of the new args.
59 ;; Place all of the ffi_prep_args in position
64 ;; Return stack to previous state and call the function
69 ;; cdecl: we restore esp in the epilogue, so there's no need to
70 ;; remove the space we pushed for the args.
71 ;; stdcall: the callee has already cleaned the stack.
73 ;; Load ecx with the return type code
76 ;; If the return value pointer is NULL, assume no return value.
80 ;; Even if there is no space for the return value, we are
81 ;; obliged to handle floating-point values.
82 cmp ecx, FFI_TYPE_FLOAT
89 jmp [ca_jumpdata + 4 * ecx]
91 ;; Do not insert anything here between label and jump table.
92 dd offset ca_epilogue ;; FFI_TYPE_VOID
93 dd offset ca_retint ;; FFI_TYPE_INT
94 dd offset ca_retfloat ;; FFI_TYPE_FLOAT
95 dd offset ca_retdouble ;; FFI_TYPE_DOUBLE
96 dd offset ca_retlongdouble ;; FFI_TYPE_LONGDOUBLE
97 dd offset ca_retint8 ;; FFI_TYPE_UINT8
98 dd offset ca_retint8 ;; FFI_TYPE_SINT8
99 dd offset ca_retint16 ;; FFI_TYPE_UINT16
100 dd offset ca_retint16 ;; FFI_TYPE_SINT16
101 dd offset ca_retint ;; FFI_TYPE_UINT32
102 dd offset ca_retint ;; FFI_TYPE_SINT32
103 dd offset ca_retint64 ;; FFI_TYPE_UINT64
104 dd offset ca_retint64 ;; FFI_TYPE_SINT64
105 dd offset ca_epilogue ;; FFI_TYPE_STRUCT
106 dd offset ca_retint ;; FFI_TYPE_POINTER
107 dd offset ca_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B
108 dd offset ca_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B
109 dd offset ca_retint ;; FFI_TYPE_SMALL_STRUCT_4B
112 ;; Load %ecx with the pointer to storage for the return value
118 ;; Load %ecx with the pointer to storage for the return value
124 ;; Load %ecx with the pointer to storage for the return value
130 ;; Load %ecx with the pointer to storage for the return value
137 ;; Load %ecx with the pointer to storage for the return value
143 ;; Load %ecx with the pointer to storage for the return value
149 ;; Load %ecx with the pointer to storage for the return value
155 ;; Epilogue code is autogenerated.
159 ffi_closure_SYSV PROC NEAR FORCEFRAME
160 ;; the ffi_closure ctx is passed in eax by the trampoline.
164 mov [ebp - 12], edx ;; resp
166 mov [esp + 8], edx ;; args
168 mov [esp + 4], edx ;; &resp
169 mov [esp], eax ;; closure
170 call ffi_closure_SYSV_inner
174 jmp [cs_jumpdata + 4 * eax]
176 ;; Do not insert anything here between the label and jump table.
177 dd offset cs_epilogue ;; FFI_TYPE_VOID
178 dd offset cs_retint ;; FFI_TYPE_INT
179 dd offset cs_retfloat ;; FFI_TYPE_FLOAT
180 dd offset cs_retdouble ;; FFI_TYPE_DOUBLE
181 dd offset cs_retlongdouble ;; FFI_TYPE_LONGDOUBLE
182 dd offset cs_retint8 ;; FFI_TYPE_UINT8
183 dd offset cs_retint8 ;; FFI_TYPE_SINT8
184 dd offset cs_retint16 ;; FFI_TYPE_UINT16
185 dd offset cs_retint16 ;; FFI_TYPE_SINT16
186 dd offset cs_retint ;; FFI_TYPE_UINT32
187 dd offset cs_retint ;; FFI_TYPE_SINT32
188 dd offset cs_retint64 ;; FFI_TYPE_UINT64
189 dd offset cs_retint64 ;; FFI_TYPE_SINT64
190 dd offset cs_retstruct ;; FFI_TYPE_STRUCT
191 dd offset cs_retint ;; FFI_TYPE_POINTER
192 dd offset cs_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B
193 dd offset cs_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B
194 dd offset cs_retint ;; FFI_TYPE_SMALL_STRUCT_4B
226 ;; Caller expects us to pop struct return value pointer hidden arg.
227 ;; Epilogue code is autogenerated.
231 ;; Epilogue code is autogenerated.
233 ffi_closure_SYSV ENDP
237 #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) AND NOT 3)
238 #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
239 #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
240 #define CIF_FLAGS_OFFSET 20
242 ffi_closure_raw_SYSV PROC NEAR USES esi
243 ;; the ffi_closure ctx is passed in eax by the trampoline.
246 mov esi, [eax + RAW_CLOSURE_CIF_OFFSET] ;; closure->cif
247 mov edx, [eax + RAW_CLOSURE_USER_DATA_OFFSET] ;; closure->user_data
248 mov [esp + 12], edx ;; user_data
250 mov [esp + 8], edx ;; raw_args
252 mov [esp + 4], edx ;; &res
253 mov [esp], esi ;; cif
254 call DWORD PTR [eax + RAW_CLOSURE_FUN_OFFSET] ;; closure->fun
255 mov eax, [esi + CIF_FLAGS_OFFSET] ;; cif->flags
259 jmp [cr_jumpdata + 4 * eax]
261 ;; Do not insert anything here between the label and jump table.
262 dd offset cr_epilogue ;; FFI_TYPE_VOID
263 dd offset cr_retint ;; FFI_TYPE_INT
264 dd offset cr_retfloat ;; FFI_TYPE_FLOAT
265 dd offset cr_retdouble ;; FFI_TYPE_DOUBLE
266 dd offset cr_retlongdouble ;; FFI_TYPE_LONGDOUBLE
267 dd offset cr_retint8 ;; FFI_TYPE_UINT8
268 dd offset cr_retint8 ;; FFI_TYPE_SINT8
269 dd offset cr_retint16 ;; FFI_TYPE_UINT16
270 dd offset cr_retint16 ;; FFI_TYPE_SINT16
271 dd offset cr_retint ;; FFI_TYPE_UINT32
272 dd offset cr_retint ;; FFI_TYPE_SINT32
273 dd offset cr_retint64 ;; FFI_TYPE_UINT64
274 dd offset cr_retint64 ;; FFI_TYPE_SINT64
275 dd offset cr_epilogue ;; FFI_TYPE_STRUCT
276 dd offset cr_retint ;; FFI_TYPE_POINTER
277 dd offset cr_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B
278 dd offset cr_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B
279 dd offset cr_retint ;; FFI_TYPE_SMALL_STRUCT_4B
311 ;; Epilogue code is autogenerated.
313 ffi_closure_raw_SYSV ENDP
315 #endif /* !FFI_NO_RAW_API */
317 ffi_closure_STDCALL PROC NEAR FORCEFRAME
318 ;; the ffi_closure ctx is passed in eax by the trampoline.
322 mov [ebp - 12], edx ;; resp
323 lea edx, [ebp + 12] ;; account for stub return address on stack
324 mov [esp + 8], edx ;; args
326 mov [esp + 4], edx ;; &resp
327 mov [esp], eax ;; closure
328 call ffi_closure_SYSV_inner
332 jmp [cd_jumpdata + 4 * eax]
334 ;; Do not insert anything here between the label and jump table.
335 dd offset cd_epilogue ;; FFI_TYPE_VOID
336 dd offset cd_retint ;; FFI_TYPE_INT
337 dd offset cd_retfloat ;; FFI_TYPE_FLOAT
338 dd offset cd_retdouble ;; FFI_TYPE_DOUBLE
339 dd offset cd_retlongdouble ;; FFI_TYPE_LONGDOUBLE
340 dd offset cd_retint8 ;; FFI_TYPE_UINT8
341 dd offset cd_retint8 ;; FFI_TYPE_SINT8
342 dd offset cd_retint16 ;; FFI_TYPE_UINT16
343 dd offset cd_retint16 ;; FFI_TYPE_SINT16
344 dd offset cd_retint ;; FFI_TYPE_UINT32
345 dd offset cd_retint ;; FFI_TYPE_SINT32
346 dd offset cd_retint64 ;; FFI_TYPE_UINT64
347 dd offset cd_retint64 ;; FFI_TYPE_SINT64
348 dd offset cd_epilogue ;; FFI_TYPE_STRUCT
349 dd offset cd_retint ;; FFI_TYPE_POINTER
350 dd offset cd_retint8 ;; FFI_TYPE_SMALL_STRUCT_1B
351 dd offset cd_retint16 ;; FFI_TYPE_SMALL_STRUCT_2B
352 dd offset cd_retint ;; FFI_TYPE_SMALL_STRUCT_4B
384 ;; Epilogue code is autogenerated.
386 ffi_closure_STDCALL ENDP
395 # This assumes we are using gas.
397 .globl _ffi_call_win32
399 .def _ffi_call_win32; .scl 2; .type 32; .endef
407 # Make room for all of the new args.
413 # Place all of the ffi_prep_args in position
418 # Return stack to previous state and call the function
421 # FIXME: Align the stack to a 128-bit boundary to avoid
422 # potential performance hits.
426 # stdcall functions pop arguments off the stack themselves
428 # Load %ecx with the return type code
431 # If the return value pointer is NULL, assume no return value.
435 # Even if there is no space for the return value, we are
436 # obliged to handle floating-point values.
437 cmpl $FFI_TYPE_FLOAT,%ecx
445 # Do not insert anything here between the call and the jump table.
447 .long .Lnoretval /* FFI_TYPE_VOID */
448 .long .Lretint /* FFI_TYPE_INT */
449 .long .Lretfloat /* FFI_TYPE_FLOAT */
450 .long .Lretdouble /* FFI_TYPE_DOUBLE */
451 .long .Lretlongdouble /* FFI_TYPE_LONGDOUBLE */
452 .long .Lretuint8 /* FFI_TYPE_UINT8 */
453 .long .Lretsint8 /* FFI_TYPE_SINT8 */
454 .long .Lretuint16 /* FFI_TYPE_UINT16 */
455 .long .Lretsint16 /* FFI_TYPE_SINT16 */
456 .long .Lretint /* FFI_TYPE_UINT32 */
457 .long .Lretint /* FFI_TYPE_SINT32 */
458 .long .Lretint64 /* FFI_TYPE_UINT64 */
459 .long .Lretint64 /* FFI_TYPE_SINT64 */
460 .long .Lretstruct /* FFI_TYPE_STRUCT */
461 .long .Lretint /* FFI_TYPE_POINTER */
462 .long .Lretstruct1b /* FFI_TYPE_SMALL_STRUCT_1B */
463 .long .Lretstruct2b /* FFI_TYPE_SMALL_STRUCT_2B */
464 .long .Lretstruct4b /* FFI_TYPE_SMALL_STRUCT_4B */
472 /* Sign/zero extend as appropriate. */
490 # Load %ecx with the pointer to storage for the return value
496 # Load %ecx with the pointer to storage for the return value
502 # Load %ecx with the pointer to storage for the return value
508 # Load %ecx with the pointer to storage for the return value
514 # Load %ecx with the pointer to storage for the return value
521 # Load %ecx with the pointer to storage for the return value
527 # Load %ecx with the pointer to storage for the return value
533 # Load %ecx with the pointer to storage for the return value
549 # This assumes we are using gas.
551 .globl _ffi_closure_SYSV
553 .def _ffi_closure_SYSV; .scl 2; .type 32; .endef
563 movl %edx, -12(%ebp) /* resp */
565 movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */
567 movl %edx, (%esp) /* &resp */
568 call _ffi_closure_SYSV_inner
573 # Do not insert anything here between the call and the jump table.
575 .long .Lcls_noretval /* FFI_TYPE_VOID */
576 .long .Lcls_retint /* FFI_TYPE_INT */
577 .long .Lcls_retfloat /* FFI_TYPE_FLOAT */
578 .long .Lcls_retdouble /* FFI_TYPE_DOUBLE */
579 .long .Lcls_retldouble /* FFI_TYPE_LONGDOUBLE */
580 .long .Lcls_retuint8 /* FFI_TYPE_UINT8 */
581 .long .Lcls_retsint8 /* FFI_TYPE_SINT8 */
582 .long .Lcls_retuint16 /* FFI_TYPE_UINT16 */
583 .long .Lcls_retsint16 /* FFI_TYPE_SINT16 */
584 .long .Lcls_retint /* FFI_TYPE_UINT32 */
585 .long .Lcls_retint /* FFI_TYPE_SINT32 */
586 .long .Lcls_retllong /* FFI_TYPE_UINT64 */
587 .long .Lcls_retllong /* FFI_TYPE_SINT64 */
588 .long .Lcls_retstruct /* FFI_TYPE_STRUCT */
589 .long .Lcls_retint /* FFI_TYPE_POINTER */
590 .long .Lcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
591 .long .Lcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
592 .long .Lcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
601 /* Sign/zero extend as appropriate. */
652 # Caller expects us to pop struct return value pointer hidden arg.
662 .ffi_closure_SYSV_end:
667 #define RAW_CLOSURE_CIF_OFFSET ((FFI_TRAMPOLINE_SIZE + 3) & ~3)
668 #define RAW_CLOSURE_FUN_OFFSET (RAW_CLOSURE_CIF_OFFSET + 4)
669 #define RAW_CLOSURE_USER_DATA_OFFSET (RAW_CLOSURE_FUN_OFFSET + 4)
670 #define CIF_FLAGS_OFFSET 20
672 # This assumes we are using gas.
674 .globl _ffi_closure_raw_SYSV
676 .def _ffi_closure_raw_SYSV; .scl 2; .type 32; .endef
678 _ffi_closure_raw_SYSV:
687 movl RAW_CLOSURE_CIF_OFFSET(%eax), %esi /* closure->cif */
688 movl RAW_CLOSURE_USER_DATA_OFFSET(%eax), %edx /* closure->user_data */
689 movl %edx, 12(%esp) /* user_data */
690 leal 8(%ebp), %edx /* __builtin_dwarf_cfa () */
691 movl %edx, 8(%esp) /* raw_args */
693 movl %edx, 4(%esp) /* &res */
694 movl %esi, (%esp) /* cif */
695 call *RAW_CLOSURE_FUN_OFFSET(%eax) /* closure->fun */
696 movl CIF_FLAGS_OFFSET(%esi), %eax /* rtype */
699 # Do not insert anything here between the call and the jump table.
701 .long .Lrcls_noretval /* FFI_TYPE_VOID */
702 .long .Lrcls_retint /* FFI_TYPE_INT */
703 .long .Lrcls_retfloat /* FFI_TYPE_FLOAT */
704 .long .Lrcls_retdouble /* FFI_TYPE_DOUBLE */
705 .long .Lrcls_retldouble /* FFI_TYPE_LONGDOUBLE */
706 .long .Lrcls_retuint8 /* FFI_TYPE_UINT8 */
707 .long .Lrcls_retsint8 /* FFI_TYPE_SINT8 */
708 .long .Lrcls_retuint16 /* FFI_TYPE_UINT16 */
709 .long .Lrcls_retsint16 /* FFI_TYPE_SINT16 */
710 .long .Lrcls_retint /* FFI_TYPE_UINT32 */
711 .long .Lrcls_retint /* FFI_TYPE_SINT32 */
712 .long .Lrcls_retllong /* FFI_TYPE_UINT64 */
713 .long .Lrcls_retllong /* FFI_TYPE_SINT64 */
714 .long .Lrcls_retstruct /* FFI_TYPE_STRUCT */
715 .long .Lrcls_retint /* FFI_TYPE_POINTER */
716 .long .Lrcls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
717 .long .Lrcls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
718 .long .Lrcls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
726 /* Sign/zero extend as appropriate. */
728 movsbl -24(%ebp), %eax
732 movswl -24(%ebp), %eax
736 movzbl -24(%ebp), %eax
740 movzwl -24(%ebp), %eax
765 movsbl -24(%ebp), %eax
769 movswl -24(%ebp), %eax
785 .ffi_closure_raw_SYSV_end:
788 #endif /* !FFI_NO_RAW_API */
790 # This assumes we are using gas.
792 .globl _ffi_closure_STDCALL
794 .def _ffi_closure_STDCALL; .scl 2; .type 32; .endef
796 _ffi_closure_STDCALL:
804 movl %edx, -12(%ebp) /* resp */
805 leal 12(%ebp), %edx /* account for stub return address on stack */
806 movl %edx, 4(%esp) /* args */
808 movl %edx, (%esp) /* &resp */
809 call _ffi_closure_SYSV_inner
813 # Do not insert anything here between the call and the jump table.
815 .long .Lscls_noretval /* FFI_TYPE_VOID */
816 .long .Lscls_retint /* FFI_TYPE_INT */
817 .long .Lscls_retfloat /* FFI_TYPE_FLOAT */
818 .long .Lscls_retdouble /* FFI_TYPE_DOUBLE */
819 .long .Lscls_retldouble /* FFI_TYPE_LONGDOUBLE */
820 .long .Lscls_retuint8 /* FFI_TYPE_UINT8 */
821 .long .Lscls_retsint8 /* FFI_TYPE_SINT8 */
822 .long .Lscls_retuint16 /* FFI_TYPE_UINT16 */
823 .long .Lscls_retsint16 /* FFI_TYPE_SINT16 */
824 .long .Lscls_retint /* FFI_TYPE_UINT32 */
825 .long .Lscls_retint /* FFI_TYPE_SINT32 */
826 .long .Lscls_retllong /* FFI_TYPE_UINT64 */
827 .long .Lscls_retllong /* FFI_TYPE_SINT64 */
828 .long .Lscls_retstruct /* FFI_TYPE_STRUCT */
829 .long .Lscls_retint /* FFI_TYPE_POINTER */
830 .long .Lscls_retstruct1 /* FFI_TYPE_SMALL_STRUCT_1B */
831 .long .Lscls_retstruct2 /* FFI_TYPE_SMALL_STRUCT_2B */
832 .long .Lscls_retstruct4 /* FFI_TYPE_SMALL_STRUCT_4B */
840 /* Sign/zero extend as appropriate. */
898 .ffi_closure_STDCALL_end:
902 .section .eh_frame,"w"
906 .long .LECIE1-.LASCIE1 /* Length of Common Information Entry */
908 .long 0x0 /* CIE Identifier Tag */
909 .byte 0x1 /* CIE Version */
911 .ascii "zR\0" /* CIE Augmentation */
913 .ascii "\0" /* CIE Augmentation */
915 .byte 0x1 /* .uleb128 0x1; CIE Code Alignment Factor */
916 .byte 0x7c /* .sleb128 -4; CIE Data Alignment Factor */
917 .byte 0x8 /* CIE RA Column */
919 .byte 0x1 /* .uleb128 0x1; Augmentation size */
920 .byte 0x1b /* FDE Encoding (pcrel sdata4) */
922 .byte 0xc /* DW_CFA_def_cfa CFA = r4 + 4 = 4(%esp) */
923 .byte 0x4 /* .uleb128 0x4 */
924 .byte 0x4 /* .uleb128 0x4 */
925 .byte 0x88 /* DW_CFA_offset, column 0x8 %eip at CFA + 1 * -4 */
926 .byte 0x1 /* .uleb128 0x1 */
931 .long .LEFDE1-.LASFDE1 /* FDE Length */
933 .long .LASFDE1-.Lframe1 /* FDE CIE offset */
934 #if defined __PIC__ && defined HAVE_AS_X86_PCREL
935 .long .LFB1-. /* FDE initial location */
939 .long .LFE1-.LFB1 /* FDE address range */
941 .byte 0x0 /* .uleb128 0x0; Augmentation size */
943 /* DW_CFA_xxx CFI instructions go here. */
945 .byte 0x4 /* DW_CFA_advance_loc4 */
947 .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
948 .byte 0x8 /* .uleb128 0x8 */
949 .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
950 .byte 0x2 /* .uleb128 0x2 */
952 .byte 0x4 /* DW_CFA_advance_loc4 */
954 .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
955 .byte 0x5 /* .uleb128 0x5 */
957 /* End of DW_CFA_xxx CFI instructions. */
963 .long .LEFDE3-.LASFDE3 /* FDE Length */
965 .long .LASFDE3-.Lframe1 /* FDE CIE offset */
966 #if defined __PIC__ && defined HAVE_AS_X86_PCREL
967 .long .LFB3-. /* FDE initial location */
971 .long .LFE3-.LFB3 /* FDE address range */
973 .byte 0x0 /* .uleb128 0x0; Augmentation size */
975 /* DW_CFA_xxx CFI instructions go here. */
977 .byte 0x4 /* DW_CFA_advance_loc4 */
979 .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
980 .byte 0x8 /* .uleb128 0x8 */
981 .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
982 .byte 0x2 /* .uleb128 0x2 */
984 .byte 0x4 /* DW_CFA_advance_loc4 */
986 .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
987 .byte 0x5 /* .uleb128 0x5 */
989 /* End of DW_CFA_xxx CFI instructions. */
996 .long .LEFDE4-.LASFDE4 /* FDE Length */
998 .long .LASFDE4-.Lframe1 /* FDE CIE offset */
999 #if defined __PIC__ && defined HAVE_AS_X86_PCREL
1000 .long .LFB4-. /* FDE initial location */
1004 .long .LFE4-.LFB4 /* FDE address range */
1006 .byte 0x0 /* .uleb128 0x0; Augmentation size */
1008 /* DW_CFA_xxx CFI instructions go here. */
1010 .byte 0x4 /* DW_CFA_advance_loc4 */
1012 .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
1013 .byte 0x8 /* .uleb128 0x8 */
1014 .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
1015 .byte 0x2 /* .uleb128 0x2 */
1017 .byte 0x4 /* DW_CFA_advance_loc4 */
1019 .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
1020 .byte 0x5 /* .uleb128 0x5 */
1022 .byte 0x4 /* DW_CFA_advance_loc4 */
1024 .byte 0x86 /* DW_CFA_offset, column 0x6 %esi at CFA + 3 * -4 */
1025 .byte 0x3 /* .uleb128 0x3 */
1027 /* End of DW_CFA_xxx CFI instructions. */
1031 #endif /* !FFI_NO_RAW_API */
1034 .long .LEFDE5-.LASFDE5 /* FDE Length */
1036 .long .LASFDE5-.Lframe1 /* FDE CIE offset */
1037 #if defined __PIC__ && defined HAVE_AS_X86_PCREL
1038 .long .LFB5-. /* FDE initial location */
1042 .long .LFE5-.LFB5 /* FDE address range */
1044 .byte 0x0 /* .uleb128 0x0; Augmentation size */
1046 /* DW_CFA_xxx CFI instructions go here. */
1048 .byte 0x4 /* DW_CFA_advance_loc4 */
1050 .byte 0xe /* DW_CFA_def_cfa_offset CFA = r4 + 8 = 8(%esp) */
1051 .byte 0x8 /* .uleb128 0x8 */
1052 .byte 0x85 /* DW_CFA_offset, column 0x5 %ebp at CFA + 2 * -4 */
1053 .byte 0x2 /* .uleb128 0x2 */
1055 .byte 0x4 /* DW_CFA_advance_loc4 */
1056 .long .LCFI10-.LCFI9
1057 .byte 0xd /* DW_CFA_def_cfa_register CFA = r5 = %ebp */
1058 .byte 0x5 /* .uleb128 0x5 */
1060 /* End of DW_CFA_xxx CFI instructions. */
1064 #endif /* !_MSC_VER */